2016-10-07 4 views
0

간단한 응용 프로그램을 실행하고 Window의 PSAPI를 사용하여 메모리 내의 특정 오프셋을 읽으려고합니다.
디버거를 실행할 때 메모리 주소의 실제 값과 내 ".exe"진입 점에 대한 상대 값을 얻습니다.
아직 다음 코드를 실행할 때 내 오프셋과 함께 진입 점으로 얻는 기본 모듈이 다른 주소를 생성합니다 (잘못되었거나 몇 개의 (hexa) demical 점에 의해). 무엇이 문제일까요?EnumProcessModules를 사용하는 Windows 프로그램 진입 점은 예기치 않은 값을 반환합니다.

ReadMemory는

HWND WINDOW_HANDLE; HANDLE PROC_HANDLE; DWORD PROC_ID; DWORD address; SIZE_T bytesRead; int InitReadMemory(const char* windowClass,const char* caption, DWORD addressOffset) { DWORD cbNeeded; DWORD dwdResult; HMODULE mainModule; BOOL enumResult; //Get the window handle WINDOW_HANDLE = FindWindow(windowClass, NULL); if(WINDOW_HANDLE == NULL) { //Window was not foud return 10; } //Get the process ID dwdResult = GetWindowThreadProcessId(WINDOW_HANDLE, &PROC_ID); if(dwdResult==0) { //Getting Process ID failed return 20; } //Open the process PROC_HANDLE = OpenProcess(PROCESS_ALL_ACCESS, false, PROC_ID); if(PROC_HANDLE==NULL) { //Process failed to open return 30; } /* *Get the Main Module- *first entry in the returned HMODULE array from *EnumProcessModules */ enumResult = EnumProcessModules(PROC_HANDLE, &mainModule, sizeof(HMODULE), &cbNeeded); if(enumResult != 0) { //Failed enumerating process modules return 40; } //offset the requested memory address from the application's base address address = (DWORD)((UINT_PTR)mainModule + addressOffset); #ifdef DEBUG using namespace std; char filenameBuffer[64]=""; string number; stringstream stristream; stristream << address; stristream >> number; cout << number << "\r\n" << endl; GetModuleFileNameEx(PROC_HANDLE, mainModule , filenameBuffer, 256); cout << (byte)ReadMemory<byte>() << "\r\n" << number << "\r\n" << filenameBuffer << endl; system("PAUSE"); #endif return 1;} 

사전 :

P.S.에 감사 ReadProcessMemory에 대한 템플릿입니다 나는 대부분은 단지 바하 둠 tsss ... 포인터를 찾고 있어요

업데이트 :이 완료된 후가 은 분명히을 GetLastError 값을 확인, EnumProcessModules가 299 오류 코드를 표시합니다. 디버깅은 mainModule에 아무것도 저장하지 않는다는 것을 보여줍니다.하지만 EnumProcessModules는 "no errors"와 마찬가지로 0을 반환합니다.

어제 나는 그것을 얻을 수 있었고 GetModuleFileName이 propery (동일한 코드, GetLastError 만 추가 함)로 작동하도록했습니다.

답변

0

분명히, 내 문제는 내가 제로가 아닌 결과가 조각

enumResult = EnumProcessModules(PROC_HANDLE, &mainModule, sizeof(HMODULE), &cbNeeded) 
if(enumResult != 0) 
{ 
    //Failed enumerating process modules 
    return 40; 
} 

및 EnumProcessModules의 성공적인 실행과 테스트를 산출하고 있던 것이 었습니다! (따라서 나는 약간의 혼란을 야기하고 내 모든 디버깅 프로세스를 잘못했다.)이 세부 사항을 알게 된 후에 나는 오래된 테스트를 다시 실행하여 32 비트 애플리케이션을 실행하는 동안 내 대상 프로세스가 64 비트임을 알게되었다. 이 64 비트로 변경되었으며 이제는 매력처럼 작동합니다.