LPVOID WINAPI GetModuleEntryPoint( LPVOID lpFile) { PIMAGE_OPTIONAL_HEADER poh; poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET (lpFile); return poh == NULL ? NULL :(LPVOID)poh->AddressOfEntryPoint; }
DWORD PeGetCodeSectionSize( IN PVOID BaseAddress ) { PIMAGE_OPTIONAL_HEADER64 pOptionalHeader; pOptionalHeader = (PIMAGE_OPTIONAL_HEADER64) OPTHDROFFSET(BaseAddress); return pOptionalHeader->SizeOfCode; }
/* WTF _WIN64 is not defined!!!! */ PVOID PeGetCodeSectionAddress( IN PVOID BaseAddress ) { PIMAGE_OPTIONAL_HEADER64 pOptionalHeader; pOptionalHeader = (PIMAGE_OPTIONAL_HEADER64) OPTHDROFFSET(BaseAddress); return (PVOID)(pOptionalHeader->BaseOfCode + (ULONG_PTR)BaseAddress); }
// ------------------------------------------------------------- // プロセス生成を行うメイン関数 // 引数:pPEFileImage (ファイルデータのポインタ) // dwFileImageSize(ファイルデータのサイズ) // szTargetProc (ターゲットプロセスパス) // 戻り値:成功時0、失敗時0以外 // ------------------------------------------------------------- int CreateExeProcess(LPVOID pPEFileImage, DWORD dwFileImageSize, PTCHAR szTargetProc) { // それぞれのヘッダポインタ取得 PE_HEADERS pe; pe.dsh = (PIMAGE_DOS_HEADER)pPEFileImage; pe.pfh = (PIMAGE_FILE_HEADER)PEFHDROFFSET(pPEFileImage); pe.poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(pPEFileImage); pe.psh = (PIMAGE_SECTION_HEADER)SECHDROFFSET(pPEFileImage); // MZ判定 if(pe.dsh->e_magic != IMAGE_DOS_SIGNATURE) return -1; // PE判定 if(*(DWORD *)NTSIGNATURE(pPEFileImage) != IMAGE_NT_SIGNATURE) return -1; // 実行ファイル判定 if(pe.poh->Magic != 0x010B) return -1; // メモリイメージサイズを取得 DWORD dwMemImageSize = TotalNewImageSize(&pe); // メモリイメージをロード(メモリ確保) LPVOID pMemImage = LoadPEImage( &pe, pPEFileImage, dwMemImageSize); if(pMemImage == NULL) return -1; // プロセスを起動 if(ExecPEImage(&pe, pMemImage, dwMemImageSize, szTargetProc)) return -1; // メモリイメージを開放(メモリ開放) FreePEImage(pMemImage, dwMemImageSize); return 0; }