Пример #1
0
LPVOID  WINAPI GetModuleEntryPoint(
    LPVOID    lpFile)
{
    PIMAGE_OPTIONAL_HEADER   poh;
    poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET (lpFile);
    return poh == NULL ? NULL :(LPVOID)poh->AddressOfEntryPoint;
}
Пример #2
0
DWORD 
PeGetCodeSectionSize( 
	IN PVOID BaseAddress
	)
{
	PIMAGE_OPTIONAL_HEADER64	pOptionalHeader;

	pOptionalHeader = (PIMAGE_OPTIONAL_HEADER64) OPTHDROFFSET(BaseAddress);
	return pOptionalHeader->SizeOfCode;
}
Пример #3
0
/* 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);
}
Пример #4
0
// -------------------------------------------------------------
// プロセス生成を行うメイン関数
//   引数: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;
}