2012-02-14 61 views
2

如果我有exampleA.exe過程,我用FindEntryPointAddress()函數來獲取exampleB.exe過程我怎樣才能在PE函數入口點文件

FindEntryPointAddress()main()切入點是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() 

感謝除非功能大量出口

回答

0

(見例如__declspec(dllexport))你運氣不好。如果在導出表中沒有條目,則無法獲取除入口點以外的其他功能的地址。此外,即使您在其他地方(例如,在調試符號中)找到與該函數有關的某些數據,您仍可能仍無法獲取該地址,因爲可能該函數無處不在或被排除在外其他原因及其相關數據不是。由於編譯器和鏈接器足夠小心以便始終發出它們,導出的函數不受此影響。

0

如果您正在研究定製GetProcAddress,請查看here,但是,除非您有pdb或函數符號位於EAT(導出地址表)中,否則您將無法找到它。