首页
论坛
课程
招聘
[原创]Android 某东Sign与cipher解密
2022-12-21 15:37 8913

[原创]Android 某东Sign与cipher解密

2022-12-21 15:37
8913

Android 某东Sign与cipher解密

最近疫情原因,哎,又沦落到了抢抢抢的境地,洋洋洒洒的网页端一气呵成写了个小助手哈,想要买莲花清瘟,一看只能手机APP购买。我去!真无语!那么再拿手机端开个刀吧,作如下记录。

 

主要功能涉及如下:

 

1.解密sign

 

2.解密cipher

1.APP版本:


 

For Android V11.3.2 build98450

2.工具


 

预先善其事,必先利其器!请先准备如下分析工具

  1. Jadx
  2. IDA
  3. Frida
  4. unidbg
  5. Charles
  6. Pycharm(可选)
  7. Vscode(可选)

3.分析

手机环境配置抓包请大家自己解决。下面演示购物车数据的抓取功能。从手机到PC端代码实现。

Charles抓包

打开手机app,然后再点击购物车功能

 

https://api.m.*.com/client.action

 

我们在Charles会看到很多这个地址的请求,我们可以找一下购物车的包,地址中包含 functionid=cart 的就是购物车的请求
图片描述

 

我们详细的看一下这个请求所携带的数据如下:

 

图片描述

 

经过多次抓包查看,发现这三个值是变化的。因此我们开始分析APP。

Sign-Jadx静态分析

把app导入到jadx,我们要追踪st,sign,sv这三个参数的来源,那么我们线搜索一下,大概找下sign的位置

 

图片描述

 

看到我标注的那个方法,addQueryParameter 翻译一下不就是添加sign参数嘛。点进去分析看看。

 

经过frida注入调试,分析出确实是这个方法 但是他是不进这个if的,不是这上半部分的代码,而是下半部分的代码

 

图片描述

 

最终定位到是下面的这行代码生成的sign,而且还有其他的2个参数 st与sv

 

图片描述

 

我们继续点击这个函数进去看一下发现是个接口。有接口必然有实现!

 

图片描述

 

那么如何去找它的实现类呢?我们继续搜索搜索这个类的完整路径 com.jingdong.jdsdk.d.c.s

 

图片描述

 

我们继续点击进去第一个,发现果真找到了接口的实现类如下:

 

图片描述

 

最终我们看到sign是调用的so....白瞎了之前的一顿操作。至此分析结束。那么我们用frida来验证下是不是这样。

Sign-Frida注入验证

注意新版京东有检测frida的,需要改个进程名跟端口。

 

用frida注入如下函数 BitmapkitUtils.getSignFromJni(context, str, str2, str3, str4, str5);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function HookHandle(clazz) {
    clazz.getSignFromJni.implementation = function (a, b, c, d, e, f) {
        console.log("=======================================")
        var r = this.getSignFromJni(a, b, c, d, e, f);
        console.log("param1: ", a)
        console.log("param2: ", b)
        console.log("param3: ", c)
        console.log("param4: ", d)
        console.log("param5: ", e)
        console.log("param6: ", f)
        console.log("result: ", r)
        return r;
    }
    console.log("HookHandle ok")
}
 
Java.perform(function () {
    Java.choose("dalvik.system.PathClassLoader", {
        onMatch: function (instance) {
            try {
                var clazz = Java.use('com.jingdong.common.utils.BitmapkitUtils');
                HookHandle(clazz)
                return "stop"
            } catch (e) {
                console.log("next")
                console.log(e)
            }
        },
        onComplete: function () {
            console.log("success")
        }
    })
})

请使用上面这种注入方法,不然会发生找不到类的错误。

 

图片描述

 

如上,我们可以看出,st sign sv都是从so来的。

 

至此,sign的来源已理清。

 

但是我们还有一个body的加密字段

 

图片描述

 

我们继续重复上面的分析。

cipher-Jadx静态分析

继续搜索”cipher“字段

 

图片描述

 

可以看到就一个类,那么就很简单的可以得出加密算法了

 

图片描述

 

通过frida注入这个b函数会发现b参数==MODIFIED_BASE64 就是进入的这个if,而且加密算法就在d.b()这个方法。直接用java还原就行了。

4.调用

sign签名用unidbg模拟调用so就可以了。cipher这个直接复制d这个类就包含了加解密。然后模拟登录再请求购物车信息就ok啦。

 

结果展示获取购物车数据:

 

图片描述


Unidbg 模拟执行精讲

最后于 2022-12-21 15:39 被胡家二少编辑 ,原因: update
收藏
点赞0
打赏
分享
最新回复 (6)
雪    币: 179
活跃值: 活跃值 (151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sheep_fish 活跃值 2023-1-3 17:02
2
0
frida 过不去 直接闪退了  已经改了进程名和端口了
雪    币: 107
活跃值: 活跃值 (1064)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
胡家二少 活跃值 2023-1-4 11:30
3
0
sheep_fish frida 过不去 直接闪退了 已经改了进程名和端口了
请问APP版本多少呢,在我发的这个版本分析是可以使用端口+进程名修改过检测的。
雪    币: 179
活跃值: 活跃值 (151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sheep_fish 活跃值 2023-2-20 22:20
4
0
搞定了谢谢 原来是模拟器的问题 换了真机好了
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
渣渣想太多 活跃值 2023-3-2 14:15
5
0
您好大佬,可以给个联系方式么?有点困难
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_wmkvshgm 活跃值 2023-3-13 16:54
6
0
老哥接单么
游客
登录 | 注册 方可回帖
返回