frida
- https://frida.re/docs/android/
- https://github.com/frida/frida/releases
- https://frida.re/docs/javascript-api/
- https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/
1 |
|
frida
监控和修改APP行为,适合临时调试的场景
安装服务端
检查CPU版本
1 |
|
https://github.com/frida/frida/releases 最新的下载,试着装一下看看是否适配,frida-server开启后,模拟器是否正常,打开点击app之类。可以查看到Frida server与Frida-tools对应关系。如果最新可以用,pip就不指定版本
根据abi和服务器类型,选择下载frida-server-15.2.2-android-x86.xz
1 |
|
安装客户端
1 |
|
客户端接入方式
1 |
|
非标准端口
1 |
|
python client
常用函数
在AndroidMainfest.xml里面查看想控制的activity。或者使用MT
拿到activity name
hook 对象属性和方法
1 |
|
枚举
遍历已加载的类
1 |
|
动态加载的dex
1 |
|
主动调用类函数
dex注入
写一个java class 打包成dex,可以删掉一些没用的smail,重新打包成dex,放到手机目录
写文件
1 |
|
调用栈
1 |
|
SO
枚举
导入导出表
1 |
|
so 文件
1 |
|
hook 导出函数
函数名可以在导出表找到,通过导出表的数据结构,用函数名称进行函数的定位
1 |
|
hook未导出函数sub_1232 之类,这里需要根据函数特征(比如字符串等),手动搜索关键字符串定位函数地址
- 写代码时使用
attribute((visibility("hidden")))
关键字隐藏导出 - 编译后被开发者、加固壳或者第三方框架修改
elf
格式被加密抹去相关信息。
1 |
|
因为无导出的函数无法通过函数名去定位地址,所以这里只能通过手动定位去找到函数对应的偏移,注意确定偏移的时候要注意使用的 so 是v7 arm32
还是 v8 arm64
。
这里可以根据情况用字符串或者看上下级调用定位到偏移,这里函数 func_no_exp
的偏移是 0x7078
(这种函数在 IDA 里面一般是 sub_xxx xxx
是 16 进制的地址),如下图:
1 |
|
在 Thumb 指令集下,偏移地址需要进行 +1 操作
判断指令
通过Edit->segments->change segment register value;或者 alt +G
改变T的值。
-
0为Arm指令,
-
1为Thumb指令
替换原方法
1 |
|
指针返回值
1 |
|
hook dlopen
- dlopen:该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。这种机制使得在系统中添加或者删除一个模块时,都不需要重新进行编译。
- dlsym:在打开的动态库中查找符号的值。
-
dlclose:关闭动态库。
- dlerror:返回一个描述最后一次调用dlopen、dlsym,或dlclose的错误信息的字符串。
1 |
|
jni
JNIEnv
1 |
|
libart https://github.com/lasting-yang/frida_hook_libart
libart.so 动态库是 Android 的 Art 虚拟机使用的动态库 。Android 5.1 及以上系统使用 Art 虚拟机
java虚拟机一般都是以动态库的形式暴露给外界,供外部开发者来集成使用的。 在art中,它的文件名叫做libart.so
1 |
|
libc
1 |
|
libc 替换
1 |
|
调用栈
1 |
|