我知道有一个类似的问题,但答案没有为该问题提供任何解决方案。
我正在反编译一个 .dll 文件,我找到了我需要的子程序,但它在第 1 行抛出了“调用分析失败” call eax。
我的问题是:我可以使用这一call eax行正确反编译子例程,还是可以将其更改为其他内容,或者只是忽略它?在 ASM 中工作真的很困难,因为我需要取出代码本身,而不是补丁,并且手动将汇编代码转换为伪代码真的很难做到。
我知道有一个类似的问题,但答案没有为该问题提供任何解决方案。
我正在反编译一个 .dll 文件,我找到了我需要的子程序,但它在第 1 行抛出了“调用分析失败” call eax。
我的问题是:我可以使用这一call eax行正确反编译子例程,还是可以将其更改为其他内容,或者只是忽略它?在 ASM 中工作真的很困难,因为我需要取出代码本身,而不是补丁,并且手动将汇编代码转换为伪代码真的很难做到。
您可以采用以下方法之一:
call eax通常意味着有一个间接调用。尝试找到eax定义的内容和位置。或许只看一眼,就会发现问题所在。如果您找到了根源但不明白问题所在,您可以尝试修补它,例如:mov eax, <known_function_address>
也许您可以更改函数签名来解决这里描述的问题。
您可以尝试使用不同的反编译器,当最值得注意的是Ghidra.
这个问题不是唯一的,call eax但可能是任何间接调用或对具有错误类型信息的函数的调用。Hex-Rays Decompiler 手册中描述了可能的原因和解决方案。
一个常见的原因是 IDA 没有正确检测到调用的堆栈调整(例如,被调用的函数是带参数的 stdcall 但 IDA 检测到堆栈更改为 0)。这可以通过Alt+K快捷方式指定正确的堆栈更改值来解决(每次推送 4 次是一个很好的经验法则)。