我对一些代码进行了反向工程,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的嵌入式注释中。这样,可以在分析恶意软件时通常跟随行为运行时分析的静态分析直接获得运行时信息,例如函数参数中返回的解密字符串。