#c
Вопрос:
привет, у меня есть вопрос
У меня есть программа на C , которая отображает «привет, мир».
Я преобразовал это в байты, а затем поместил в файл заголовка в своей основной программе. Как мне нужно передать свою программу в память?
Мой код:
#include lt;windows.hgt; #include lt;vectorgt; #include "Bytes.h" std::vectorlt;unsigned chargt; data{ //my bytes }; void main() { void* pe = data.data(); IMAGE_DOS_HEADER* DOSHeader; IMAGE_NT_HEADERS64* NtHeader; IMAGE_SECTION_HEADER* SectionHeader; PROCESS_INFORMATION PI; STARTUPINFOA SI; ZeroMemory(amp;PI, sizeof(PI)); ZeroMemory(amp;SI, sizeof(SI)); void* pImageBase; char currentFilePath[1024]; DOSHeader = PIMAGE_DOS_HEADER(pe); NtHeader = PIMAGE_NT_HEADERS64(DWORD64(pe) DOSHeader-gt;e_lfanew); if (NtHeader-gt;Signature == IMAGE_NT_SIGNATURE) { GetModuleFileNameA(NULL, currentFilePath, MAX_PATH); if (CreateProcessA(currentFilePath, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, amp;SI, amp;PI)) { CONTEXT* CTX; CTX = LPCONTEXT(VirtualAlloc(NULL, sizeof(CTX), MEM_COMMIT, PAGE_READWRITE)); CTX-gt;ContextFlags = CONTEXT_FULL; UINT64 imageBase = 0; if (GetThreadContext(PI.hThread, LPCONTEXT(CTX))) { pImageBase = VirtualAllocEx( PI.hProcess, LPVOID(NtHeader-gt;OptionalHeader.ImageBase), NtHeader-gt;OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE ); WriteProcessMemory(PI.hProcess, pImageBase, pe, NtHeader-gt;OptionalHeader.SizeOfHeaders, NULL); for (size_t i = 0; i lt; NtHeader-gt;FileHeader.NumberOfSections; i ) { SectionHeader = PIMAGE_SECTION_HEADER(DWORD64(pe) DOSHeader-gt;e_lfanew 264 (i * 40)); WriteProcessMemory( PI.hProcess, LPVOID(DWORD64(pImageBase) SectionHeader-gt;VirtualAddress), LPVOID(DWORD64(pe) SectionHeader-gt;PointerToRawData), SectionHeader-gt;SizeOfRawData, NULL ); WriteProcessMemory( PI.hProcess, LPVOID(CTX-gt;Rdx 0x10), LPVOID(amp;NtHeader-gt;OptionalHeader.ImageBase), 8, NULL ); } CTX-gt;Rcx = DWORD64(pImageBase) NtHeader-gt;OptionalHeader.AddressOfEntryPoint; SetThreadContext(PI.hThread, LPCONTEXT(CTX)); ResumeThread(PI.hThread); WaitForSingleObject(PI.hProcess, NULL); } } }
}
Это то, что у меня есть сейчас, но это дает мне ошибку, говоря :
Возникло исключение: нарушение доступа для чтения. Досье было nullptr.