2013-01-05 5 views
0

.exe를 내 명령 줄 프로그램에로드하는 중. 출력 : http://www.privatepaste.com/22dc18e88d/outputExe DLL 내보내기 함수 이름 비교에 dll 서수를 반입합니까?

출력에서 ​​알 수 있습니다. 나는 수입 된 dll 21 개를 얻는다.

명령 줄 인수 .exe의 pe 파일 형식의 정보를 계속 구문 분석 할 때 wsock32.dll을 가져옵니다. 참조 :

wsock32.dll 가져 오기는 모두 서수입니다. 80000000 플래그로 보입니다. 모든 사람을 제거하면 다음과 같은 메시지가 표시됩니다.

[Import_By_Ordinal]: 00000016 
[Import_By_Ordinal]: 00000003 
[Import_By_Ordinal]: 00000073 
[Import_By_Ordinal]: 00000017 
[Import_By_Ordinal]: 00000015 
[Import_By_Ordinal]: 0000000B 
[Import_By_Ordinal]: 00000014 
[Import_By_Ordinal]: 0000000E 
[Import_By_Ordinal]: 0000000A 
[Import_By_Ordinal]: 00000034 
[Import_By_Ordinal]: 00000011 
[Import_By_Ordinal]: 00000013 
[Import_By_Ordinal]: 00000010 
[Import_By_Ordinal]: 00000009 
[Import_By_Ordinal]: 00000002 
[Import_By_Ordinal]: 00000008 
[Import_By_Ordinal]: 0000006F 
[Import_By_Ordinal]: 00000097 
[Import_By_Ordinal]: 00000012 
[Import_By_Ordinal]: 00000004 
[Import_By_Ordinal]: 0000000F 
[Import_By_Ordinal]: 0000000C 

이제이 정보는 EXE의 pe 파일 형식을 구문 분석하여 볼 수 있습니다. 분명히 우리는 그 함수들의 이름을 알 수 없을 것입니다.

내가 00,000,016 순서를보고 싶다면 나는 기능은 내가 '돈 00000016.

관련되고 있는지 확인하려면 DUMPBIN 또는 CFF 탐색기를 사용하고 WSOCK32.DLL을로드하고 수출을보고 할 것 그걸하고 싶지 않아. 00000016 및 여하튼 wsock32.dll을 열고 exe에서 얻은 서수에 내보내기 테이블을 비교하는 C 또는 C++ 방식이 필요합니다.

현재이 내가 서수 받고 있어요 방법입니다, 그래서

// Start Iterating Tables 
nFunctions = 0 ; 
nOrdinalFunctions = 0 ; 
while((*thunkINT).u1.AddressOfData != 0) /* AddressOfData holds RVA 
               to INT with the imported API name */ 
{ 
    /* Each IMAGE_THUNK_DATA structures are indicated by zero values when 
     you reach the end */ 
    // If the high bit isn't set, the IMAGE_THUNK_ DATA value is an RVA to the IMAGE_IMPORT_BY_NAME. 
    if(!(thunkINT->u1.AddressOfData & IMAGE_ORDINAL_FLAG)) 
    { 
     nameData = (PIMAGE_IMPORT_BY_NAME)((*thunkINT).u1.AddressOfData); 
     nameData = (PIMAGE_IMPORT_BY_NAME)rvaToPtr((DWORD)nameData, 
                peHeader, 
                (DWORD)baseAddress); 
     printf("\t%s", (*nameData).Name); 
     printf("\n"); 
    } 
    // Check OriginalFirstThunk ordinal and see if flag is set 
    // if flag is set, function is called by ordinal number. (import by ordinal) 
    if(((*thunkINT).u1.Ordinal & IMAGE_ORDINAL_FLAG)) 
    { 
     printf(" [Import_By_Ordinal]:\t"); 
     printf("\taddress: %08X", thunkINT->u1.Ordinal); 
     printf("\n"); 
     nOrdinalFunctions++ ; 
    } 
    thunkINT++; 
    thunkIAT++; 
    nFunctions++; 

} // End of while loop 

를 DLL 내보내려면 EXE 수입량을 분석하면서 IMPORT ORDINAL 일치 할 수있는 방법이 ... 알고 싶은 임 ORDINAL? ORDINAL의 기능 이름을 찾으십니까?

이 작업을 수행하는 데 C 또는 C++ 방식을 사용하고 싶습니다.

내가 찾는 지식이있는 누군가가 있다면 고마워. 이 물건은 매우 복잡하고 내가하려는 것은 많은 사람들에게 널리 알려져 있지 않습니다.

누군가가 도움이 될 수 있습니다 희망

...

감사합니다 ...

+0

그래서해야 할 일은 서수가 주어진 함수의 이름을 찾는 것입니다. 별로 열심히하지 않습니다. 의존, dumpbin 등 모두 그것을 관리합니다. PE 형식이 광범위하게 문서화되어 있기 때문에 왜이 역 엔지니어링을 태그했는지 알 수 없습니다. –

답변

0

는 윈도우 API는 분명히이 변환을 수행하는 기능이 없습니다. that should be possible with relative ease이지만 라이브러리의 내보내기를 나열하는 API조차 없습니다. 아마도 ordinal에서 name으로 매핑을 추출하기 위해 해당 코드를 수정 해 볼 수 있습니다.

+0

그게 내가 어떻게해야하는지 묻는 동일한 질문. LOL :) 그것의 힘든 문제는 많은 파인트의 맥주를 알아낼 것입니다 ... 나는 단지 그것에 대해 어떻게하는지 모른다. 나는 가져온 dll을 인식하고 pe 파일 형식을로드 한 다음 일부 비교를 수행하도록 내 코드에 지시하는 방법을 알아야합니다. dll의 정보를 내보내려면 서수를 가져옵니다. –