返回列表 发新帖

《安卓逆向这档事》十五、是时候学习一下Frida一把梭了(下)

  [复制链接]

91

主题

3807

回帖

2万

积分

博士后

萌新

Rank: 8Rank: 8

金币
10363
好评
335
信誉
278

考神MT论坛帅哥MT论坛最佳新人MT论坛活跃会员

QQ
发表于 2023-10-3 12:02:41 | 显示全部楼层 | 阅读模式  来自 福建
本帖最后由 正己 于 2024-5-11 16:33 编辑






一、课程目标

1.了解Frida-Native-Hook
2.借助ida脚本实现一键式hook

二、工具

1.教程Demo(更新)
2.jadx-gui
3.VS Code
三、课程内容
1.Process、Module、Memory基础

3.Memory
`Memory`是一个工具对象,提供直接读取和修改进程内存的功能,能够读取特定地址的值、写入数据、分配内存等



2.枚举导入导出表

1. **导出表(Export Table)**:列出了库中可以被其他程序或库访问的所有公开函数和符号的名称。
2. **导入表(Import Table)**:列出了库需要从其他库中调用的函数和符号的名称。

简而言之,导出表告诉其他程序:“这些是我提供的功能。”,而导入表则表示:“这些是我需要的功能。”。

  1. js
  2. function hookTest1(){
  3.     Java.perform(function(){
  4.         //打印导入表
  5.         var imports = Module.enumerateImports("lib52pojie.so");
  6.         for(var i =0; i < imports.length;i++){
  7.             if(imports[i].name == "vip"){
  8.                 console.log(JSON.stringify(imports[i])); //通过JSON.stringify打印object数据
  9.                 console.log(imports[i].address);
  10.             }
  11.         }
  12.         //打印导出表
  13.         var exports = Module.enumerateExports("lib52pojie.so");
  14.         for(var i =0; i < exports.length;i++){
  15.             console.log(JSON.stringify(exports[i]));
  16.         }
  17.         
  18.     })
  19. }
复制代码

3.Native函数的基础Hook打印
1. 整数型、布尔值类型、char类型
  1. JS
  2. function hookTest2(){
  3.     Java.perform(function(){
  4.         //根据导出函数名打印地址
  5.         var helloAddr = Module.findExportByName("lib52pojie.so","Java_com_zj_wuaipojie_util_SecurityUtil_checkVip");
  6.         console.log(helloAddr);
  7.         if(helloAddr != null){
  8.                 //Interceptor.attach是Frida里的一个拦截器
  9.             Interceptor.attach(helloAddr,{
  10.                     //onEnter里可以打印和修改参数
  11.                 onEnter: function(args){  //args传入参数
  12.                     console.log(args[0]);  //打印第一个参数的值
  13.                     console.log(this.context.x1);  // 打印寄存器内容
  14.                     console.log(args[1].toInt32()); //toInt32()转十进制
  15.                                         console.log(args[2].readCString()); //读取字符串 char类型
  16.                                         console.log(hexdump(args[2])); //内存dump

  17.                 },
  18.                 //onLeave里可以打印和修改返回值
  19.                 onLeave: function(retval){  //retval返回值
  20.                     console.log(retval);
  21.                     console.log("retval",retval.toInt32());
  22.                 }
  23.             })
  24.         }
  25.     })
  26. }
复制代码

2. 字符串类型


  1. js
  2. function hookTest2(){
  3.     Java.perform(function(){
  4.         //根据导出函数名打印地址
  5.         var helloAddr = Module.findExportByName("lib52pojie.so","Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel");
  6.         if(helloAddr != null){
  7.             Interceptor.attach(helloAddr,{
  8.                 //onEnter里可以打印和修改参数
  9.                 onEnter: function(args){  //args传入参数
  10.                     // 方法一
  11.                     var jString = Java.cast(args[2], Java.use('java.lang.String'));
  12.                     console.log("参数:", jString.toString());
  13.                     // 方法二
  14.                     var JNIEnv = Java.vm.getEnv();
  15.                     var originalStrPtr = JNIEnv.getStringUtfChars(args[2], null).readCString();        
  16.                     console.log("参数:", originalStrPtr);                                
  17.                 },
  18.                 //onLeave里可以打印和修改返回值
  19.                 onLeave: function(retval){  //retval返回值
  20.                     var returnedJString = Java.cast(retval, Java.use('java.lang.String'));
  21.                     console.log("返回值:", returnedJString.toString());
  22.                 }
  23.             })
  24.         }
  25.     })
  26. }

复制代码


4.Native函数的基础Hook修改
1. 整数型修改
  1. js
  2. function hookTest3(){
  3.     Java.perform(function(){
  4.         //根据导出函数名打印地址
  5.         var helloAddr = Module.findExportByName("lib52pojie.so","Java_com_zj_wuaipojie_util_SecurityUtil_checkVip");
  6.         console.log(helloAddr);
  7.         if(helloAddr != null){
  8.             Interceptor.attach(helloAddr,{
  9.                 onEnter: function(args){  //args参数
  10.                     args[0] = ptr(1000); //第一个参数修改为整数 1000,先转为指针再赋值
  11.                     console.log(args[0]);
  12.                      
  13.                 },
  14.                 onLeave: function(retval){  //retval返回值
  15.                     retval.replace(20000);  //返回值修改
  16.                     console.log("retval",retval.toInt32());
  17.                 }
  18.             })
  19.         }
  20.     })
  21. }
