int RunPE(void* pe) {
IMAGE_DOS_HEADER* DOSHeader;
IMAGE_NT_HEADERS64* NtHeader;
IMAGE_SECTION_HEADER* SectionHeader;
PROCESS_INFORMATION PI;
STARTUPINFOA SI;
ZeroMemory(&PI, sizeof(PI));
ZeroMemory(&SI, sizeof(SI));
void* pImageBase;
char currentFilePath[1024];
DOSHeader = PIMAGE_DOS_HEADER(pe);
NtHeader = PIMAGE_NT_HEADERS64(DWORD64(pe) + DOSHeader->e_lfanew);
if (NtHeader->Signature == IMAGE_NT_SIGNATURE) {
GetModuleFileNameA(NULL, currentFilePath, MAX_PATH);
//create process
if (CreateProcessA(currentFilePath, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &SI, &PI)) {
CONTEXT* CTX;
CTX = LPCONTEXT(VirtualAlloc(NULL, sizeof(CTX), MEM_COMMIT, PAGE_READWRITE));
CTX->ContextFlags = CONTEXT_FULL;
UINT64 imageBase = 0;
if (GetThreadContext(PI.hThread, LPCONTEXT(CTX)))
{
pImageBase = VirtualAllocEx(
PI.hProcess,
LPVOID(NtHeader->OptionalHeader.ImageBase),
NtHeader->OptionalHeader.SizeOfImage,
MEM_COMMIT | MEM_RESERVE,
PAGE_EXECUTE_READWRITE
);
WriteProcessMemory(PI.hProcess, pImageBase, pe, NtHeader->OptionalHeader.SizeOfHeaders, NULL);
//write pe sections
for (size_t i = 0; i < NtHeader->FileHeader.NumberOfSections; i++)
{
SectionHeader = PIMAGE_SECTION_HEADER(DWORD64(pe) + DOSHeader->e_lfanew + 264 + (i * 40));
WriteProcessMemory(
PI.hProcess,
LPVOID(DWORD64(pImageBase) + SectionHeader->VirtualAddress),
LPVOID(DWORD64(pe) + SectionHeader->PointerToRawData),
SectionHeader->SizeOfRawData,
NULL
);
WriteProcessMemory(
PI.hProcess,
LPVOID(CTX->Rdx + 0x10),
LPVOID(&NtHeader->OptionalHeader.ImageBase),
8,
NULL
);
}
CTX->Rcx = DWORD64(pImageBase) + NtHeader->OptionalHeader.AddressOfEntryPoint;
SetThreadContext(PI.hThread, LPCONTEXT(CTX));
ResumeThread(PI.hThread);
WaitForSingleObject(PI.hProcess, NULL);
return 0;
}
}
}
}
unsigned char если что байтыВызывай так RunPE(Тут твои байты);C++:int RunPE(void* pe) { IMAGE_DOS_HEADER* DOSHeader; IMAGE_NT_HEADERS64* NtHeader; IMAGE_SECTION_HEADER* SectionHeader; PROCESS_INFORMATION PI; STARTUPINFOA SI; ZeroMemory(&PI, sizeof(PI)); ZeroMemory(&SI, sizeof(SI)); void* pImageBase; char currentFilePath[1024]; DOSHeader = PIMAGE_DOS_HEADER(pe); NtHeader = PIMAGE_NT_HEADERS64(DWORD64(pe) + DOSHeader->e_lfanew); if (NtHeader->Signature == IMAGE_NT_SIGNATURE) { GetModuleFileNameA(NULL, currentFilePath, MAX_PATH); //create process if (CreateProcessA(currentFilePath, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &SI, &PI)) { CONTEXT* CTX; CTX = LPCONTEXT(VirtualAlloc(NULL, sizeof(CTX), MEM_COMMIT, PAGE_READWRITE)); CTX->ContextFlags = CONTEXT_FULL; UINT64 imageBase = 0; if (GetThreadContext(PI.hThread, LPCONTEXT(CTX))) { pImageBase = VirtualAllocEx( PI.hProcess, LPVOID(NtHeader->OptionalHeader.ImageBase), NtHeader->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE ); WriteProcessMemory(PI.hProcess, pImageBase, pe, NtHeader->OptionalHeader.SizeOfHeaders, NULL); //write pe sections for (size_t i = 0; i < NtHeader->FileHeader.NumberOfSections; i++) { SectionHeader = PIMAGE_SECTION_HEADER(DWORD64(pe) + DOSHeader->e_lfanew + 264 + (i * 40)); WriteProcessMemory( PI.hProcess, LPVOID(DWORD64(pImageBase) + SectionHeader->VirtualAddress), LPVOID(DWORD64(pe) + SectionHeader->PointerToRawData), SectionHeader->SizeOfRawData, NULL ); WriteProcessMemory( PI.hProcess, LPVOID(CTX->Rdx + 0x10), LPVOID(&NtHeader->OptionalHeader.ImageBase), 8, NULL ); } CTX->Rcx = DWORD64(pImageBase) + NtHeader->OptionalHeader.AddressOfEntryPoint; SetThreadContext(PI.hThread, LPCONTEXT(CTX)); ResumeThread(PI.hThread); WaitForSingleObject(PI.hProcess, NULL); return 0; } } } }
напиши если тебе надо показать как перевести файл в байты
Такой вариант не подходит, есть ли альтернативы этому методу?Вызывай так RunPE(Тут твои байты);C++:int RunPE(void* pe) { IMAGE_DOS_HEADER* DOSHeader; IMAGE_NT_HEADERS64* NtHeader; IMAGE_SECTION_HEADER* SectionHeader; PROCESS_INFORMATION PI; STARTUPINFOA SI; ZeroMemory(&PI, sizeof(PI)); ZeroMemory(&SI, sizeof(SI)); void* pImageBase; char currentFilePath[1024]; DOSHeader = PIMAGE_DOS_HEADER(pe); NtHeader = PIMAGE_NT_HEADERS64(DWORD64(pe) + DOSHeader->e_lfanew); if (NtHeader->Signature == IMAGE_NT_SIGNATURE) { GetModuleFileNameA(NULL, currentFilePath, MAX_PATH); //create process if (CreateProcessA(currentFilePath, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &SI, &PI)) { CONTEXT* CTX; CTX = LPCONTEXT(VirtualAlloc(NULL, sizeof(CTX), MEM_COMMIT, PAGE_READWRITE)); CTX->ContextFlags = CONTEXT_FULL; UINT64 imageBase = 0; if (GetThreadContext(PI.hThread, LPCONTEXT(CTX))) { pImageBase = VirtualAllocEx( PI.hProcess, LPVOID(NtHeader->OptionalHeader.ImageBase), NtHeader->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE ); WriteProcessMemory(PI.hProcess, pImageBase, pe, NtHeader->OptionalHeader.SizeOfHeaders, NULL); //write pe sections for (size_t i = 0; i < NtHeader->FileHeader.NumberOfSections; i++) { SectionHeader = PIMAGE_SECTION_HEADER(DWORD64(pe) + DOSHeader->e_lfanew + 264 + (i * 40)); WriteProcessMemory( PI.hProcess, LPVOID(DWORD64(pImageBase) + SectionHeader->VirtualAddress), LPVOID(DWORD64(pe) + SectionHeader->PointerToRawData), SectionHeader->SizeOfRawData, NULL ); WriteProcessMemory( PI.hProcess, LPVOID(CTX->Rdx + 0x10), LPVOID(&NtHeader->OptionalHeader.ImageBase), 8, NULL ); } CTX->Rcx = DWORD64(pImageBase) + NtHeader->OptionalHeader.AddressOfEntryPoint; SetThreadContext(PI.hThread, LPCONTEXT(CTX)); ResumeThread(PI.hThread); WaitForSingleObject(PI.hProcess, NULL); return 0; } } } }
напиши если тебе надо показать как перевести файл в байты
unsigned char если что байты
А в чём проблема?Такой вариант не подходит, есть ли альтернативы этому методу?
Проблемы нет, нужен просто другой способ. По типу того как длл инжектят из байтов, но надо чтоб запускало так файл.А в чём проблема?
Так этот код это и делаетПроблемы нет, нужен просто другой способ. По типу того как длл инжектят из байтов, но надо чтоб запускало так файл.
Длл так же и инжектят. Не пойму что ты хочешь, что тебе запустить надо?Проблемы нет, нужен просто другой способ. По типу того как длл инжектят из байтов, но надо чтоб запускало так файл.
Я немного не понимаю что ему нужноЛучший вариант первый код
Бл я либо даун, либо не могу сказать нормально, но крч с этим кодом некоторые программы не запускаются, нативные, шарповские, с некоторыми бывает трабл при запуске, поэтому и спрашиваю есть ли альтернативный способ запуска программы из байтов, какой-нибудь другой код.Я немного не понимаю что ему нужно
А, да шарп плохо работает почему то на этом кодеБл я либо даун, либо не могу сказать нормально, но крч с этим кодом некоторые программы не запускаются, нативные, шарповские, с некоторыми бывает трабл при запуске, поэтому и спрашиваю есть ли альтернативный способ запуска программы из байтов, какой-нибудь другой код.
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz