我正在寻找一种方法来获取 .text 部分中 DLL 中所有函数的地址。有没有办法在不使用反汇编器和遍历命令的情况下做到这一点?IDA 如何知道识别所有函数,即使它们的开始不是常规的“push ebp, mov ebp esp”?
谢谢!
我正在寻找一种方法来获取 .text 部分中 DLL 中所有函数的地址。有没有办法在不使用反汇编器和遍历命令的情况下做到这一点?IDA 如何知道识别所有函数,即使它们的开始不是常规的“push ebp, mov ebp esp”?
谢谢!
只需阅读 PE 标头,您就可以获得所有导出函数的列表。但是,这不会为您提供任何函数名称或预期的参数列表 (*),也不会为您提供 DLL 内部的任何函数。
在一般情况下,你唯一能做的就是从导出的函数开始,从那里反汇编,跟随jmp
s,并将所有被call
编辑的东西标记为一个新函数,并以与处理导出内容相同的方式处理它。这基本上就是 IDA 所做的。
正如 C0000022L 所提到的,这绝不是微不足道的,尤其是对于从不直接调用而仅通过 vtable 指针调用的 C++ 方法,这就是为什么即使是 IDA 也能大部分正确但不完全正确的原因。
不过,Ida 有另一个功能,名为 FLIRT - 它有一个数据库,其中包含许多不同编译器的标准库函数的签名。这就是为什么它通常可以识别标准库函数名称的原因。但据我所知,这是第二遍的事情;首先,IDA 通过从某处调用来识别函数,然后尝试使用 FLIRT 为这些函数分配名称。当然,这只对标准库函数有帮助,构建这种数据库当然也需要很多工作。
(*) 如果幸运,函数将按名称导出,如果幸运,并且 DLL 是用 C++ 编写的,则函数名称将包含签名。所以有些情况下出口清单很有价值。但这不是一般情况,当一个函数可能只是按序导出时。