IDA逆向分析-插件demo
http://hex-rays.com/products/ida/support/idapython_docs idapython的文档
IDA插件的编写
- plugins 目录下进行实例化
- python 目录下面进行具体功能的编写
在IDA的plugins目录下创建 listFuncPlugin.py文件
# -*- coding:utf-8 -*-
import idautils
import idaapi
import idc
from datetime import datetime
class ListFunc(idaapi.plugin_t): # 继承idaapi.plugin_t
flags = idaapi.PLUGIN_UNL
comment = "List all function in this binary file"
wanted_name = "listfunc" # 插件的名称
wanted_hotkey = "Alt-F9" #插件的快捷键
help = "Coming soon..."
def init(self):
# 初始化方法
idaapi.msg(">>> My plugin starts. {0}\n".format(datetime.now()))
# 导入python目录下的功能模块
idaapi.require("listFunc")
idaapi.require("listFunc.listFuncInterface")
return idaapi.PLUGIN_OK
def run(self,arg):
listFunc.listFuncInterface.main() # 进行调用
def term(self):
idaapi.msg(">>> My plugin ends. {0}\n".format(datetime.now()))
# 插件的入口函数
def PLUGIN_ENTRY():
return ListFunc()
在IDA的python目录下创建listFunc文件夹,在其中创建
__init__.py
listFuncInterface.py 文件
其中 listFuncInterface.py 的内容为
# -*- coding:utf-8 -*-
import idautils
import idaapi
import idc
from datetime import datetime
def main():
for i, func in enumerate(idautils.Functions()):
func_name = idc.GetFunctionName(func) # 函数名
if "DllMain" in func_name:
print("{0} is the valu function {1}".format(i, func_name))
if __name__ == '__main__':
main()
如上,IDA插件的大致就这样
当如何,python目录创建类不是强制的,在plugin文件夹的py插件可以不引用其他类
不打开IDA,自动执行IDA插件
- 一个整体运行的脚本run.py
- 一个是具体分析数据的脚本,由run.py调用
run.py
# -*- coding:utf-8 -*-
import os
import subprocess
dir_path = "C:/tools/teest/1" # 原始数据的文件夹
ida_path = "C:/tools/IDA_Pro_v7.0_Portable/ida.exe" # ida的路径
ana_file = "C:/tools/teest/analysis.py" # 分析文件的路径
def run():
for root, dirs, files in os.walk(dir_path):
for file_name in files:
file_path = os.path.join(root, file_name)
cmd = "{0} -LC:/tools/mylog.log -c -A -S{1} {2}".format(ida_path, ana_file, file_path)
p = subprocess.Popen(cmd)
p.wait()
if __name__ == "__main__":
print("begin")
run()
analysis.py
# -*- coding:utf-8 -*-
import idautils
import idaapi
import idc
def do_some_analyse():
danger_func = ["main","DllMain","gets","read","StringVPrintfWorkerW"]
for func in idautils.Functions():
if idc.GetFunctionName(func) in danger_func:
print(hex(func), idc.GetFunctionName(func))
def main():
idc.Wait()
do_some_analyse()
idc.Exit(0)
if __name__ == "__main__":
main()