首页
社区
课程
招聘
[原创]frida基础 闯关训练 七层关卡
发表于: 2023-7-14 18:23 10816

[原创]frida基础 闯关训练 七层关卡

2023-7-14 18:23
10816

打开app首先映入眼前是一个常规的登录界面,输入用户名和密码,提示Login filed.显然用户名和密码随便输入肯定是不行了。

首先我们用objection定位到他的页面位置activity,再结合反编译工具对源码进行分析。

可以发现当前类的类已经找到了,objection hook这个类,再触发按钮,观察情况,打印出调用的方法,再hook之。

通过返回值可以大胆猜测,密码经过了加密,将返回值输入的确通过了第一关,不过还需要结合源码分析下。
图片描述
发现是 HmacSHA256 加密,然后我们可以hmac在线加密输入加密对比下结果没问题,输入密码进入下一关。
图片描述

界面提示点击进入下一关,肯定没那么简单,不出意外提示报错了。

这里只能结合源码分析了。
图片描述
将 R4jSLLLLLLLLLLOrLE7/5B+Z6fsl65yj6BgC6YWz66gO6g2t65Pk6a+P65NK44NNROl0wNOLLLL= 反向还原得到输入的密码,再用frida hook住b方法,则可进入到下一题。
a()b()方法的源码:

正规的算法还原,这里直接Hook通过了,后续在还原这个算法。

图片描述
修改 静态成员变量和非静态成员变量的值 即可通过,但是给出来了2个函数,出题人的想法应该是让我们触发按钮的时候,主动调用这2个函数,来改变成员变量的值。

观察代码:
图片描述
只要将三个成员变量的值改为true 即可通向下一关。

看源码:
图片描述
将check的值全部改为 true,即可通过下一关。

代码:
图片描述

代码:
图片描述

将调用的三个class的方法改成true,即可通关。

adb shell dumpsys window | grep CurrentFocus
 
#返回
mCurrentFocus=Window{5b2914b u0 com.example.androiddemo/com.example.androiddemo.Activity.LoginActivity}
adb shell dumpsys window | grep CurrentFocus
 
#返回
mCurrentFocus=Window{5b2914b u0 com.example.androiddemo/com.example.androiddemo.Activity.LoginActivity}
android hooking list activities 
 
