首页
社区
课程
招聘
[原创]某东算法分析
发表于: 2022-3-30 16:50 42846

[原创]某东算法分析

2022-3-30 16:50
42846

> 直接搜索sign参数匹配的出来的结果太多了,一时间不好区分哪个是真的。于是使用getSign为前缀搜索

> 运气不错搜索到一个native方法 前缀也是getSign的方法名,打开这个类。找下引用位置进一步确认下是否为计算sign的类

> 最终在BaseApplication里面找到这个类引用,可以确定这个就是计算sign的类

frida hook这个方法得到结果如下:

> 根据hook结果稍加分析大概知道各个参数代表的意义:

>context:上下文对象

>str:url路径

>str2:请求body信息

>str3:55a9c688729bb118  为KEY 16位长度,且每次请求都固定

>str4:android 为平台

>str5:版本号

> 查看源码大概得出str3 的为installationId生成规则是UUID 随机16位长度,在app第一次安装的时候创建保存在缓存中.

> 1.第一步当然是补环境了:

> 需要补充返回一个application对象,偷个懒想从AbstractJni 这里copy一份

> 重新运行一下又报错了,这个错是找不到对应的methodId、于是想着把Application换成Activity也可以,毕竟Activity也是可以获取Application对象的

> 重新运行就没问题了,接下来继续报错补环境,返回apk的路径。很简单

> 图上这个返回刚开始不知道传具体什么参数,于是打算看看源码。结果没有反编译出来具体的函数实现。于是用frida hook了这个方法拿到图下的返回 

> 第一个参数为:app安装目录  第二个参数为META-INF 目录 第三个是RSA

> 既然这样就直接返回RSA公钥了

> 继续补充环境

> 继续补充环境,需补充如下

> 继续补充环境,从反编译的源码中copy 一份objectToBytes方法即可然后构造ByteArray返回即可

> 运行报错,还缺少环境

> 重新继续补充环境 这部分环境补充比较简单 直接上最后运行结果

> 黑盒调用没问题了,接下来开始分析sign具体是怎么生成的。全部代码如下:

ida导入so 包  export导出中找到sign生成方法  截图如下:

F5生成伪代码

根据方法的具体逻辑修改了下方法名称 方便直观查看。初步观察是讲传入参数通过key=value 的方式拼接起来

通过unidbg的执行日志中也可以发现这点

接下来开始从函数返回的地方开始往上分析,单独调用执行返回如下:


st=1648374072802&sign=8102aefd41782d405174725cd433c5a0&sv=111


从上可知要分析的为st 、sign、sv这个三个值

1.st生成分析:生成一个时间戳 长度为13位的 用于计算sign

2.sign的生成:

分析伪代码找到sign的生成方法为sub_126AC,该方法上面的伪代码都是一些拼接字符串的操作,就是把入参拼接起来。

> 接下来开始unidbg hook该方法

> 然后开启无尽的S 单步执行往下走当程序走到switch判断时 发现bl指令跳转到sub_10de4函数  多次在这个位置debugger 到 发现 到 sv =111 走的是 case 2   还遇到过sv = 110 走的是case 1 、这部分我们只分析为2的情况也就是走sub_10DE4,至于为啥呢?就是因为这后面走的加密算法看起来简单些 像md5 

> 查看下函数sub_10de4入参,hook该函数

> 打印mr1,为一串固定的字符串


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

最后于 2022-3-30 17:16 被那年没下雪编辑 ,原因:
收藏
免费 28
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  抚琴   +1.00 2022/03/31
最新回复 (35)
雪    币: 11684
活跃值: (7169)
能力值: ( LV13,RANK:550 )
在线值:
发帖
回帖
粉丝
2
写的不错
2022-3-30 16:51
0
雪    币: 1490
活跃值: (9913)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
3
666。收藏+1
2022-3-30 17:04
0
雪    币: 2194
活跃值: (1038)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
真他妈牛逼,666,我滴宝贝,甘拜下风。代码逻辑分析那块到位,unidbg和ida用的着实不错。顺藤摸瓜找到sign生成原理,步步为营,细节分析到位。
2022-3-30 17:13
0
雪    币: 232
活跃值: (237)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
牛逼 收藏+1
2022-3-30 17:27
0
雪    币: 499
活跃值: (2189)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
666 都开始搞
2022-3-30 17:40
0
雪    币: 398
活跃值: (458)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
666,膜拜
2022-3-30 19:34
0
雪    币: 27
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
膜 6
2022-3-31 11:50
0
雪    币: 57
活跃值: (105)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
def encryption(input):
       arr = [0x37, 0x92, 0x44, 0x68, 0xA5, 0x3D, 0xCC, 0x7F, 0xBB, 0xF, 0xD9, 0x88, 0xEE, 0x9A, 0xE9, 0x5A]
       key2 = b"80306f4370b39fd5630ad0529f77adb6"
       arr1 = [0 for _ in range(len(input))]
       for i in range(len(input)):
               r0 = int(input[i])
               r2 = arr[i & 0xf]
               r4 = int(key2[i & 7])
               r0 = r2 ^ r0
               r0 = r0 ^ r4
               r0 = r0 + r2
               r2 = r2 ^ r0
               r1 = int(key2[i & 7])
               r2 = r2 ^ r1
               arr1[i] = r2 & 0xff
       return bytes(arr1)

直接使用python验证,看是否正确

最后于 2022-3-31 13:19 被eyascn编辑 ,原因:
2022-3-31 13:12
0
雪    币: 1133
活跃值: (6144)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
10
eyascn def encryption(input):       &nb ...
是正确的
2022-3-31 13:56
0
雪    币:
活跃值: (154)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
大佬666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
2022-3-31 14:22
0
雪    币:
活跃值: (154)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
2022-3-31 14:22
0
雪    币:
活跃值: (154)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
真他妈牛逼,666,我滴宝贝,甘拜下风。代码逻辑分析那块到位,unidbg和ida用的着实不错。顺藤摸瓜找到sign生成原理,步步为营,细节分析到位。
2022-3-31 14:22
0
雪    币:
活跃值: (154)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
2022-3-31 14:23
0
雪    币: 17
活跃值: (228)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
666,我滴宝贝,甘拜下风
2022-3-31 22:48
0
雪    币: 2447
活跃值: (1736)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
写的不错,好多工具都不太会用
2022-4-5 21:40
0
雪    币: 566
活跃值: (990)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
感谢分享
2022-4-6 18:47
0
雪    币: 2569
活跃值: (1183)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
厉害了大神
2022-4-6 23:46
0
雪    币: 231
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
eyascn def encryption(input):       &nb ...
老哥,请问input内容是什么呢,谢谢
2022-4-14 01:48
0
雪    币: 864
活跃值: (5124)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
nb666
2022-4-20 11:04
0
雪    币: 2447
活跃值: (1736)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
nb666
2022-4-24 10:41
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
写的不错
2022-4-24 11:48
0
雪    币: 1771
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
太厉害了
2022-5-27 16:17
0
雪    币: 735
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
nanfang- 老哥,请问input内容是什么呢,谢谢
看文章里面参数4就是input
2022-5-28 13:58
0
雪    币: 212
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
太厉害了
2022-5-28 16:35
0
游客
登录 | 注册 方可回帖
返回
//