首页
社区
课程
招聘
[原创]某东签名算法解析(一)
发表于: 2020-11-14 18:29 15031

[原创]某东签名算法解析(一)

2020-11-14 18:29
15031

我们来分析某东的sign签名算法,先搜索一个商品,抓包结果:


一共十几个结果,一个一个去hook肯定不现实,我们点进去分析代码找到了这个部分:


这就简单了,我们在源头拦住,直接hook javax.crypto.spec.SecretKeySpec 相关的函数:

挂上我们心爱的frida跑着,Duang…… 某东app挂了,白屏,偶尔还重启。看来是监测到了被搞了。

之前看雪上读到过一篇检测 frida 的文章(参考链接在文末)。这里我们做了如下两步来反检测:

输出结果:

其实从字面上也能看出这不是我们要的结果,SHA256的结果是64位的字符串,而我们需要的sign是32位的。

怎么办? 把jadx里面能搜到的sign hook了遍都没有找到,只好从http请求下手了。

输出结果


很明显这个http请求是我们的目标,但是这个堆栈没有给我们有用的提示,这应该是启动了一个新的线程来做的http请求,所以组装参数的函数没有体现在这里。

我们仔细观察一下,请求里面有个 st=1605338355285 换算一下正好是当前的时间戳,那么我们hook java获取当前系统时间函数,然后找到和http请求里面相同的时间,再打印出堆栈,不就可以找到组装参数的地方了嘛

结果还是令人沮丧,没有和http请求里面的值相同的时间戳,看来要么app并没有用currentTimeMillis函数,要么就是在so层把活偷偷的干了。

这次前方传来好消息

Binary file ./libjdbitmapkit.so matchse

看来有可能是这哥们干的,拖进ida伺候。


找到它的调用者 Java_com_jingdong_common_utils_BitmapkitUtils_getSignFromJni,它应该就是目标了,hook之:


逮住了,就是它,收工。

sign的查找要多方尝试,除了直接了当的找sign还可以从它的兄弟参数入手。

参考链接: https://bbs.pediy.com/thread-217482.htm 多种特征检测 Frida

 
 
var secretKeySpec = Java.use('javax.crypto.spec.SecretKeySpec');
secretKeySpec.$init.overload('[B','java.lang.String').implementation = function (a,b) {
    var result = this.$init(a, b);
    console.log(">>> 算法名" + b);
    return result;
}
var secretKeySpec = Java.use('javax.crypto.spec.SecretKeySpec');
secretKeySpec.$init.overload('[B','java.lang.String').implementation = function (a,b) {
    var result = this.$init(a, b);
    console.log(">>> 算法名" + b);
    return result;
}
 
>>> 算法名HmacSHA256
mac ======================================
算法名:HmacSHA256
mac ======================================
doFinal参数:yingyan&{"msg":[{"appId":"","clientVersion":"9.2.2","buildCode":"85371","uuid":""}]}&85&android&9.2.2&xiaomi&Redmi 6A&uvReport&8.1.0&lc029&jd_AjVDrKGR&1344*720&27&1605345127514&xx-xx
doFinal结果(hex):3ac0a00ed48d8fffadef281d97b970c13b3c8dec06d685ae0d62615f28c7751b
>>> 算法名HmacSHA256
mac ======================================
算法名:HmacSHA256
mac ======================================
doFinal参数:yingyan&{"msg":[{"appId":"","clientVersion":"9.2.2","buildCode":"85371","uuid":""}]}&85&android&9.2.2&xiaomi&Redmi 6A&uvReport&8.1.0&lc029&jd_AjVDrKGR&1344*720&27&1605345127514&xx-xx
doFinal结果(hex):3ac0a00ed48d8fffadef281d97b970c13b3c8dec06d685ae0d62615f28c7751b

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
  • jd.js (7.04kb,185次下载)
收藏
免费 4
支持
分享
最新回复 (12)
雪    币: 477
活跃值: (1412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
直接还原过,这个sign和apk签名关联,不同签名算出结果不一样
2020-11-14 19:04
1
雪    币: 1420
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大佬您好,目前我也有相同的问题,但是想要直接调用getSignFromJNI这个函数;
Frida的话不知道第一个参数Context如何获取;
现在正在尝试自己写一个简单的安卓APP来调用这个so库。
所以想请教下,如果用Frida的话如何获取第一个Context参数呢。
2021-1-14 16:18
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
请问如何在SO文件中进行搜索?是要到linux 操作系统下 grep么?
2021-2-20 23:01
0
雪    币: 25
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
SniperOB 大佬您好,目前我也有相同的问题,但是想要直接调用getSignFromJNI这个函数; Frida的话不知道第一个参数Context如何获取; 现在正在尝试自己写一个简单的安卓APP来调用这个so ...
我也卡在这个了 我去new一个直接APP报错了就
2021-3-29 14:57
0
雪    币: 1348
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个多年前就搞过
2021-4-1 19:34
0
雪    币: 373
活跃值: (2183)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
SniperOB 大佬您好,目前我也有相同的问题,但是想要直接调用getSignFromJNI这个函数; Frida的话不知道第一个参数Context如何获取; 现在正在尝试自己写一个简单的安卓APP来调用这个so ...
public static Context applicationContext ;

try  {
                Class<?>  ContextClass  =   XposedHelpers.findClass("android.content.ContextWrapper",  loadPackageParam.classLoader);
                XposedHelpers.findAndHookMethod(ContextClass,  "getApplicationContext",  new  XC_MethodHook()  {
                    @Override
                    protected  void  afterHookedMethod(MethodHookParam  param)  throws  Throwable  {
                        super.afterHookedMethod(param);
                        if  (applicationContext  !=  null)
                            return;
                        applicationContext  =  (Context)  param.getResult();
                        log(" -->得到Context");
                    }
                });
            }  catch  (Throwable  t)  {
                log("-->获取Context出错");
                // XposedBridge.log(t);
            }

xposed下我是hook getApplicationContext 来得到的。  frida应该也可以hook这个
2021-4-9 14:02
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
SniperOB 大佬您好,目前我也有相同的问题,但是想要直接调用getSignFromJNI这个函数; Frida的话不知道第一个参数Context如何获取; 现在正在尝试自己写一个简单的安卓APP来调用这个so ...
应该可以从ActivityThread里拿
2021-4-11 23:33
0
雪    币: 1420
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
fenfei331 public static Context applicationContext ; try { Class ContextClass = Xpose ...
感谢大佬~
2021-4-12 14:32
0
雪    币: 1420
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
对,是可以的,能拿到这个数据
2021-4-12 14:32
0
雪    币: 24
活跃值: (158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
SniperOB 大佬您好,目前我也有相同的问题,但是想要直接调用getSignFromJNI这个函数; Frida的话不知道第一个参数Context如何获取; 现在正在尝试自己写一个简单的安卓APP来调用这个so ...
context的方法是固定的

 var currentApplication = Java.use('android.app.ActivityThread').currentApplication();
 var context = currentApplication.getApplicationContext();
2021-4-14 14:52
0
雪    币: 1420
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
mb_fozeycxb context的方法是固定的 var currentApplication = Java.use('android.app.ActivityThread').currentApplicatio ...
非常感谢。我通过看奋飞大佬的帖子,解决掉了这个问题,Thanks ~
2021-4-16 10:49
0
雪    币: 30
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
[Remote::com.jingdong.app.mall]-> Process terminated
2021-10-30 15:47
0
游客
登录 | 注册 方可回帖
返回
//