c++ - exe导入dll序号与DLL导出函数名比较?

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

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

正如您从输出中看到的那样。我得到 21 个导入的 dll。

当我继续解析命令行参数.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 文件格式可以看到此信息。显然我们无法获取这些函数的名称。

如果我想查看 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 的导入时...有没有办法将导入序号与 DLL 导出序号相匹配?并找到序数的函数名称?

我想要一个 C 或 C++ 方法来执行此操作。

如果有人拥有我正在寻找的知识,谢谢。因为这个东西非常复杂,而且我想做的事情并不为很多人所知。

希望有人能帮忙...

谢谢...

最佳答案

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

关于c++ - exe导入dll序号与DLL导出函数名比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14176030/

相关文章:

c++ - 如何在c++17中定义函数组合?

C# 将字符串编码结构发送至 C 库

c++ - 使用 ATL CImage 从内存缓冲区加载图像

c++ - 在 C++ 中生成所有可能的对象分配到大小为 n1、n2、...nk 的 k 个容器中

C++ 堆栈值无法正常工作

c - 有没有办法改变C语言中的文本颜色?

c++ - 同时执行 if 和 else 条件的逻辑是什么

java - 摆脱 Windows 典型样式?

c++ - 哪个 Windows API 用于 Windows 安全代理身份验证对话框?

c++ - 实现 std::variant 转换构造函数 - 或者:如何从参数包中找到从任何 T 到 Ti 的所有转换的第一个重载