exe导入DLL导出函数名称比较的dll序号?

时间:2013-01-05 20:22:44

标签: c++ c winapi reverse-engineering portable-executable

将任何.exe加载到我的命令行程序中。我得到这个输出: http://www.privatepaste.com/22dc18e88d/output

从输出中可以看出。我得到21个进口dll。

导入wsock32.dll,因为我继续解析命令行参数.exe的pe文件格式的信息。我明白了:

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 ordinal,我将不得不使用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'S IMPORTS时知道...有没有办法匹配IMPORT ORDINAL,到DLL EXPORT ORDINAL?并找到了ORDINAL的功能名称?

我想用c或c ++的方式来做这件事。

谢谢,如果有人在那里有我正在寻找的知识。由于这些东西非常复杂,我想要做的事情并不为很多人所熟知。

我希望有人能帮忙......

...谢谢

1 个答案:

答案 0 :(得分:0)

Windows API显然没有执行此转换的功能。它甚至没有用于列出库导出的API,尽管that should be possible with relative ease。也许您可以尝试修改该代码以提取从序数到名称的映射。