1. so 动态库
在 apk 的 lib 目录下,存放的是 so 文件,一般有以下几个目录
Armeabi:arm 编码的文件
Armeabi:arm 新版编码文件
x86:Intel x86 汇编文件
…其他的文件:对应其他版本的汇编文件
这些都是 Android 的 Elf 格式文件
2. IDA 动态调试
启动式调试:
1) push IDA 目录下的 android_server 到手机中的./data/local/tmp 中,push 的时候建议重命名,因为有些壳会检测出 android_server
2) 启动服务端:chmod 777 android_server
3) 启动 android_server:./android_server(-p 端口号可以转换调试端口,某些壳会监听默认的调试端口)
4) 端口转发:adb forward tcp:pc_port tcp:mobile_port
5) ida 调试端口设置:Debugger --> Process Option --> Hostname:localhost Port:port
6) 程序启动:adb shell am start –D –n PackageName/ActivityName
7) ida 挂接:Debugger --> Attach to Process
8) jdb connect(需要先打开 monitor,类似于 java 的调试)
jdb –connect com.sun.jdi.SocketAttach:hostname=127.0.0.1, port=8700
3. Arm 调试基本说明
1) 快捷键,类似于 OD:F2 下断点,F7 单步步入,F8 单步步过,F9 运行,F4 运行到鼠标
2) 反编译窗口
3) 寄存器窗口
4) 数据窗口
5) 堆栈窗口
6) 输出窗口
7) 模块窗口
8) 函数窗口
......
多做笔记
4. so 文件信息
Elf 文件查看工具:readelf;执行环境:linux
参数:
-a 显示 so 文件所有信息
-h ELF 文件头
-l Program header,动态加载时需要的信息
-S Section header 静态加载分析时需要的信息
-e 同样头信息,elf header,section header,program header
-s 显示符号表
-d 显示动态节
一般使用 readelf 工具来获得 so 的详细信息
5. So Helper
可以用来快速地获取 so 的一些基本信息,提供较弱的汇编功能
6. so 文件加载顺序
Soloader --> Init_array --> JNI_onLoad --> 其他奇怪的函数 --> fini_array
7. 堆栈
堆栈用于保存函数中的临时变量,以及某些寄存器的值,退出时候用堆栈的数据来还原运行环境,如寄存器等等。
8. 堆栈平衡原理
对于每个函数,堆栈总是平衡的。即函数进入前注册了多少堆栈空间,退出时需要释放多少堆栈空间。
9. 临时变量与全局变量
1) 全局变量:
存在于程序内存数据中,所有函数都可以直接调用。
2) 临时变量:
存在于函数堆栈中,函数进入时分配空间(于堆栈中),函数退出时释放空间。
10. 指针
int a = 10;
int *p = &a;
p 就是指针,它的值指向 a
11. 二进制,八进制,十六进制
计算机底层使用二进制来存储数据,二进制、八进制和十六进制之间可以相互转化。
12. 函数参数传递
Arm 遵循 ATPCS 规则,前 4 个参数使用 R0-R3 传递,其他均通过堆栈传递。
13. IDA_F5 插件
快捷键:
N:重命名键
Y:设置变量类型
X:交叉引用
/:添加函数注释
:隐藏强制转换
双击:跳转到相应的位置
ESC:返回到上一级
14. Tencent2016A.apk
sub1634 函数(check 函数)的内容
PassEnc1(base64DecodeLen)函数:
PassEnc2(base64Decode)函数:
注册机代码:
15. ARM 与 与 Thumb
so 文件中存在两种形式的代码,ARM 和 Thumb。一般 ARM 每行代码占 4 个字节码,Thumb 每个指令占 2 个字节码,两者不能混用,但是可以通过 BX 和 BLX 等指令在跳转的时候实现切换。同时,ida 对此的识别也有问题,可能会把 Thumb 代码识别为 ARM,或者反着来。这时一旦调试运行到相应位置,便会报出异常导致程序退出。使用 Alt+G可以修改相应的识别。代码修改:一般没有现成的代码修改工具,可以使用 SoHelper 完成简单的修改,也可以先查汇编指令,然后在 ida 上进行字节码的修改。
16. ARM ,Thumb 跳转指令
偏移计算
ARM:低 27 位是偏移位置
下跳:偏移 = (目标地址 – 当前 PC 地址)/ 指令长度 正数下跳,负数上跳Thumb 同理,对应地:目标地址 = 偏移 * 指令长度 + 当前 PC 地址
17. 修改 So 文件
修改对比结果:
替换 app 的 so 文件
重启 APP 后可以看到效果。
18. Cydia native Hook
Cydia 的 native Hook 功能不支持 art 模式的 java hook,只对 so 文件下钩子就可以了。
设置需要加载库 dl,然后就可以根据 Cydia 的 sdk 来进行重写了。
19. Hook Demo
对 Hello3 下钩子,将其替换为 HelloHook
对 so 文件进行反编译分析
Hello3 函数代码:
HelloHook 函数代码:
init_开头的函数是对 so 文件加载时对某些全局变量或者函数变量初始化的地方在下钩函数的起始位置下好断点
对下钩子的过程进行跟踪调试
Hello3 的原版函数
HelloHook 的原版函数
下钩以后的 Hello3 函数
Hello3 --> HelloHook --> Hello3
20. Hook 原理