2012-01-10 14 views
0

私のプロセス内でCreateProcess()を使って子プロセスを作成し、子プロセスを中断しました。私は子プロセスのメモリに主要なエントリポイントを得ることができますが、子プロセスの関数エントリポイントをどのように取得する必要がありますか?私は子プロセスのソースコードを持っていないと私は.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) 
    ; 

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

私の目的は私ができることです子プロセスの関数エントリポイントを取得しますか?この

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

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

私はmain'自体は、プログラムのエントリポイントである '、私の知る限りでは、関数のエントリポイントのことを聞いたことがありません。そんなことがあるなら、私は本当に知ってうれしいです! –

+0

'main'と同じソースファイルにない場合は、メインソースファイルと一緒にコンパイルされた別のソースファイルにある可能性があります。それはライブラリにあり、その場合はライブラリを参照する必要があります。 –

+1

'&foo'は、' foo'と同じ意味ですか? –

答えて

2

よう

子プロセス機能のためのentry pointと呼ばれるものは何もありません。あなたは関数が呼び出され、実行の流れを理解したい場合は、次のようにのようないくつかのprintf()文を置くことができます。

#include <stdio.h> 

void foo(void) 
{ 
    printf("Entering %s:%s:%d\n", __FILE__, __func__, __LINE__); 
    return; 
} 

int main(void) 
{ 
    printf("Entering %s:%s:%d\n", __FILE__, __func__, __LINE__); 
    foo(); 
    return 0; 
} 

それともgdbを使用して参照するために、各関数の先頭にbreakpointsを設定することができます実行の流れ! Sangeeth Saravanarajにより示唆されるようにgdbbreakpointsを使用して

0

は実際には最良の方法ですが、あなたは、ランタイムソリューションに熱心だと、すべての機能に継続的に同じprintf文をコピーして貼り付けるための代替をご希望の場合は、したいと思いますあなたは(おそらく危険です)マクロを使用することができます。

#include <stdio.h> 

#define trace_func(_func) printf("Entering %s:%s:%d\n", __FILE__, __func__, __LINE__); _func 

void fooAgain(int myValue) 
{ 
    printf("This is fooAgain, with my value: %d.\n", myValue); 
} 

void foo(void) 
{ 
    printf("Hello, I'm foo.\n"); 
    trace_func(fooAgain(15)); 
} 

int main(int argc, char** argv) 
{ 
    trace_func(foo()); 
    return 0; 
} 

戻り値:

Entering *yourfilepath*/main.c:main:18 
Hello, I'm foo. 
Entering *yourfilepath*/main.c:foo:13 
This is fooAgain, with my value: 15 

あなたはひどい人になると、あなたがこれを行うことができ、あなたがリリースをビルドする場合でも、内のコードを残すことができ(ただし、やりたい場合は、恐ろしい習慣であり、間違っています。私は完了のためにそれを含めます)。

変更にステートメントを定義します。

#define TRACE_FUNCTIONS 

#ifdef TRACE_FUNCTIONS 
    #define trace_func(_func) printf("Entering %s:%s:%d\n", __FILE__, __func__, __LINE__); _func 
#else 
    #define trace_func(_func) _func 
#endif 
+0

申し訳ありません私は明確に説明していませんでした。 私は、プロセスAを持っていると私はAPIを使用している場合は、 'のCreateProcess()' プロセスBを作成し、一時停止し、私はBのメモリ空間からの主な機能のエントリポイントを見つけることができますが、どのように私 は、エントリポイントを見つける必要があります関数foo()の? – johnnys0318

関連する問題