经过这段时间的实践,总结了一下逆向开发调试的大体步骤,准备分篇幅记录的详细点,避免之后会忘掉。
基础阶段
- 远程登录
ssh
(可以通过ssh
进行远程登录,为了提高效率,可以通过usbmux
进行端口转发的方式进行链接) - 选择自己感兴趣的
APP
,使用cycript
进行界面嗅探,找出需要修改的UI的名称,以及动态调试一下相关的view,查看相关的view的responder
,进而找到控制器controller
,完成基本的内容定位 - 对于你想研究的APP使用
dumpdecrypted.dylib
进行脱壳操作,并导出脱壳的APP(DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /filepath
) - 使用
class-dump
导出脱壳app字节码
可执行文件头文件 - 根据第二步的嗅探后的相关内容定位到的类,在头文件中找出相关的类的信息
- 找出类中可能出现影响你想改动的
方法名称
,并记录下来 - 操作到此,可以通过
theos创建tweak
项目来hook
刚刚感觉可疑的方法 - 定位
影响功能
的方法之后,如果只是屏蔽方法
的调用内容,那么直接去除方法的实现
即可完成功能实现,如果此时需要修改方法内部的属性
,以及需要获取方法传递过来的参数
,此时就需要后序步骤的支持了
进阶阶段
- 进展到此,就是逆向中我觉得可以算做是进阶阶段了,此时由于需要获取某个方法传递过来的数据,仅仅通过静态分析
class-dump
出来的头文件,并不能够分析出传递过来的参数内容
。所以此时需要进行动态分析
了。 - 使用
IDA或者Hopper
来反编译已经脱壳的字节码可执行文件
,之后通过全局搜索反编译文件中的方法名称
,来定位目标方法对应的入口的地址(不含有ASLR
) - 通过
debugserver
来断点对应的APP,通过image list -o -f
来找到当前启动的APP的ASLR
地址 - 通过
IDA或者Hopper
拿到的感兴趣的方法的入口地址以及上一步拿到的ASLR地址
相加获取当前启动的APP
在内存中的真实地址,通过breakpoint set -a 0x反编译地址 + 0xALSR地址
来设置断点。 - 通过
lldb
执行程序到断点,此时分析反汇编代码,分析出对应寄存器存储
的参数值,并通过lldb
动态打印出相关的寄存器存储的信息(注意Arm64中x0~x28(低32位w0~w28)是通用寄存器,x0~x7寄存器用于存放函数参数,x0存放返回值,x29是fp寄存器(栈帧寄存器),x30是lr寄存器(链接寄存器),以及sp寄存器(堆栈寄存器)
。 - 通过获取寄存器中存储的内容来定位参数类型,以此为突破口,来确定
参数类型以及参数内容数据
,为后序的tweak铺垫
。 - 搞清楚函数的
参数内容
之后,就可以通过编写tweak相关的代码来实现自己想要的功能了。 - 使用
theos
通过nic.pl
来创建自己的项目,编写相关的逆向代码
完成相关的逆向操作。
以上的流程步骤每一个步骤都包含大量的配置
以及相关内容
的学习,所以准备分步骤
来进行逆向的内容记录,以保证相关的内容的详细记录。
附:
自动脱壳网站:http://www.dumpapp.com
网友评论