复制代码

2. 字符串类型修改
  1. js
  2. function hookTest2(){
  3.     Java.perform(function(){
  4.         //根据导出函数名打印地址
  5.         var helloAddr = Module.findExportByName("lib52pojie.so","Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel");
  6.         if(helloAddr != null){
  7.             Interceptor.attach(helloAddr,{
  8.                 //onEnter里可以打印和修改参数
  9.                 onEnter: function(args){  //args传入参数
  10.                     var JNIEnv = Java.vm.getEnv();
  11.                     var originalStrPtr = JNIEnv.getStringUtfChars(args[2], null).readCString();        
  12.                     console.log("参数:", originalStrPtr);
  13.                     var modifiedContent = "至尊";
  14.                     var newJString = JNIEnv.newStringUtf(modifiedContent);
  15.                     args[2] = newJString;                                
  16.                 },
  17.                 //onLeave里可以打印和修改返回值
  18.                 onLeave: function(retval){  //retval返回值
  19.                     var returnedJString = Java.cast(retval, Java.use('java.lang.String'));
  20.                     console.log("返回值:", returnedJString.toString());
  21.                     var JNIEnv = Java.vm.getEnv();
  22.                     var modifiedContent = "无敌";
  23.                     var newJString = JNIEnv.newStringUtf(modifiedContent);
  24.                     retval.replace(newJString);
  25.                 }
  26.             })
  27.         }
  28.     })
  29. }
复制代码


5.SO基址的获取方式
  1. js
  2. var moduleAddr1 = Process.findModuleByName("lib52pojie.so").base;  
  3. var moduleAddr2 = Process.getModuleByName("lib52pojie.so").base;  
  4. var moduleAddr3 = Module.findBaseAddress("lib52pojie.so");
复制代码

6.Hook未导出函数与函数地址计算
  1. js
  2. function hookTest6(){
  3.     Java.perform(function(){
  4.         //根据导出函数名打印基址
  5.         var soAddr = Module.findBaseAddress("lib52pojie.so");
  6.         console.log(soAddr);
  7.         var funcaddr = soAddr.add(0x1071C);  
  8.         console.log(funcaddr);
  9.         if(funcaddr != null){
  10.             Interceptor.attach(funcaddr,{
  11.                 onEnter: function(args){  //args参数

  12.                 },
  13.                 onLeave: function(retval){  //retval返回值
  14.                     console.log(retval.toInt32());
  15.                 }
  16.             })
  17.         }
  18.     })
  19. }
复制代码


函数地址计算
1. 安卓里一般32 位的 so 中都是`thumb`指令,64 位的 so 中都是`arm`指令
2. 通过IDA里的opcode bytes来判断,arm 指令为 4 个字节(options -> general -> Number of opcode bytes (non-graph)  输入4)
3. thumb 指令,函数地址计算方式: so 基址 + 函数在 so 中的偏移 + 1  
        arm 指令,函数地址计算方式: so 基址 + 函数在 so 中的偏移

7.Hook_dlopen
dlopen源码
android_dlopen_ext源码

  1. js
  2. function hook_dlopen() {
  3.     var dlopen = Module.findExportByName(null, "dlopen");
  4.     Interceptor.attach(dlopen, {
  5.         onEnter: function (args) {
  6.             var so_name = args[0].readCString();
  7.             if (so_name.indexOf("lib52pojie.so") >= 0) this.call_hook = true;
  8.         }, onLeave: function (retval) {
  9.             if (this.call_hook) hookTest2();
  10.         }
  11.     });
  12.     // 高版本Android系统使用android_dlopen_ext
  13.     var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext");
  14.     Interceptor.attach(android_dlopen_ext, {
  15.         onEnter: function (args) {
  16.             var so_name = args[0].readCString();
  17.             if (so_name.indexOf("lib52pojie.so") >= 0) this.call_hook = true;
  18.         }, onLeave: function (retval) {
  19.             if (this.call_hook) hookTest2();
  20.         }
  21.     });
  22. }
复制代码


8.借助IDA脚本实现一键式hook

IDA&Frida 学习


五、答疑

待更新
六、视频及课件地址


百度云
阿里云
哔哩哔哩
开源项目地址
PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压

七、其他章节

