2013-01-05 95 views
0

將任何.exe加載到我的命令行程序中。我得到這個輸出: http://www.privatepaste.com/22dc18e88d/outputExe導入dll序號到DLL導出函數名稱的比較?

正如你可以從輸出中看到的。我得到21個導入的dll。

它導入wsock32.dll,因爲我繼續解析pe文件格式的命令行參數.exe中的信息。我看到:

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文件格式來看到這些信息。顯然,我們將無法獲得這些功能的名稱。

如果我想看看00000016序我將不得不使用DUMPBIN或CFF Explorer,然後加載的wsock32.dll,並期待在其出口找出函數與00000016.

我不不想這樣做。我想要一個c或C++的方法來獲取00000016,並以某種方式打開wsock32.dll並將其導出表與我從exe中獲得的序號進行比較。

目前,這是我應得的序:

// 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 

因此,林想知道,在分析EXE進口...有沒有辦法來匹配IMPORT序數,對DLL出口ORDINAL?並找到正式的功能名稱?

我想要一個c或C++的方式來做到這一點。

謝謝,如果有人在那裏與我正在尋找的知識。由於這些東西非常複雜,我試圖做的事情並沒有被很多人所知。

我希望有人能幫助...

謝謝...

+0

所以你需要做的是找到一個函數的名稱給它的序號。不是很難。取決於,dumpbin等全部管理它。由於PE格式被廣泛記錄,因此不知道你爲什麼標記了這種逆向工程。 –

回答

0

在Windows API顯然不具有執行這種轉換的功能。它甚至沒有API來列出庫的輸出,儘管that should be possible with relative ease。也許你可以嘗試修改該代碼以提取從序號到名稱的映射。

+0

這就是我要問的問題。大聲笑:)這是一個很難的問題,將需要許多品脫啤酒搞清楚......我只是不知道該怎麼去做。我必須告訴我的代碼如何識別導入的dll,然後加載它的pe文件格式,然後對其進行比較。導入序號導出dll的信息。 –