2012-05-27 4 views
-2

"서명"으로 함수를 검색하려고합니다.함수를 서명으로 검색 할 때 주소 범위를 아는 방법은 무엇입니까?

그러나 검색 할 주소 범위를 알 수는 없습니까?

VirtualQuery() 및 GetNativeSystemInfo()를 살펴 봤지만 제대로 된 경로에 있지 않습니까?

편집 : 질문 재 시도. .

나는 내 코드에서 실행되는 프로세스의 실행 페이지의 시작과 끝 주소를 얻는 방법을 알아 내기 위해 노력하고있어 Win32 API를 사용

이것은 내가 무엇을 시도했다입니다 :

 SYSTEM_INFO info; 
    ZeroMemory(&info, sizeof(SYSTEM_INFO)); 
    GetNativeSystemInfo(&info); // GetSystemInfo() might be wrong on WOW64. 

    info.lpMinimumApplicationAddress; 
    info.lpMaximumApplicationAddress; 

    HANDLE thisProcess = GetCurrentProcess(); 

    MEMORY_BASIC_INFORMATION memInfo; 
    ZeroMemory(&memInfo, sizeof(memInfo) ); 
    DWORD addr = (DWORD)info.lpMinimumApplicationAddress; 
    do 
    { 
     if (VirtualQueryEx(thisProcess, (LPVOID)addr, &memInfo, sizeof(memInfo)) == 0) 
     { 
      DWORD gle = GetLastError(); 
      if (gle != ERROR_INVALID_PARAMETER) 
      { 
       std::stringstream str; 
       str << "VirtualQueryEx failed with: " << gle; 
       MessageBoxA(NULL, str.str().c_str(), "Error", MB_OK); 
      } 
      break; 
     } 

     if (memInfo.Type == MEM_IMAGE ) 
     { 
      // TODO: Scan this memory block for the the sigature 
     } 

     addr += info.dwPageSize; 
    } 
    while (addr < (DWORD)info.lpMaximumApplicationAddress); 
여기에 질문으로이 작업을 수행하는 이유는 나는 그것의 서명에 의해 내 보내지 않은 기능을 찾고 있는지

:

Find a function by it signature in Windows DLL

"코드 서명 검색"에 대한 답변보기.

주소 범위를 열거하고 있지만 예상 범위가 무엇인지 알지 못하기 때문에 이것이 올바른지 아닌지 알 수 없습니다. MSDN을 둘러 보면서 나올 수있는 최고의 제품입니다.

+3

질문이 잘 작성되지 않았습니다. 그것의 일부가 추론 될 수 있습니다 (즉, 어떤 종류의 Windows에 대해 말하고있는 것입니다). 그러나 확실히 더 잘할 수 있습니다. 예를 들어, 서명이란 정확히 무엇을 의미합니까? –

+1

1) 정확히 무엇을하려고하는지, 2) 어떤 플랫폼을 사용하고 있는지, 3) 사용하고있는 도구/절차 4) "작동하지 않는 것"의 예 – paulsm4

답변

2

모듈을 서명 검사 할 때의 주소 범위는 코드 섹션의 시작부터 시작 + 섹션 크기까지입니다. 코드 섹션의 시작과 크기는 PE에 있습니다. 대부분의 도구는 게으른 경로를 사용하고 전체 모듈을 검사합니다 (다시 PE를 사용하여 크기를 얻지 만 시작 주소로 모듈 핸들을 사용합니다).

+0

I 이것이 내가 원하는 것 같아요, 그래서 어떻게 든 Win32 API를 사용하여 PE 헤더를 읽을 수있는 코드 섹션 시작 주소와 크기를 얻을 수 있습니까? 예를 들어 바이너리가 UPX로 압축되었거나 어떤 방식으로 보호 된 경우 어떻게됩니까? PE 헤더를 읽는 것이 여전히 신뢰할 수 있습니까? PE 헤더를 읽는 코드는 상기 바이너리 내의 DLL에서 실행 중이다. – paulm

+0

@paulm :'windows.h'에서'ImageNtHeader' (베이스로'HMODULE' 사용)를 통해 PE를 얻을 수 있고,'IMAGE_SECTION_HEADER' 엔트리를 필요한 섹션에 spelunk 할 수 있습니다. PE가 수정되지 않은 채로 남아 있거나 수정 된 EP 만 수정 된 경우 (ofc를 스캔하기 전에 암호 해독을 코드화해야 함) 이는 패커에 따라 다릅니다. – Necrolis

+0

필자는 실제로 내가 알고 있던 것을 "기본 주소"와 "이미지 크기"라고 생각했습니다. 내가 사용하여 해당 정보를 얻을 수 있었다 : \t \t HINSTANCE 인스턴스 = GetModuleHandle 함수 (NULL을); \t \t MODULEINFO modInfo; \t \t ZeroMemory (& modInfo, sizeof (modInfo)); \t \t GetModuleInformation (GetCurrentProcess(), instance, & modInfo, sizeof (modInfo))); 답변을 수락 한 것으로 표시하겠습니다. – paulm

관련 문제