【发布时间】:2012-12-20 00:09:21
【问题描述】:
在将任何 .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 的 IMPORTS 时...有没有办法将 IMPORT ORDINAL 与 DLL EXPORT ORDINAL 匹配?并找到序数的函数名称?
我想要使用 c 或 c++ 的方式来执行此操作。
如果有人知道我正在寻找的知识,谢谢。因为这些东西非常复杂,而且我想做的事情并不为很多人所熟知。
希望有人能帮忙...
谢谢...
【问题讨论】:
-
所以你需要做的是找到给定序数的函数的名称。不是很难。取决于,dumpbin 等都管理它。不知道为什么要标记这种逆向工程,因为 PE 格式已被广泛记录。
标签: c++ c winapi reverse-engineering portable-executable