《安卓逆向这档事》一、模拟器环境搭建  
《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改  
《安卓逆向这档事》三、初识smail,vip终结者  
《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡  
《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩  
《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向  
《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api  
《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook  
《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗  
《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?  
《安卓逆向这档事》十二、大佬帮我分析一下  
《安卓逆向这档事》番外实战篇1-某电全家桶  
《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)
《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)
《安卓逆向这档事》十五、是时候学习一下Frida一把梭了(下)
《安卓逆向这档事》十六、是时候学习一下Frida一把梭了(终)
《安卓逆向这档事》十七、你的RPCvs佬的RPC
《安卓逆向这档事》番外实战篇2-【2024春节】解题领红包活动,启动!

八、参考文档
FRIDA-API使用篇:rpc、Process、Module、Memory使用方法及示例
IDA&Frida 学习
Frida Hook 常用函数、java 层 hook、so 层 hook、RPC、群控



已有5人评分好评 金币 理由
肖博坤 + 1 + 1
mykingback + 1 + 1 很给力!
虚伪的鲲 + 1 + 1
naoguazi000 + 1
小杜 + 1 赞一个!

查看全部评分 总评分:好评 +4  金币 +4 

回复

使用道具 举报

91

主题

3807

回帖

2万

积分

博士后

萌新

Rank: 8Rank: 8

金币
10363
好评
335
信誉
278

考神MT论坛帅哥MT论坛最佳新人MT论坛活跃会员

QQ
发表于 2023-10-3 12:03:29 | 显示全部楼层  来自 福建
路过的师傅们点点star哇
回复

使用道具 举报

0

主题

962

回帖

2361

积分

大学生

Rank: 5Rank: 5

金币
242
好评
2
信誉
100
QQ
发表于 2023-10-3 12:04:36 来自手机  | 显示全部楼层  来自 重庆
看看隐藏
回复

使用道具 举报

372

主题

1万

回帖

3万

积分

博士后

       

Rank: 8Rank: 8

金币
3329
好评
175
信誉
118
发表于 2023-10-3 12:06:56 来自手机  | 显示全部楼层  来自 广东
   学习学习

  
回复

使用道具 举报

6

主题

1051

回帖

3852

积分

大学生

Rank: 5Rank: 5

金币
2216
好评
0
信誉
100
发表于 2023-10-3 12:07:31 来自手机  | 显示全部楼层  来自 四川
感谢你的分享
回复

使用道具 举报

46

主题

944

回帖

3140

积分

大学生

Rank: 5Rank: 5

金币
1270
好评
9
信誉
126

考神MT论坛新人MT论坛活跃会员

发表于 2023-10-3 12:08:06 来自手机  | 显示全部楼层  来自 河北
看看隐藏
回复

使用道具 举报

79

主题

740

回帖

3399

积分

大学生

Rank: 5Rank: 5

金币
354
好评
12
信誉
101

MT论坛帅哥MT论坛最佳新人

QQ
发表于 2023-10-3 12:08:09 来自手机  | 显示全部楼层  来自 陕西
我小杜来支持你了!
回复

使用道具 举报

66

主题

3388

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
7491
好评
62
信誉
105

考神MT论坛活跃会员

发表于 2023-10-3 12:10:24 来自手机  | 显示全部楼层  来自 江西
大佬我来啦啦啦啦啦
回复

使用道具 举报

66

主题

3388

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
7491
好评
62
信誉
105

考神MT论坛活跃会员

发表于 2023-10-3 12:10:57 来自手机  | 显示全部楼层  来自 江西
正己 发表于 2023-10-3 12:03
路过的师傅们点点star哇

楼主是我的入门大佬
回复

使用道具 举报

4

主题

6254

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
3952
好评
5
信誉
96

考神MT论坛帅哥MT论坛新人

发表于 2023-10-3 12:11:30 来自手机  | 显示全部楼层  来自 河南
多谢分享
回复

使用道具 举报

25

主题

3504

回帖

1万

积分

博士生

相互关注

Rank: 7Rank: 7Rank: 7

金币
2762
好评
23
信誉
95

考神MT论坛最佳新人MT论坛新人

发表于 2023-10-3 12:16:32 来自手机  | 显示全部楼层  来自 河南
感谢正己大佬带我入门
回复

使用道具 举报

0

主题

7273

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
2246
好评
8
信誉
124

考神

发表于 2023-10-3 12:17:38 来自手机  | 显示全部楼层  来自 广东
看看大佬
回复

使用道具 举报

55

主题

4003

回帖

8188

积分

硕士生

Rank: 6Rank: 6

金币
1873
好评
2
信誉
98

考神

发表于 2023-10-3 12:17:40 来自手机  | 显示全部楼层  来自 浙江
没时间玩啊
回复

使用道具 举报

152

主题

7921

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
11462
好评
10
信誉
104

MT论坛最佳新人考神MT论坛新人MT论坛帅哥

发表于 2023-10-3 12:20:51 来自手机  | 显示全部楼层  来自 云南
看看隐藏
回复

使用道具 举报

16

主题

1778

回帖

1万

积分

博士生

阿巴阿巴

Rank: 7Rank: 7Rank: 7

金币
2219
好评
244
信誉
190
发表于 2023-10-3 12:20:56 来自手机  | 显示全部楼层  来自 贵州
看看隐藏
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表