倚天屠龙(一):妙用IDA Pro--利用IDAPython编写调试插件
一:前言
虽然静态分析有Radare2,Hopper这种新星之秀,动态调试有Ollydbg,Windbg这种老牌霸主,但是IDA Pro仍然是大部分二进制安全工程师最喜爱的工具,除了价格过于昂贵,基本无懈可击。在笔者眼里,它有下面几个特点是别的工具无法比拟的
1:反编译插件,说它是当今世界最好的反编译器也不为过,这个革命性的插件,极大的降低逆向工程的门槛,也极大的提高了逆向工程师的工作效率。
2:IDA的编程接口,单纯的任何工具无法满足安全工程师的所有使用需求,但是完善的SDK包给了这个工具无限可能,特别在自动批量化处理的方面,如虎添翼。
3:以数据库的形式保存,方便对文件进行任何操作并保存
并不是其它的功能就不优秀了,相反,它的其它功能也很强大,比如FLART功能,等等。这系列文章主要以IDA IDC,SDK编程,IDAPython变成的具体案例为主,插叙IDA的各种奇淫巧技。
二:准备工作
先回答一个问题:
1:为什么用IDAPython,而不是用 IDC或者IDA SDK编程?
IDC可以快速解决一些简单的问题,但是对于复杂的问题,就有点力不从心了。IDA SDK包文档过少,而且在调试相关的API,BUG比较多,使用比较难受,相比于起来,IDAPython可以调用IDC和 IDA SDK包的所有函数,而且文档资料丰富。
当然,之前你需要懂Python,逆向工程,能熟练使用IDA Pro,懂得调试的一些常规知识。再加上一个IDA Pro6.8带IdaPython即可。
三:编写
第一步:先来看一下插件的框架
class myIdaPlugin(plugin_t):
flags=0
wanted_name="my ida plugin"
wanted_hotkey="Alt+c"
comment="my ida plugin"
help="Something helpful" def init(self):
return PLUGIN_KEEP def term(self):
pass def run(self,arg):
pass def PLUGIN_ENTRY():
return myIdaPlugin()
其中,flags规定了Ida在不同情况下怎么处理插件,一般为0。
wanted_name为插件名称,comments为插件注释,help为帮助字符串,wanted_hotkey为快捷键,没有则赋为空值。
其中最重要的是那三个函数了,init()函数用于加载你的插件,term()函数用于卸载时的清理活动(释放内存,结束处理,保存状态等等)
第二步:看一下调试框架
from idaapi import * class MyDbgHook(DBG_Hooks):
""" Own debug hook class that implementd the callback functions """ def dbg_process_start(self, pid, tid, ea, name, base, size):
print("MyDbgHook : Process started, pid=%d tid=%d name=%s" % (pid, tid, name)) def dbg_process_exit(self, pid, tid, ea, code):
print("MyDbgHook : Process exited pid=%d tid=%d ea=0x%x code=%d" % (pid, tid, ea, code)) def dbg_library_unload(self, pid, tid, ea, info):
print("MyDbgHook : Library unloaded: pid=%d tid=%d ea=0x%x info=%s" % (pid, tid, ea, info))
return 0 def dbg_process_attach(self, pid, tid, ea, name, base, size):
print("MyDbgHook : Process attach pid=%d tid=%d ea=0x%x name=%s base=%x size=%x" % (pid, tid, ea, name, base, size)) def dbg_process_detach(self, pid, tid, ea):
print("MyDbgHook : Process detached, pid=%d tid=%d ea=0x%x" % (pid, tid, ea))
return 0 def dbg_library_load(self, pid, tid, ea, name, base, size):
print "MyDbgHook : Library loaded: pid=%d tid=%d name=%s base=%x" % (pid, tid, name, base) def dbg_bpt(self, tid, ea):
print "MyDbgHook : Break point at %s[0x%x] pid=%d" % (GetFunctionName(ea), ea, tid)
idaapi.continue_process()
return 0 def dbg_suspend_process(self):
print "MyDbgHook : Process suspended" def dbg_exception(self, pid, tid, ea, exc_code, exc_can_cont, exc_ea, exc_info):
print("MyDbgHook : Exception: pid=%d tid=%d ea=0x%x exc_code=0x%x can_continue=%d exc_ea=0x%x exc_info=%s" % (
pid, tid, ea, exc_code & idaapi.BADADDR, exc_can_cont, exc_ea, exc_info))
return 0 def dbg_trace(self, tid, ea):
print("MyDbgHook : Trace tid=%d ea=0x%x" % (tid, ea))
return 0 def dbg_step_into(self):
print("MyDbgHook : Step into")
self.dbg_step_over() def dbg_run_to(self, pid, tid=0, ea=0):
print "MyDbgHook : Runto: tid=%d" % tid
idaapi.continue_process() def dbg_step_over(self): print("MyDbgHook : 0x%x %s" % (eip, GetDisasm(eip)))
debughook = MyDbgHook()
debughook.hook()
这里是调试框架,代码看起来很长,其实,只要在插件框架的init函数进行初始化,即可。然后在调试过程中,会因为各种事件而触发各种函数,从而触发自己需要的操作,实现自动化脱壳或者anti-debug等功能。
第三步:研究实现x64和x32位antii-anti-debug功能
一般anti-anti-debug功能从两方面着手 ,一方面patch内存,一方面是hook函数。
Patch内存:这需要获取FS(x86)/GS(x64)指向的地址,这里提供三种方法,第一种直接使用IDApython提供的API接口
fsBase = regval_t()
get_reg_val("fs",fsBase)
return internal_get_sreg_base(idaapi.get_current_thread(),int(fsBase.ival) )
但这种在64位上无效,估计是IDA自身Bug,已经提交给 hex-ray公司了。
第二种是利用appcall函数来调用windows api得到,这种过于复杂。
第三种是通过注入dll,来直接用asm汇编进行编程,这里可以使用IDA的APPCALL机制来实现LoadLibrary操作,代码如下:
def LoadLibrary(self,dll_name):
return Appcall.proto("kernel32_LoadLibraryA","int __stdcall LoadLibrary(const char * fn);")(dll_name)
之后就可以直接patch_long(addr,byte)了
Hook函数:如上文,最简单的方法是采用dll注入,采用APPCALL来加载并调用函数,如下
def callfunc(self,funcname):
if self.bits == "x86":
return Appcall.proto("stealthx86_"+funcname,"bool _stdcall "+funcname+"();")();
else:
return Appcall.proto("stealthx64_"+funcname,"bool _stdcall "+funcname+"();")();
关于需要注入的dll,由于不在本文 内容中,请自行探究。
关于一些调试过程中自动化处理的一些,留待下一篇继续讲解。
倚天屠龙(一):妙用IDA Pro--利用IDAPython编写调试插件的更多相关文章
- IDA Pro 6.0使用Qt 框架实现了跨平台的UI
IDA Pro 6.0使用Qt 框架实现了跨平台的UI.它的好处是插件编写者还可以直接使用 Qt 开发跨平台 UI.但是编剧呢? 在这篇博文中,我们将说明如何使用PySide使用IDAPython为 ...
- IDA,IDA PRO 产品介绍
IDA理念这是我们在开发产品时竭尽全力遵循的理念--在此过程中,我们相信我们将开发出能够为您带来所需的可靠性.便利性和易用性的软件.没有什么能打败人脑因为我们知道一秒钟的洞察力仍然胜过百年的处理时间, ...
- 安卓动态调试七种武器之孔雀翎 – Ida Pro
安卓动态调试七种武器之孔雀翎 – Ida Pro 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是 ...
- 计算机病毒实践汇总六:IDA Pro基础
在尝试学习分析的过程中,判断结论不一定准确,只是一些我自己的思考和探索.敬请批评指正! 1. IDA使用 (1)搜索.下载并执行IDA Pro,对可执行程序lab05-01.dll进行装载,分别以图形 ...
- IDA Pro使用(静态分析+动态调试)
链接:http://skysider.com/?p=458 IDA Pro使用(静态分析+动态调试) 1.静态分析 IDA FLIRT Signature Database —— 用于识别静态编译的可 ...
- IDA Pro Disassembler 6.8.15.413 (Windows, Linux, Mac)
IDA: What's new in 6.8 Highlights This is mainly a maintenance release, so our focus was on fixing b ...
- 使用IDA pro逆向ARM M系核心的Bin固件
使用IDA pro逆向ARM M系核心的Bin固件 物联网和智能设备这两年还是比较火的,我们的手中或多或少都有了几个智能设备,比如手环,智能手表,或者门锁什么之类的东西,但是同学们在做逆向的时候, ...
- IDA PRO:庆祝成立创新 30 周年
今天,IDA 已经三十岁了.为了纪念周年纪念,我们将描述史诗旅程的开始和主要里程碑. 背景 在 1990 年代初期,DOS 是最流行的 PC 操作系统,主要是 8086,偶尔有 80286(80386 ...
- 恶意代码分析实战四:IDA Pro神器的使用
目录 恶意代码分析实战四:IDA Pro神器的使用 实验: 题目1:利用IDA Pro分析dll的入口点并显示地址 空格切换文本视图: 带地址显示图形界面 题目2:IDA Pro导入表窗口 题目3:交 ...
随机推荐
- JS之window对象
window对象 window属性: opener:打开当前窗口的源窗口,如果这个窗口是由别的网页点击链接跳转过来的,或者是从另外一个页面点击打开窗口打开的,opener就是找到源页面的.如果当前窗口 ...
- ES6新用法
ES6 详细参考页面 简介 ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现.一般来说,这两个词是可以互换的. let命令 ES6新增了let命令,用来声明变 ...
- VMware Workstation Pro 14 序列号
VMware Workstation Pro 14 序列号: AA702-81D8N-0817Y-75PQT-Q70A4 YC592-8VF55-M81AZ-FWW5T-WVRV0 FC78K-FKE ...
- perl6 拖库脚本
#注入点: #https://fei.sg/shop/products.php?action=content&id=-23 #check mysql column_name of the sq ...
- spin_USACO
Spinning Wheels1998 ACM NE Regionals Each of five opaque spinning wheels has one or more wedges cut ...
- Linux进程调度与源码分析(二)——进程生命周期与task_struct进程结构体
1.进程生命周期 Linux操作系统属于多任务操作系统,系统中的每个进程能够分时复用CPU时间片,通过有效的进程调度策略实现多任务并行执行.而进程在被CPU调度运行,等待CPU资源分配以及等待外部事件 ...
- 【转】CVE-2010-4258 漏洞分析
一. 漏洞简介 CVE-2010-4258这个漏洞很有意思,主要思路是如果通过clone函数去创建进程,并且带有CLONE_CHILD_CLEARTID标志,那么进程在退出的时候,可以造成内核任意地址 ...
- nfs 文件共享 服务
需要rpc服务: [root@xujiaxuan ftp]# service rpcbind start[root@xujiaxuan ftp]# chkconfig rpcbind on 设置开机自 ...
- PXC 避免加入集群时发生SST
环境 现有集群节点: 192.168.99.210:3101 新加入节点: 192.168.99.211:3101 通过xtrabackup备份还原实例,并通过同步方式追数据: 已有节点情况: roo ...
- Win10打开照片提示“无效的注册表值”解决方法
1.点开开始菜单,右键单击,选择“以管理员运行”[键盘win键+R]输入PowerShell. 2.输入Get-AppxPackage *photo* | Remove-AppxPackage后回车. ...