2012-01-10 5 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라는 것은 없습니다.

#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; 
} 

아니면을 보려면 각 함수의 시작에 breakpointsgdb를 사용하여 설정할 수 있습니다 : 당신은 함수가 호출 될 때 실행의 흐름을 이해하고 싶은 경우에, 다음과 같은 몇 가지 printf() 문을 넣을 수 있습니다 실행의 흐름! gdbbreakpoints를 사용

0

Sangeeth Saravanaraj에 의해 제안은 실제로 가장 좋은 방법입니다,하지만 당신은 런타임 솔루션에 의도이고 당신이하고 싶은 지속적으로 모든 함수에서 같은 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

관련 문제