解决IDA的call analysis failed调用分析失败

前言

好基友AmazingDM几天前给我发来一个程序,希望我帮忙分析一下key的加密算法

但我用IDA加载后发现无法在main函数使用F5,警告如下:

了解错误

根据IDA官网对call analysis failed的解释,出现这种问题的原因可能分两种:

  1. 反编译器无法确定调用约定(the decompiler could not determine the calling convention)
  2. 反编译器无法确定参数个数和类型

我们G到4907EB的位置

发现这个call是一个寄存器形式的call,EAX=EBP-120,然后调用EAX,参数是0

这里就能看出问题的根本原因了

是因为EBP-120不是一个常量,所以IDA没法分析出EAX的地址

这个时候只能用到x64dbg了,看看这个EAX里到底是什么

动态调试

由于是32位应用,这里使用x32dbg

  1. 打开软件并配置命令行,自动断到入口点
  2. Ctrl+G,输入4907EB
  3. F4运行到这个call

发现EAXmsvcrt.time

也就是C语言库函数time,这也解释了为什么调用时参数是0(空指针)

静态分析

我们回到IDA,打开导入函数表,搜索time这个函数

确实有这个函数,我们双击进去。按X,查看time的交叉引用

这个函数在main函数里只使用过一次,我们双击过去看汇编

重点就在红框的代码里,先将time保存在了EAX里,随后又将EAX保存在了EBP-120

原来4907EB那调用的EBP-120就是time

这与之前动态调试的结果一致

修复

选中mov eax, [ebp+var_120],按下Ctrl+Alt+K,使用Keypatch插件修改汇编

修改成mov eax, 4D2574,也就是导入函数time的地址

可以看到虽然代码还是call eax,但这时IDA已经识别到EAXtime了,并自己加上了注释

按照上述方法修复所有地方,按下F5,成功输出伪代码~