2012-08-16 3 views
0

DLL에서 내 보낸 함수의 서명을 찾고 후킹을위한 정확히 동일한 콜백 함수를 정의하려고합니다.C/C++ - 함수 서명을 얻기 위해 __funcsig__ 매크로를 사용 하시겠습니까?

현재 진행중인 프로젝트가 필요합니다.

다음은 기능 위치를 찾기 위해 수행 한 작업입니다.

HMODULE hModd = LoadLibraryEx("xxx.dll",NULL,DONT_RESOLVE_DLL_REFERENCES); 

dosHeader = ((PIMAGE_DOS_HEADER)hModd); 
    /*if(((PIMAGE_DOS_HEADER)hModd)->e_magic == IMAGE_DOS_SIGNATURE) 
     MessageBoxA(NULL,"wow","exe",MB_OK);/**/ 
    ntHeader = (PIMAGE_NT_HEADERS)((PBYTE)hModd + ((PIMAGE_DOS_HEADER)hModd)->e_lfanew); 
    PIMAGE_EXPORT_DIRECTORY exports = (PIMAGE_EXPORT_DIRECTORY)((BYTE *)hModd + ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); 
    PVOID names = (BYTE *)hModd + exports->AddressOfNames; 
    WORD *pOrds = (WORD*)((BYTE*)hModd + exports->AddressOfNameOrdinals); 
    DWORD* addr = (DWORD*)((BYTE*)hModd + exports->AddressOfFunctions); 
    for (int i = 0; i < exports->NumberOfNames; ++i,addr++) 
     { 
      char funcName[255]; 
      char const *target = "Test"; 
      ZeroMemory(funcName,sizeof(funcName)); 
      //strcpy(funcName,(char*)((BYTE *)hModd + ((DWORD *)names)[i])); 
      if(strcmp((char*)((BYTE *)hModd + ((DWORD *)names)[i]),target)) 
      { 
       printf("Export: %s Address: %X \n", (char*)((BYTE *)hModd + ((DWORD *)names)[i]),*addr); 
       offsetTarget = *addr; 
      } 
     } 

__funcsig__ 매크로를 사용하여 DLL 함수 서명을 얻으려면 어떻게해야합니까?

__funcsig__은 일반적으로 그것을 감싸는 함수의 서명을 반환합니다.

+0

내보내기가 사전 식으로 정렬됨에 따라 이진 검색을 사용하여 특정 이름의 내보내기를 찾을 수 있습니다. 선형 검색이 필요 없습니다. –

답변

1

당신이 말한대로, 이것은 둘러싸는 기능의 서명을 산출합니다. __FUNCSIG__을 사용할 수 없습니다.

임의의 모듈에서 내 보낸 임의 함수의 서명을 얻을 방법이 없습니다. 정보는 단순히 존재하지 않습니다. 함수 유형을 설명하는 추가 메타 데이터 형식이 필요합니다.

+0

ok ... 작업을 완료하기 위해 asm 명령을 추가 할 수 있습니까? – rohank

+0

다릅니다. "일"은 무엇을해야합니까? 대상 함수의 호출 규칙을 식별 할 수 있으면 인수의 위치와 호출에 "중요한"레지스터를 파악할 수 있습니다. –

+0

작품에 의해 반환 유형 및 매개 변수 목록을 찾는 것을 의미합니다 ... – rohank

관련 문제