Как получить точку входа в функцию в PE-файле
Если у меня есть exampleA.exe
процесс, и я использую FindEntryPointAddress()
функция, чтобы получить main()
точка входа exampleB.exe
процесс
FindEntryPointAddress()
является функцией exampleA.exe
DWORD FindEntryPointAddress( TCHAR *exeFile )
{
BY_HANDLE_FILE_INFORMATION bhfi;
HANDLE hMapping;
char *lpBase;
HANDLE hFile = CreateFile(exeFile, GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
;
if (!GetFileInformationByHandle(hFile, &bhfi))
;
hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, bhfi.nFileSizeHigh, bhfi.nFileSizeLow, NULL);
if (!hMapping)
;
lpBase = (char *)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, bhfi.nFileSizeLow);
if (!lpBase)
;
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)lpBase;
if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE) // 0x00004550(IMAGE_NT_SIGNATURE)
;
PIMAGE_NT_HEADERS32 ntHeader = (PIMAGE_NT_HEADERS32)(lpBase + dosHeader->e_lfanew);
if (ntHeader->Signature != IMAGE_NT_SIGNATURE)
;
DWORD pEntryPoint = ntHeader->OptionalHeader.ImageBase + ntHeader->OptionalHeader.AddressOfEntryPoint;
UnmapViewOfFile((LPCVOID)lpBase);
CloseHandle(hMapping);
CloseHandle(hFile);
printf( "test.exe entry point: %p\n", pEntryPoint );
return pEntryPoint;
} // FindEntryPointAddress()
Знайте, у меня есть вопрос, как я могу редактировать FindEntryPointAddress()
чтобы получить func()
точка входа exampleB.exe
exampleB.exe
void func()
{
char str[10];
strcpy( str, "iambuffer\n" );
printf( "%s", str );
} // func()
int main()
{
func();
return 0;
} // main()
большое спасибо
2 ответа
Если функция не экспортируется (см., Например, __declspec(dllexport)
) не повезло тебе. Без записи в таблице экспорта невозможно получить адрес функции, отличной от точки входа.
Более того, даже если вы найдете какие-либо данные, относящиеся к функции в другом месте (например, в символах отладки), вы все равно не сможете получить адрес, так как вполне возможно, что функция была встроена везде или была удалена по какой-либо другой причине и ее связанных данных не было. На экспортируемые функции это не влияет, так как компилятор и компоновщик достаточно осторожны, чтобы всегда их излучать.
Если вы хотите сделать заказ GetProcAddress
посмотрите здесь, однако, если у вас нет pdb или символ функции находится в EAT (таблица адресов экспорта), вы не сможете его найти.