【iOS逆向与安全】利用IDAPython插件提高反汇编和逆向工程效率

前言

IDA Python是一个用Python语言编写的插件,它为IDA Pro提供了可扩展性和自动化脚本支持。使用IDA Python,可以以更快、更简单的方式完成反汇编和逆向工程任务。

1、目标

快速了解和开始使用idapython。

2、开发环境和工具清单

mac系统
IDA Pro7.0

3、常用APIidaapi模块:

该模块提供了许多核心的IDA API,
包括:

idaapi.get_func(ea):获取给定地址处的函数对象idaapi.get_segm_by_name(name):获取指定名称的段对象idaapi.get_screen_ea():获取当前屏幕上显示的地址
idaapi.get_func_name(ea):获取给定地址处的函数名idaapi.get_name_ea_simple(name):获取具有给定名称的地址idaapi.asktext(defval, prompt):显示一个文本框,等待用户输入文本idaapi.get_func_offset(ea):获取指定地址相对于函数起始地址的偏移量idaapi.get_segment_name(ea):获取指定地址所在的段名称

idaapi.idc模块:该模块提供了一些旧版IDA API的Python封装,
包括:

idc.GetDisasm(ea):获取给定地址处的反汇编指令
idc.Jump(ea):跳转到指定地址
idc.SetColor(ea, what, color):设置给定地址的颜色
idc.MakeCode(ea):将给定地址处的字节转换为指令
idc.MakeName(ea, name):将给定地址处的符号名称更改为给定名称idc.get_inf_attr(idc.INF_MIN_EA):获取载入程序的最小的有效地址idc.get_inf_attr(idc.INF_MAX_EA):获取载入程序的最大的有效地址idc.print_insn_mnem(ea):获取给定地址处的助记符
idc.prev_head(ea):获取给定地址的上一条指令的地址idc.print_operand(ea,index):获取给定地址中的操作数
idc.PatchByte(ea, 0x90):修改给定地址的第一个字节
idc.PatchWord(ea, 0x9090):修改给定地址的前两个字节
idc.PatchDword(ea, 0x90909090):修改给定地址的前四个字节idc.PatchQword(ea,0x9090909090909090):修改给定地址的前八个字节

idautils模块:该模块提供了一些常用的IDA辅助函数,
包括:

idautils.Functions():返回当前程序中所有函数的迭代器
idautils.Segments():返回当前程序中所有段的迭代器
idautils.Strings():返回当前程序中所有字符串的迭代器
idautils.XrefsFrom(ea):返回指向给定地址的所有交叉引用的迭代器idautils.Heads(ea,ea):获取指定地址段的汇编指令

4、使用示例

移除SVC指令:需要被移除的汇编指令如下:

MOV X0, #0x1F
MOV X1, #0
MOV X2, #0
MOV X3, #0
MOV W16, #0x1A
SVC 0x80

idapython脚本如下:

import idautils
import idc

# 获取二进制文件的起始地址和结束地址
start_addr = idc.get_inf_attr(idc.INF_MIN_EA)
end_addr = idc.get_inf_attr(idc.INF_MAX_EA)

print("Start")

