2011-08-04 7 views
0

일부 기능을 내보내는 DLL이 있고 해당 DLL 내의 주소를 알고 있다고 가정합니다. 수출 테이블을 가정하고 그 주소는 함수 내에서 위치를 참조 경우 다음이 기능 항목으로 분류되면, 수출 테이블에서이 함수의 인덱스 찾아 낼 것입니다 다음특정 주소에서 심볼의 이름/내보내기 색인을 얻는 방법 (GetProcAddress inverse)

IMAGE_DOS_HEADER* dosHeader; 
dosHeader = (IMAGE_DOS_HEADER*)m_handle; 
unsigned int count; 

if(dosHeader->e_magic != IMAGE_DOS_SIGNATURE) 
{return __MODULE_ADDRESS_NOT_FOUND;} 

IMAGE_NT_HEADERS* ntHeaders = (IMAGE_NT_HEADERS*)(((BYTE*)dosHeader) + dosHeader->e_lfanew); 

if(ntHeaders->Signature != 0x00004550) 
    {return __MODULE_ADDRESS_NOT_FOUND;} 

IMAGE_OPTIONAL_HEADER* optionalHeader = &ntHeaders->OptionalHeader; 
if(optionalHeader->NumberOfRvaAndSizes<IMAGE_DIRECTORY_ENTRY_EXPORT) 
    {return __MODULE_ADDRESS_NOT_FOUND;} 

if(optionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size==0) 
    {return __MODULE_ADDRESS_NOT_FOUND;} 

IMAGE_DATA_DIRECTORY* dataDirectory = &optionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; 
IMAGE_EXPORT_DIRECTORY* Exp; 
Exp = (IMAGE_EXPORT_DIRECTORY*)((DWORD)dosHeader + dataDirectory->VirtualAddress); 

ULONG* addressoffunctions=(ULONG*)((BYTE*) m_handle + Exp->AddressOfFunctions); 

if(Exp->NumberOfNames==1) 
{ 
    if(addressoffunctions[0] + (BYTE*)m_handle < address) 
     {return 0;} 
    return __MODULE_ADDRESS_NOT_FOUND; 
    } 

for(count = 1; count < Exp->NumberOfNames; count++) 
    { 
    if(addressoffunctions[count-1] + (BYTE*)m_handle >= address 
    && addressoffunctions[count] + (BYTE*)m_handle < address) 
     {return count-1;} 
    } 

을, 주소가 내 보낸 함수 내의 위치를 ​​실제로 참조한다고 주장하는 방법은 무엇입니까?

답변

0

일반적으로 그렇게 할 수 없습니다. 전체 기능 지침 그래프를 분해하여 모든 지침의 주소를 가져와야합니다.

일부 경우에는 ret 명령어를 검색 할 수 있지만 신뢰할 수는 없습니다.

정적 분석을 수행 할 수있는 경우 IDA를 사용하여 함수 경계를 가져올 수 있습니다.

관련 문제