2012-01-11 4 views
3

自分のプロセス内から子プロセスを作成しました。子プロセスを中止します。CreateProcess()私は子プロセスのメモリに主要なエントリポイントを得ることができますが、子プロセスの関数エントリポイントをどのように取得する必要がありますか?メモリエントリポイントを取得する機能はありますか?

は、これは私が子プロセス

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) 
    ; 

    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() 

のメインエントリポイントを取得し、どのように私は、子プロセスの機能foo()エントリポイントを取得する必要がありますどのようにでしょうか?この

void foo() 
{ 
    char str[10]; 
    strcpy(str, "buffer\n"); 
} // foo() 

int main() 
{ 
    foo(); 
    return 0; 
} // main() 
+0

これは、コンテンツの子プロセスであれば、foo関数はEXE内にエントリポイントを持たず、コンパイラはインライン化します。 –

答えて

1

よう

子プロセスが一つが聞いても - 何のために?子プロセスを実行する場合は、CreateProcess()がそれを行います。任意の関数からプロセスを実行すると意味がなくなります。 RTLは初期化されないので、プロセスはクラッシュする可能性が非常に高いです。

作成者プロセスの機能を呼び出すには、LoadLibrary()/ GetProcAddress()を使用します。 CreateProcess()は全く別のものです。

個々の機能に関してデバッグする場合は、MAPファイルやデバッグシンボルを解析することが必要です。関数がグローバルでエクスポートされている場合は、PEエクスポートテーブルを解析すると役立ちます。

また、現代のコンパイラでは、コンパイル時関数がEXEファイルに1つの明確なエントリポイントを持たない場合があります。インライン展開とそのすべて。

+0

私の目的は、子プロセスのソースコードを持たず、.exeファイルを取得しただけの場合、子プロセスの関数エントリポイントを取得できますか? – johnnys0318

+0

エントリーポイント(アドレス)を取得したら、それで何をするつもりですか?ソースがない場合は、関数の存在についてもどうやって知っていますか? –

0

私はずっと前と同じようなことをしていましたが、これは覚えていないので、これはオフになる可能性があります。しかし、十分なシンボル情報があれば、SymFromNameから関数アドレスを得ることができると思います。またはエクスポートした場合は、GetProcAddressで直接アドレスを取得してください。

エントリポイントにパッチを適用するには、エントリポイントでPEヘッダーを使用して静的パッチを適用するか、実行後にプロセスを中断してEIPをSetThreadContextに変更します。

+0

私の目的は、子プロセスのソースコードを持っていない場合、子プロセスの関数エントリポイントを取得できますか? – johnnys0318

+0

私は情報が不足しているため、.exeファイルを取得するだけです – johnnys0318

+0

ソースコードは必要ありません。限られた量の情報を提供する実行可能ファイルにシンボルテーブルが埋め込まれています。そのシンボル情報がない場合でも、他の発見的方法でターゲット関数のアドレスを決定する必要があります。 –

0

子プロセスプログラムの.DEFファイルにEXPORTSを使用すると、 プログラムはIATテーブルを検索してアドレスを検索できます。

また、フレームポインタを設定する命令を見つけるためにコードを検索して、 が可能なエントリポイントを見つけることができます。 しかし、そのアドレスを完全に信じることはできません。

関連する問題