如何识别IDA Pro反汇编中的函数调用?

逆向工程 艾达 拆卸 虚函数
2021-07-09 06:52:19

我正在对一些代码进行逆向工程,IDA 从中生成了以下反汇编。这些特定的代码行仅用于说明目的。请注意,第三行不是按名称而是按地址调用特定函数。

mov rcx, [rsp+128h+var_D8]    // reg CX gets the address at stack pointer+128h+var_D8 bytes 
mov r8, [rcx]                 // the address at reg CX is stored to reg r8
call qword ptr [r8 + 18h]     // at address rax+18h, call function defined by qword bytes

我有兴趣确定正在调用哪个函数。我可以使用哪些机制、工具、技巧等来确定调用qword ptr <address>所指的反汇编中的哪个函数我准备尝试其他反汇编程序。

从对我之前的问题的回答来看,这被称为“间接调用”或(可能是“虚拟函数调用”)。反汇编有很多这样的,那么我该如何解决呢?此外,IDA 已经确定了数百个函数。我如何确定在任何给定的间接调用(或虚拟调用)期间实际调用了哪个?

1个回答

找出相关函数的最简单方法可能是通过动态分析。您可以通过在调试器中的该指令上放置断点并检查寄存器来轻松完成此操作。

更通用的解决方案可能涉及一些脚本来记录所有调用并将该信息添加到 IDA 数据库。Funcap插件会做类似的事情,如果不是你正在寻找的东西:

此脚本使用 IDA 调试器 API 记录跨可执行文件的函数调用(和返回)以及传递的所有参数。它将信息转储到文本文件中,并将其插入到 IDA 的内嵌注释中。这样,在分析恶意软件时通常遵循行为运行时分析的静态分析可以直接提供运行时信息,例如函数参数中返回的解密字符串。