运行二进制分析框架Genius 配置IDA6.8+python2.7+idapython 使用命令行执行idapython脚本 idapython传参问题的解决 No module named _idaapi
参考论文
Scalable graph-based bug search for firmware images
https://github.com/qian-feng/Gencoding
windows
1.1 安装python2.7
https://www.python.org/downloads/release/python-2716/ 选择32位python 。并设置环境变量。
注意,如果之前安装过python3,只需要在环境变量上移到3之上 (where python)
1.2安装ida.
参考 https://www.cnblogs.com/CoBrAMG/p/9198113.html 安装。
最好按照对应版本的ida,如6.8. 注意,Genius源码是python2写的,需要环境为IDA6.8+PYTHON2.7(32位)
若安装idapython7.0以上,自带idapython,可以跳过下面1.3-----但是只能用python3的脚本。而https://github.com/qian-feng/Gencoding提供的Genius源码是python2的,所以需要自己更改
1.3 安装idapython
ida6.8
https://github.com/idapython/bin
idapython-1.7.2_ida6.8_py2.7_win32.zip
- 将IDAPython解压后的Python文件夹内的所有内容覆盖掉IDA原有Python文件夹(IDA安装目录下)下面的内容。
- 将IDAPython解压后的Plugins文件夹的python.plw和python.p64拷贝到IDA原有Plugins文件夹(自定义,一般IDA安装目录下)下。
- 将IDAPython解压后的python.cfg文件拷贝到IDA原有cfg文件夹(IDA安装目录下)下。
解决:
参考以下两个博客,没有解决问题
http://spd.dropsec.xyz/2016/10/04/%E5%85%B3%E4%BA%8EIDA%E6%89%BE%E4%B8%8D%E5%88%B0%E6%8C%87%E5%AE%9A%E7%9A%84%E6%A8%A1%E5%9D%97%E7%9A%84%E6%83%85%E5%86%B5/
https://hex-rays.com/blog/ida-and-common-python-issues/
更换为安装版idapro6.8、添加dll高ida目录等,都没有解决问题
最后解决问题参照的方法:
https://blog.csdn.net/sdutstudent/article/details/116197661
https://zhuanlan.zhihu.com/p/102655828
idapython-1.7.2_ida6.8_py2.7_win32.zip
其实idapython写的很清楚了,就是需要安装32位python。之前1.1中安装python时因为系统是64位win10,所以想当然的安装了64位python导致错误。更换为32位 python2.7即可
注意更换后别忘了设置path,替换idapython/bin文件
之后就完美运行了。和是不是安装版没有关系、
1.4 安装相关python库
可能还需要安装一些python的包。参考Genius的源码需要哪些库 https://github.com/qian-feng/Gencoding
如 需要为python2.7 安装networkx
首先安装pip
因为安装的是2.7.16版本的python,自带pip,只需要添加相关系统变量即可
注意如果安装了其他版本的python,需要将2.7对应的环境变量上移
然后安装networkx。
法一:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple networkx 目前采用法一
法二:http://www.doczj.com/doc/6ad0e24976c66137ee06196c.html
1.5 pycharm+ida 解决No module named _idaapi //尝试运行Genius Extractor
https://github.com/qian-feng/Gencoding下载源码。ida打开一个binary文件,file->script file,运行相关脚本,有报错。分析后是没有传参
直接用ida-file-script file,除非写死,不然不能传参,故用pycharm 调试 dapython
https://www.programmerall.com/article/99121641505/
interpreter选择之前安装的python2.7.复制相关文件到pycharm项目
问题:
报错
解决思路:
思路1:.尝试 使用ida命令行,提供ida上下文 // linux ida运行
思路2:https://blog.csdn.net/lichao890427/article/details/52133712
使用ida都知道idapython插件,提供idc.py idaapi.py idautils.py,可以直接import进来,可以在ida运行时使用内部python插件运行 然而这几个函数在不使用ida上下文的时候是无法使用的,会提示找不到_idaapi模块,那么_idaapi又是哪里来的呢, 通过搜索可以发现是ida\plugin\python.plw中声明的,因此把该文件放到%PYTHONROOT%\Lib\下面, 同时把导入的ida.wll和pytho27.dll放到%PYTHONROOT%\下,即可使用import _idaapi了,这样,上述几个py就可以工作了 ———————————————— 版权声明:本文为CSDN博主「lichao890427」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/lichao890427/article/details/52133712
https://answerrrrrrrrr.github.io/2016/09/20/idapython-commandline/
http://h4ck.org.cn/2012/03/ida-batch-mode/
思路三:
看ida/python/idaapi.py的源代码
from sys import version_info if version_info >= (2,6,0): def swig_import_helper(): from os.path import dirname import imp fp = None try: fp, pathname, description = imp.find_module('_idaapi', [dirname(__file__)]) //寻找_idaapi.py except ImportError: import _idaapi return _idaapi
目前采用思路一:
在pycharmternminal
E:\BaiduNetdiskDownload\IDA_Pro_v6.8\IDA_Pro_v6.8/idaq.exe -c -S"raw-feature-extractor/preprocessing_ida.py" hpcenter (hpcenter为固件,放在pycharm项目文件夹)
还是报错但是至少可以跑了
对应代码
下一步就是 E:\BaiduNetdiskDownload\IDA_Pro_v6.8\IDA_Pro_v6.8/idaq.exe -c -S"raw-feature-extractor/preprocessing_ida.py --path XXX" hpcenter
这样添加适当的参数即可
1.6 IDA命令行执行 IDApython 脚本传参 // pycharm运行genius extractor
使用命令行,执行:
D:\IDA_Pro_68\idaq.exe -c -S"raw-feature-extractor/preprocessing_ida.py --path D:\pycharmproject\Genius\storefile" hpcenter
报错和上面一样
查了下 https://stackoverflow.com/questions/35591455/python-os-path-join-typeerror-object-of-type-nonetype-has-no-len
查看splitdrive函数的原型。没解决问题
添加打印信息
发现binary_name成功识别,但是path 为None。没输入成功
测试代码
import os import argparse def parse_command(): parser = argparse.ArgumentParser(description='Process some integers.') parser.add_argument("--path", type=str, help="The directory where to store the generated .ida file") args = parser.parse_args() return args if __name__ == '__main__': args = parse_command() path = args.path print path
输出
PS D:\pycharmproject\Genius> python main.py --path "D:\pycharmproject\Genius\storefile" D:\pycharmproject\Genius\storefile PS D:\pycharmproject\Genius> python main.py --path D:\pycharmproject\Genius\storefile D:\pycharmproject\Genius\storefile
可以正常读取参数。说明命令行格式没问题,只是IDApython的问题导致不能读取参数
D:\IDA_Pro_68\idaq.exe -c -S"raw-feature-extractor/preprocessing_ida.py --path D:\pycharmproject\Genius\storefile" hpcenter
解决:
思路一,没有解决问题,但是有些帮助:
google ida的命令行模式。
idapython batch mode
找到:
https://hex-rays.com/products/ida/support/idadoc/417.shtml
IDA的官方help。得到参数的输入格式
It is possible to pass command line arguments after the script name. For example: -S"myscript.idc argument1 \"argument 2\" argument3"
思路二:
又参考 idapython arguments
https://reverseengineering.stackexchange.com/questions/8428/idapro-the-arguments-could-not-be-passed-to-the-python-script
https://reverseengineering.stackexchange.com/questions/13286/executing-an-idapython-script-with-arguments-within-ida-pro
命令行输入:
PS C:\Program1\pycharmproject\Genius3> E:\BaiduNetdiskDownload\IDA_Pro_v6.8\IDA_Pro_v6.8\idaq.exe -c -S"raw-feature-extractor/preprocessing_ida.py --path C:\Program1\py charmproject\Genius3\new" hpcenter
添加打印信息:
print str(sys.argv) #['raw-feature-extractor/preprocessing_ida.py'] print str(idc.ARGV) #['raw-feature-extractor/preprocessing_ida.py', '--path', 'C:\\Program1\\pycharmproject\\Genius3\\new']
输出:
所以修改下代码对argv的引用:
原: path = args.path 改为: path = idc.ARGV[2]
之后可以运行。对固件hpcenter提取信息如图