#返回      
com.example.androiddemo.Activity.BaseFridaActivity
com.example.androiddemo.Activity.FridaActivity1
com.example.androiddemo.Activity.FridaActivity2
com.example.androiddemo.Activity.FridaActivity3
com.example.androiddemo.Activity.FridaActivity4
com.example.androiddemo.Activity.FridaActivity5
com.example.androiddemo.Activity.FridaActivity6
com.example.androiddemo.Activity.FridaActivity7
com.example.androiddemo.Activity.LoginActivity
com.example.androiddemo.MainActivity
 
 
android hooking watch class com.example.androiddemo.Activity.LoginActivity --dump-args --dump-backtrace --dump-return
#返回
(agent) [vv23m49gobd] Called com.example.androiddemo.Activity.LoginActivity.access$100(java.lang.Strinjava.lang.String)
(agent) [vv23m49gobd] Called com.example.androiddemo.Activity.LoginActivity.a(java.lang.String, java.lang.String)
(agent) [vv23m49gobd] Called com.example.androiddemo.Activity.LoginActivity.a([B)
(agent) [vv23m49gobd] Called com.example.androiddemo.Activity.LoginActivity.access$000(com.example.androiddemo.Activity.LoginActivity)           
 
android hooking watch class_method com.example.androiddemo.Activity.LoginActivity.a  --dump-args --dump-return
#返回:
(agent) [810lsp00gmj] Arguments com.example.androiddemo.Activity.LoginActivity.a([object Object])
(agent) [810lsp00gmj] Return Value: 82d476df642d6c882dcc438e028c6e0908af286439b7cd18975dc971387eb33a
(agent) [810lsp00gmj] Return Value: 82d476df642d6c882dcc438e028c6e0908af286439b7cd18975dc971387eb33a
android hooking list activities 
 
#返回      
com.example.androiddemo.Activity.BaseFridaActivity
com.example.androiddemo.Activity.FridaActivity1
com.example.androiddemo.Activity.FridaActivity2
com.example.androiddemo.Activity.FridaActivity3
com.example.androiddemo.Activity.FridaActivity4
com.example.androiddemo.Activity.FridaActivity5
com.example.androiddemo.Activity.FridaActivity6
com.example.androiddemo.Activity.FridaActivity7
com.example.androiddemo.Activity.LoginActivity
com.example.androiddemo.MainActivity
 
 
android hooking watch class com.example.androiddemo.Activity.LoginActivity --dump-args --dump-backtrace --dump-return
#返回
(agent) [vv23m49gobd] Called com.example.androiddemo.Activity.LoginActivity.access$100(java.lang.Strinjava.lang.String)
(agent) [vv23m49gobd] Called com.example.androiddemo.Activity.LoginActivity.a(java.lang.String, java.lang.String)
(agent) [vv23m49gobd] Called com.example.androiddemo.Activity.LoginActivity.a([B)
(agent) [vv23m49gobd] Called com.example.androiddemo.Activity.LoginActivity.access$000(com.example.androiddemo.Activity.LoginActivity)           
 
android hooking watch class_method com.example.androiddemo.Activity.LoginActivity.a  --dump-args --dump-return
#返回:
(agent) [810lsp00gmj] Arguments com.example.androiddemo.Activity.LoginActivity.a([object Object])
(agent) [810lsp00gmj] Return Value: 82d476df642d6c882dcc438e028c6e0908af286439b7cd18975dc971387eb33a
(agent) [810lsp00gmj] Return Value: 82d476df642d6c882dcc438e028c6e0908af286439b7cd18975dc971387eb33a
public static String a(byte[] bArr) throws Exception {
       StringBuilder sb = new StringBuilder();
       for (int i = 0; i <= bArr.length - 1; i += 3) {
           byte[] bArr2 = new byte[4];
           byte b = 0;
           for (int i2 = 0; i2 <= 2; i2++) {
               int i3 = i + i2;
               if (i3 <= bArr.length - 1) {
                   bArr2[i2] = (byte) (b | ((bArr[i3] & 255) >>> ((i2 * 2) + 2)));
                   b = (byte) ((((bArr[i3] & 255) << (((2 - i2) * 2) + 2)) & 255) >>> 2);
               } else {
                   bArr2[i2] = b;
                   b = 64;
               }
           }
           bArr2[3] = b;
           for (int i4 = 0; i4 <= 3; i4++) {
               if (bArr2[i4] <= 63) {
                   sb.append(table[bArr2[i4]]);
               } else {
                   sb.append('=');
               }
           }
       }
       return sb.toString();
   }
 
   public static byte[] b(String str) {
       try {
           ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
           GZIPOutputStream gZIPOutputStream = new GZIPOutputStream(byteArrayOutputStream);
           gZIPOutputStream.write(str.getBytes());
           gZIPOutputStream.finish();
           gZIPOutputStream.close();
           byte[] byteArray = byteArrayOutputStream.toByteArray();
           try {
               byteArrayOutputStream.close();
               return byteArray;
           } catch (Exception e) {
               e.printStackTrace();
               return byteArray;
           }
       } catch (Exception unused) {
           return null;
       }
   }
public static String a(byte[] bArr) throws Exception {
       StringBuilder sb = new StringBuilder();
       for (int i = 0; i <= bArr.length - 1; i += 3) {
           byte[] bArr2 = new byte[4];
           byte b = 0;
           for (int i2 = 0; i2 <= 2; i2++) {
               int i3 = i + i2;
               if (i3 <= bArr.length - 1) {
                   bArr2[i2] = (byte) (b | ((bArr[i3] & 255) >>> ((i2 * 2) + 2)));
                   b = (byte) ((((bArr[i3] & 255) << (((2 - i2) * 2) + 2)) & 255) >>> 2);
               } else {
                   bArr2[i2] = b;
                   b = 64;
               }
           }
           bArr2[3] = b;
           for (int i4 = 0; i4 <= 3; i4++) {
               if (bArr2[i4] <= 63) {
                   sb.append(table[bArr2[i4]]);
               } else {
                   sb.append('=');
               }
           }
       }
       return sb.toString();
   }
 
   public static byte[] b(String str) {
       try {
           ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
           GZIPOutputStream gZIPOutputStream = new GZIPOutputStream(byteArrayOutputStream);
           gZIPOutputStream.write(str.getBytes());
           gZIPOutputStream.finish();
           gZIPOutputStream.close();
           byte[] byteArray = byteArrayOutputStream.toByteArray();
           try {
               byteArrayOutputStream.close();
               return byteArray;
           } catch (Exception e) {
               e.printStackTrace();
               return byteArray;
           }
       } catch (Exception unused) {
           return null;
       }
   }
var FridaActivity1 = Java.use("com.example.androiddemo.Activity.FridaActivity1");
FridaActivity1["b"].implementation = function (str) {
    console.log("FridaActivity1.b is called: str=${str}", str);
    var result = this["b"](str);
    console.log("FridaActivity1.b result=${result}", JSON.stringify(result));
    return result;
};
 
FridaActivity1["a"].implementation = function (bArr) {
    console.log("FridaActivity1.a is called: bArr=${bArr}", JSON.stringify(bArr));
    var result = this["a"](bArr);
    console.log("FridaActivity1.a result=${result}", result);
    result = 'R4jSLLLLLLLLLLOrLE7/5B+Z6fsl65yj6BgC6YWz66gO6g2t65Pk6a+P65NK44NNROl0wNOLLLL='
    return result;
};
var FridaActivity1 = Java.use("com.example.androiddemo.Activity.FridaActivity1");
FridaActivity1["b"].implementation = function (str) {
    console.log("FridaActivity1.b is called: str=${str}", str);
    var result = this["b"](str);
    console.log("FridaActivity1.b result=${result}", JSON.stringify(result));
    return result;
};
 
FridaActivity1["a"].implementation = function (bArr) {
    console.log("FridaActivity1.a is called: bArr=${bArr}", JSON.stringify(bArr));
    var result = this["a"](bArr);
    console.log("FridaActivity1.a result=${result}", result);
    result = 'R4jSLLLLLLLLLLOrLE7/5B+Z6fsl65yj6BgC6YWz66gO6g2t65Pk6a+P65NK44NNROl0wNOLLLL='

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2023-7-17 18:19 被kanxue编辑 ,原因: 将百度网盘附件转本地
上传的附件:
收藏
免费 2
支持
分享
最新回复 (11)
雪    币: 859
活跃值: (945)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
很棒,值得新手学习!
2023-7-14 22:29
0
雪    币: 3535
活跃值: (31011)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2023-7-14 23:37
1
雪    币: 25885
活跃值: (5002)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢,apk能提供吗?
2023-7-14 23:59
0
雪    币: 4308
活跃值: (5605)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
huangyalei 谢谢,apk能提供吗?
链接:https://pan.baidu.com/s/1zTZ5p5-dtdHxQea4FYaRPw 
提取码:a5ho 
--来自百度网盘超级会员V1的分享
2023-7-15 08:29
1
雪    币: 10070
活跃值: (4471)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2023-7-15 11:37
0
雪    币: 109
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7

第五关-动态加载dex(你标题中的第六关)的另一种方法

Java.perform(function() {
    var CheckInterface = Java.use("com.example.androiddemo.Dynamic.CheckInterface");
    var RegisterClass = Java.registerClass({
                name: "com.dta.test.frida.activity.RegisterClass",
                implements : [CheckInterface],
                methods: {
                    check: {
                        returnType: "boolean",
                        argumentTypes:[],
                        implementation: function(){
                            return true
                        }
                    }
                }
            });
    Java.choose("com.example.androiddemo.Activity.FridaActivity5", {
        onMatch: function (instance) {
            instance.DynamicDexCheck.value = RegisterClass.$new();
        }, onComplete: function () {
        }
    });

});


2023-7-18 18:13
1
雪    币: 4234
活跃值: (4944)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2023-7-18 22:20
0
雪    币: 6
活跃值: (254)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
链接:https://pan.baidu.com/s/1zTZ5p5-dtdHxQea4FYaRPw  失效了
2023-7-26 09:01
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
第四关:修改成员变量 
same_name_bool_var 反编译出来是这个。但是frida 设置参数的时候为何是
_same_name_bool_var  多了一个下划线才生效
2023-8-23 16:42
0
雪    币: 225
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
第四关:修改成员变量 
根据思路解体,导致程序返回上一关之后就失效了,得重新hook 另外多个下划线不太明白
2023-9-1 17:19
0
雪    币: 22
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
wx_吉拉德 第四关:修改成员变量 same_name_bool_var 反编译出来是这个。但是frida 设置参数的时候为何是 _same_name_bool_var 多了一个下划线才生效
是因为same_name_bool_var字段名与same_name_bool_var函数名相同,所以需要在前面加个下划线
2024-2-21 15:48
0
游客
登录 | 注册 方可回帖
返回
//