
前言
作为一名苦逼的反病毒人员,IDA是一个必不可少的工具,虽然IDA有Linux平台的版本,但其高昂的售价着实是让笔者望而却步,不过幸好Windows平台上有不少可用版本 ;)
作为一个用ArchLinux作为主力系统的反病毒人员,我选择用wine跑IDA…… 然后,就有了今天的故事。
IDA报错
IDA从某个版本开始,提供了python支持——当然,这个支持在windows上是没有问题的。可是在Linux平台,由于是wine模拟环境,会导致IDA提示找不到idapython3.dll模块:

为了使用上强大的python特性,因此有了本文……
Wine + IDA + Python
安装python环境
虽然Linux本身带了python环境,但是wine下的IDA是无法使用的,我们需要一个windows下的python环境。
从官网下载python3绿色包
当然你也可以下载安装版, 笔者选择绿色版主要是看中绿色版的portable特性和极为精简的目录结构。
我下载的是当前的最新版本,注意:并不是版本越新越好,IDA本身支持的python版本有限,具体可以到IDA目录下的"python\<Python版本>\PyQt5"目录下查看,一定要下载对应支持的版本(截止到目前可用的最新IDA 7.7,建议用3.10.x版本的Python)。
https://www.python.org/ftp/python/3.10.2/python-3.10.2-embed-amd64.zip
下载完成后解压到对应目录:

这里需要注意Linux路径和wine下的Windows路径的对应关系,听着有点乱,举个例子就明白了:
Linux下的路径: /home/hacksign/.wine/drive_c/Program Files/Python3/
对应wine下的: C:\Program Files\Python3
OK, 解压到Python3目录后,我们就得到了一个windows下的python环境, 接下来为了方便后续调用,我们需要设置一下wine下的PATH环境变量。
设置环境变量
使用如下命令打开注册表
wine regedit
然后修改如下位置:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
在PATH最后,添加上面的python3环境(注意用分号分割各个路径 ):

配置完上述环境之后,我们新开个命令行, 执行如下命令:

如果你看到了python命令行提示符,那么恭喜你,你已经成功了一半了。
接下来我们需要修改IDA的python3.dll位置, 来到如下注册表位置(如果没有,需要先运行一下IDA):
HKEY_CURRENT_USER\Software\Hex-Rays
修改Python3TargetDLL为我们上面的python目录下的python3.dll绝对路径:

做完上述设置后,再开一个新的IDA,你会发现之前的报错信息没了,取而代之的是新的错误信息:

其实到这里,你的IDA已经可以使用ida-python了。不过作为一个完美主义者,我们还需要消除掉这个错误。
仔细观察上图的报错信息,可以发现其实是由于未安装python的yara模块导致。一般情况下,我们遇到ModuleNotFoundError: No module named 'xxx'的错误,第一时间想到的就是使用pip安装。
思路有了,接下来开干。
给Wine环境的Python安装Pip
首先从如下地址获取pip的安装脚本:
接着执行安装,如下图:

安装完成之后, 我们回到python目录下, 发现多了一个叫Lib的文件夹, 再往里找找,发现pip已经安装在 Libs\site-packages 这个目录下面了:

然而此时你想直接使用还是会提示找不到pip模块, 这是因为我们还没有设置变量,让python找到pip模块
设置python库的搜索路径
注意,如果你使用的是安装版本的python,那么需要设置PYTHONPATH环境变量(参考上面设置PATH变量)。
如果你使用的是绿色版python的话, 会在目录下找到一个叫做python310._pth的文件(310随下载的python版本号不同而不同)。打开并编辑这个文件,将site-packages路径写到文件中:

注意,这个文件中的路径填写的是相对路径,即相对于python.exe的路径。
保存退出后,执行如下命令:

如果看到了pip的版本信息,那么再次恭喜你,你已经成功了80%了。
接下来我们要安装yara模块,解决上面IDA报错找不到yara的错误, 命令如下图:

这时再次打开新的IDA,并随便反编译一个东西,又发现了新的错误:

这次是找不到libyara.dll文件,在python的目录下找一下这个文件在哪:

Emmmm……,发现位置有点问题, IDA尝试在 C:\Program Files\Python3 目录下找这个文件,而实际上文件安装到了 C:\Program Files\Python3\Lib\site-packages\Program Files\Python3\DLLs\libyara.dll这个目录下。人肉将libyara.dll移动到正确的位置,再次打开一个新的IDA并反汇编文件:

OK, 所有的错误已经消除, 功能初步测试正常。
后记
diaphora插件报错
在后续的使用过程中, 发现diaphora会报错:

下面记录一下如何解决错误。
首先要安装PyQt5这个包,由于笔者已经安装过了,因此下图报已经存在,安装命令是一样的:

然后发现脚本中似乎还在强制加载python38.dll, 而由于我们下载的是python 3.10版本, 并不存在python38.dll文件, 因此需要做个软连接:

之后再使用diaphora就不存在问题了, 下图是比较 true和false 两个程序的截图:

ret-sync插件无法启动
此插件enable之后立刻disable,日志大概下面这个样子:
- [sync] form create
- [sync] default idb name: ntoskrnl_en.exe
- [sync] found config file: user_conf(host='127.0.0.1', port=8844, alias=None, path='D:\\Windows10\\x64\\.sync')
- [sync] hint: pdb name ('ntkrnlmp.exe') differs from registered module name ('ntoskrnl_en.exe')
- [sync] sync enabled
- [sync] init_broker
- [sync] cmdline: "D:\Softwares\Python3\python.exe" -u "D:\Softwares\IDA Pro\plugins\retsync\broker.py" --idb "ntoskrnl_en.exe"
- [sync] module base 0x140000000
- [sync] hexrays #7.7.0.220118 found
- [sync] broker new state: Starting
- [sync] broker new state: Running
- [sync] broker started
- [sync] plugin loaded
- [sync] broker new state: Not running
- [sync] check tmp file retsync.<broker|dispatcher>.err if you think this is an error
- [sync] broker finished
- [sync] idb is disabled
此问题主要是由于Python缺少ret-sync库导致的, 解决办法为在python310._path文件中(310为版本号)加入ret-sync的库路径:
- >> cat python310._pth
- D:\Softwares\IDA Pro\plugins\retsync
IDA崩溃问题
如果你使用了idapyswitch.exe切换python环境,IDA可能会出现崩溃的情况。建议最后使用这个工具设置一下环境变量,然后再修复回来,不然IDA自带的PyQt5包可能无法使用。
这是因为idapyswitch.exe设置了一个错误的Python3TargetDLL值,你只需要打开注册表,修改如下位置的键值即可(具体见上文):
HKEY_CURRENT_USER\Software\Hex-Rays
IDA 7.6自带的go解析能力,用起来真的爽~