# 遍历二进制文件中的所有指令
for addr in idautils.Heads(start_addr, end_addr):
    # 判断当前指令是否为svc指令
    mnem = idc.print_insn_mnem(addr)
    if mnem == "SVC":

        # 判断svc指令的前五行是否是mov指令
        prev1_addr = idc.prev_head(addr)
        prev2_addr = idc.prev_head(prev1_addr)
        prev3_addr = idc.prev_head(prev2_addr)
        prev4_addr = idc.prev_head(prev3_addr)
        prev5_addr = idc.prev_head(prev4_addr)
        if (
            idc.print_insn_mnem(prev1_addr) == "MOV"
            and idc.print_operand(prev1_addr, 0) == "W16"
            and idc.print_operand(prev1_addr, 1) == "#0x1A"
            and idc.print_insn_mnem(prev2_addr) == "MOV"
            and idc.print_operand(prev2_addr, 0) == "X3"
            and idc.print_operand(prev2_addr, 1) == "#0"
            and idc.print_insn_mnem(prev3_addr) == "MOV"
            and idc.print_operand(prev3_addr, 0) == "X2"
            and idc.print_operand(prev3_addr, 1) == "#0"
            and idc.print_insn_mnem(prev4_addr) == "MOV"
            and idc.print_operand(prev4_addr, 0) == "X1"
            and idc.print_operand(prev4_addr, 1) == "#0"
            and idc.print_insn_mnem(prev5_addr) == "MOV"
            and idc.print_operand(prev5_addr, 0) == "X0"
            and idc.print_operand(prev5_addr, 1) == "#0x1F"
        ):
            print '查找到一条MOV指令'
            # 将相关指令设为nop
            idc.PatchDword(addr, 0xd503201f)  # nop
            idc.PatchDword(prev1_addr, 0xd503201f)  # nop
            idc.PatchDword(prev2_addr, 0xd503201f)  # nop
            idc.PatchDword(prev3_addr, 0xd503201f)  # nop
            idc.PatchDword(prev4_addr, 0xd503201f)  # nop
            idc.PatchDword(prev5_addr, 0xd503201f)  # nop
print("End")

执行前:
图片
按下图操作执行上边的脚本
图片

图片
执行后效果如下:
图片

总结

这篇文章小牛试刀的介绍如何在IDA中使用IDAPython插件,这只是一部分应用场景,期待大家继续探索更多用法。提示:阅读此文档的过程中遇到任何问题,请关住工众好【移动端Android和iOS开发技术分享】或+99 君羊【812546729】
图片

1 声望
0 粉丝
0 条评论
推荐阅读
安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...

边城31阅读 7.2k评论 5

封面图
「持续兼容」微信H5选择照片(图片&视频)及拍照&录像
做过H5调用手机相册或者拍照的同学可能深有体会,在不同型号手机和不同的浏览器上表现各有差异,实属头疼。由于手机自带浏览器或者第三方浏览器实在太多,结合最近正在做的项目用户群体P90在微信上,文本单从兼容...

wuwhs6阅读 2.5k

封面图
🖼️ 如何解决 SVG 图片中字体失效的问题
如果你喜欢我的文章,希望点赞👍 收藏 📁 评论 💬 三连支持一下,谢谢你,这对我真的很重要!「SVG 图片中字体失效」的修复方案很简单,只想看答案翻到最后看结论就行。如果想看我的排查思路和具体原因可以从头开始...

卤代烃6阅读 1.4k

网易云音乐开源全链路埋点方案-曙光埋点(dawn)
网易云音乐开源了曙光埋点 dawn,一个跨多端的全链路埋点解决方案,旨在构造一个完美的数据理想国。曙光埋点创造性的提出了埋点虚拟树(VTree),并在此基础上实现了诸多能力,解决大前端侧埋点困难、精度差、不...

云音乐技术团队3阅读 2.5k

封面图
深度剖析 Runtime
做很多需求或者是技术细节验证的时候会用到 Runtime 技术,用了挺久的了,本文就写一些场景和源码分析相关的文章。先问几个小问题:class_rw_t的结构是数组,数组里面的元素是数组,那它是二维数组吗?为什么16字...

杭城小刘4阅读 1.1k

封面图
前端代码安全与混淆
作者:京东零售 周明亮一、友商网页分析1.1 亚马逊亚马逊商详地址: [链接]所有交互事件在页面初始化时,不进行下发,等待通过 js 请求后下发 具体点击事件js内容采用自执行方式,防止代码格式化。【无法调用 Chr...

京东云开发者1阅读 1.2k

封面图
前端安全13条,除了XSS/CSRF你还知道哪些?
大家好,我是沐华。最近面了一些前端,发现每次问到安全相关的问题,一些面试者只能说上来 XSS、CSRF、中间人攻击,就没了,于是写了这篇文章,总结了前端安全相关的点,给大家查缺补漏

沐华2阅读 271

封面图
1 声望
0 粉丝
宣传栏