IDA二三记

用了三年ida, 还是只会f5

参数解析

ida有时针对函数参数返回值的识别并不准确, 可以通过一些办法进行修复

compiler

ida选项栏Options->Compiler可以重新设置代码分析方案

例如这是某次比赛的一道exe程序

但ida似乎并没有认出来, 还是使用的linux式的参数解析, 导致看起来十分怪异

这时候只需要重新设置一下Compiler, 解析就正确了

看起来舒服多了

__usercall

__usercall是IDA Pro中用于表示自定义调用约定的特殊修饰符,主要用于分析那些不使用标准调用约定

标准格式类似如下

1
int __usercall func@<eax>(int arg1@<ecx>, int arg2@<edx>, int arg3)
  1. eax代表返回值由eax传递, 如果如果返回值大于寄存器所能表示的那么可以通过更多寄存器来分别代表高位低位
  2. ecx, edx, 分别代表第一个第二个参数
  3. 没有标注的参数通过栈传递

至于具体怎么填, 还得根据函数的汇编代码来进行修改

IDA Pro中还有另一个类似的修饰符userpurge, 它与usercall的主要区别在于:

  • __usercall:调用者负责清理堆栈
  • __userpurge:被调用者负责清理堆栈

上一个例子也可以通过这个方法, 逐个手工修改, 效果相同

PY切换坑

ida的python一直用的是52下载的和ida打包的绿色python

将ida版本升级到ida9.1后, 想着顺带着升级一下python版本, 用idapyswitch切换一下, 再启动竟然就报错了

Unexpected fatal error while initializing python runtime. Please run idapyswitch to confirm or change the used Python runtime

网上搜一下解决方案, 搜到的解决方案大多是设置PYTHONHOME环境变量, 无非是系统变量长期修改和启动时临时修改的差罢了

前者会导致部分其他依赖python的程序运行出错, 后者过于麻烦, 故都不想采用

之前ida77的时候没设置PYTHONHOME变量, 照样用的好好的, 那想来还是有解决办法的

运行ida的cli工具idat.exe, 希望终端能有更多的错误日志

观察到其他部分都没什么大问题, 但有一个奇怪的路径/pypath/python310.zip, 但安装目录下并没有这个文件, 而去到先前用的py38文件夹中一看, 确实有一个zip包

那想来就是这个问题了, 去python官网下了一个便携版python, 解压出来就有一个python3xx.zip, 将其复制到目标切换的python目录下, 再次启动ida就没有报错, 问题解决