首页
社区
课程
招聘
[原创]最右sign-v2签名算法追踪及逆向还原
2020-9-30 11:06 99417

[原创]最右sign-v2签名算法追踪及逆向还原

2020-9-30 11:06
99417

本篇文章应该于N个月前就写了,由于拖延症一直拖到现在。

其实一直打算写一系列逆向实战 比如某音 某手 某乎 某宝,也不知道会不会有时间且不拖延的写下去。

好了 言归正传 上次分析的最右APP版本为4.2.1 已经是18年10月的时候了 当时签名算法只有一个"sign"  而本次分析的是目前最新版本5.5.9 

最新版本的变化有两处

1.新增了"sign-v2"算法

2.request data 以及 response data 内容进行了加密

OK 我们直接来抓包 具体如何抓包上篇文章有讲 就不在此具体描述了

可以看到 请求中"sign=v2-xxxxxxxxxx"老样子 拖入ida中分析 进行字符串搜索"sign="

第四个看起来比较像 双击字符串进入

按下快捷键X

只有一处 我们还是双击进入

继续按下快捷键X

从函数名来看的话"-[ZYURLRequest obtainMostSuitableRequest]"比较像 此处没什么捷径 只能通过看哪个函数名像 如果选错了就会浪费些时间

双中双击进入 直接F5查看伪代码

可以看到通过传参调用"+[libProtocol sign_data:]"函数来进行签名的 参数又是通过传参调用"+[libProtocol encode_aes:]"得到的

v240 = +[libProtocol encode_aes:](&OBJC_CLASS___libProtocol, "encode_aes:", v239);
v241 = objc_retainAutoreleasedReturnValue(v240);
v242 = +[libProtocol sign_data:](&OBJC_CLASS___libProtocol, "sign_data:", v241);
v243 = objc_retainAutoreleasedReturnValue(v242);
v249 = objc_msgSend(&OBJC_CLASS___NSString, "stringWithFormat:", CFSTR("?sign=%@"), v243);

直接HOOK

%hook libProtocol
+ (id)encode_aes:(id)arg1 {
  %log;
  id result = %orig;
  HBLogDebug(@"[Hook] libProtocol encode_aes] ret: %@", result);
  return result;
}
+ (id)sign_data:(id)arg1 {
  %log;
  id result = %orig;
  HBLogDebug(@"[Hook] libProtocol sign_data] ret: %@", result);
  return result;
}
%end // hook libProtocol class end

日志打印如下

先复制出encode_aes的参数 保存hex查看

可以看到参数是明文的 既然是aes加密那就需要key 至于key是什么 如何产生的我们后面再来分析

我们先进入内部查看签名算法是如何实现的 F5代码如下:

关注点在一个函数"MD5String" 先来看下参数是什么

v3 = objc_retain(a3, a2);
v4 = (void *)objc_retainAutorelease(v3);
v5 = objc_msgSend(v4, "bytes");
v6 = objc_msgSend(v4, "length");
v7 = (size_t)v6;
v8 = (void **)operator new(((unsigned __int64)v6 + 16) & 0xFFFFFFFFFFFFFFF0LL);
memcpy(v8, v5, v7);
v28 = v8;
MD5String(&v28);

相信看到这里各位已经明白了参数是什么 参数就是aes加密后的数据 只是做了层转换 从NSData转为byte 根据函数名得知该算法是md5

那么直接编写代码进行测试

d = bytes.fromhex('8a07d175 47300202 02ead3bc bcbca5a5 19b21e13 1186e096 2a467fa5 661081c1 65d014f7 2a74a7bf 333c2a27 5937de20 25d2c4f9 c232a50a 3e90affc 319ca0ee b0e34df3 016bf74d a231d5da 41fde907 f6242573 f20d38d2 86e61d42 0487db3b bf029d65 a0733533 198b6194 63db3d3c fe234f84 7dcdee21 2521ab89 7f48e3f2 5d002559 7b5e814b 55fe2581 bec64b24 5082bd16 9910e2f8 e24cf3e8 e4346e3c 40f43237 cc75baff 0d97aea6 9f4c04d9 8f6d9f5f 91c31faa dbbda58d 13664d3a f5d7dd77 625f3559 91e74de9 4fcb3149 f9d54897 b2ac8ee4 2a613df6 cbdeda5e 98c9ba39 cdd717f9 19e7cbad 42c171d6 03d09daa b42aa123 66da3320 eddaf432 b655cc97 93280ee9 94687272 7d724658 8492a7b3 8b6ae9a7 bd33d63f 1f122155')
md5 = hashlib.md5()
md5.update(d)
print(md5.hexdigest())
# f94fd832969b8655eab3078e924b989e


结果发现计算结果不对

好吧 看来它并不是简简单单的MD5算法了 大概率是魔改过的md5算法

那么直接上手 先看下MD5String调用了多少函数

也没几个函数 那么就不管他改了什么 直接上手还原算法吧 当然你也可以下载MD5算法源码进行调试对比算法差异

以下是还原出的算法 直接放源码 由于算法过长 论坛发帖无法放下 所以直接放到附件里了

OK 结果跟手机上算出的一致  到这里sign-v2算法就还原完了

至于AES加密中key的来源 我们大概看下 后续有时间的话我会在帖子中补充

在之前我们Hook了 +[libProtocol encode_aes:] 我们直接在IDA中搜索一下类名"libProtocol"

set_portocol_key和get_portocol_key 看起来比较像设置key和获取key的函数 我们直接Hook

日志打印如下

抓包工具如下

抓包工具对比 可以看到加密key 在Headers["X-Xc-Proto-Req"]字段中 通过调用[libProtocol get_protocol_key]函数获取

而request data为[libProtocol encode_aes]加密后的数据  那么具体aes key是如何产生的呢 这个容我日后再做分析


可以看到response headers['X-Xc-Proto-Res'] 也有疑似加密key的数据

截图对比 [libProtocol set_protocol_key] 设置的参数为respnose headers['X-Xc-Proto-Res']字段的数据

截取response data hex数据查看对比 可以看到[libProtocol decode_aes]参数就是请求返回的数据 而且[libProtocol decode_aes]函数返回的数据是明文数据

至此最右的请求及返回数据的加密与解密流程分析完毕 至于aeskey是如何生成的就留到下次分解了 有时间的话我会再编辑到本篇文章末尾


如果你们有什么APP想看的可以在评论区留言 我可能也会更新哦(有时间的话)


首发看雪论坛 转载请备注来源



[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞6
打赏
分享
最新回复 (30)
雪    币: 321
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_nu无情 2020-9-30 14:49
2
0

雪    币: 2719
活跃值: (1502)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Vn小帆 2020-10-1 09:11
3
0
1
雪    币: 2719
活跃值: (1502)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Vn小帆 2020-10-1 09:11
4
0
sgmain   avmp
雪    币: 186
活跃值: (62)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qqxiaobai 2020-10-1 19:47
5
0
现在不都流行用hook大法吗?不管它具体怎么算,直接调用就行了!
雪    币: 5485
活跃值: (3247)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
尐进 2020-10-1 20:27
6
0
qqxiaobai 现在不都流行用hook大法吗?不管它具体怎么算,直接调用就行了![em_19]

大厂麻烦咯 牵扯到全局变量(服务器返回 账号token key之类) 设备状态 越狱状态 比如某音 某红书 当然hook改改也能用 不过算法还原后也方便

最后于 2020-10-1 20:29 被尐进编辑 ,原因:
雪    币: 186
活跃值: (62)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qqxiaobai 2020-10-1 21:36
7
0
尐进 qqxiaobai 现在不都流行用hook大法吗?不管它具体怎么算,直接调用就行了![em_19] 大厂麻烦咯 牵扯到全局变量(服务器返回&a ...
原来如此,今天搞某拍登陆算法,发现升序排序后结果,与so文件计算结果不同,我还在纠结要不要把算法还原呢,结果发现so层内部还原,毫无思路,还在迷茫中。。。
雪    币: 2663
活跃值: (5215)
能力值: ( LV10,RANK:177 )
在线值:
发帖
回帖
粉丝
YenKoc 2 2020-10-1 21:50
8
0
感谢大佬分享
雪    币: 258
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_oxfaajng 2020-10-19 10:38
9
0
太强了。。
想请教一下大佬这个main.cpp文件是怎么写出来的。。
我看了一下,像是重新写了一遍汇编的调用,这种程序实现是有固定的格式吗(比如寄存器那些定义都是事先写好的,只需要还原函数就可以),这一块有什么资料可以参考嘛?
雪    币: 5485
活跃值: (3247)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
尐进 2020-10-19 13:19
10
0
mb_oxfaajng 太强了。。 想请教一下大佬这个main.cpp文件是怎么写出来的。。 我看了一下,像是重新写了一遍汇编的调用,这种程序实现是有固定的格式吗(比如寄存器那些定义都是事先写好的,只需要还原函数就可以) ...

自己写的1比1识别汇编转C工具 构造好堆栈即可 

遍历识别算法调用的函数 反汇编引擎转汇编 写代码对每一条汇编指令进行翻译  如mov x0, x1 等价于 x0 = x1

最后于 2020-10-19 13:27 被尐进编辑 ,原因:
雪    币: 76
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
佳乐ing 2020-10-28 14:39
11
0
大佬方便给个联系方式么
雪    币: 5485
活跃值: (3247)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
尐进 2020-10-28 14:40
12
0
佳乐ing 大佬方便给个联系方式么


最后于 2020-10-28 15:40 被尐进编辑 ,原因:
雪    币: 21
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
西北方向 2020-11-1 04:26
13
0

大神,请教某龙sign咋破?

link:d2w4OC5hcHA


最后于 2020-11-1 04:42 被西北方向编辑 ,原因: link
雪    币: 5485
活跃值: (3247)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
尐进 2020-11-2 09:08
14
0
西北方向 大神,请教某龙sign咋破?link:d2w4OC5hcHA
某龙?
雪    币: 21
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
西北方向 2020-11-3 16:51
15
0
尐进 某龙?
 有附下载link哦,是flutter写的,sign部分完全没思路…
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_小伟_338 2020-12-21 01:43
16
0
为啥你的IDA搜索sign= 能搜索到 我的却不行呢 app版本一致
雪    币: 565
活跃值: (1396)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
ogli324 2020-12-29 13:18
17
0
西北方向 [em_78] 有附下载link哦,是flutter写的,sign部分完全没思路…
如果是flutter就放弃吧。
雪    币: 364
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_sgyfcywn 2021-2-5 07:01
18
0
求联系方式
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
fdoo 2021-2-19 12:10
19
0

已关注

最后于 2021-3-10 13:04 被fdoo编辑 ,原因:
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_回头走啊 2021-3-16 17:47
20
0
大佬求联系方式
雪    币: 1744
活跃值: (3444)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
kzzll 2021-3-19 21:36
21
0
高手高手,高高手
雪    币: 21
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
西北方向 2021-4-16 17:47
22
0
ogli324 如果是flutter就放弃吧。[em_2]
只得放弃了
雪    币: 172
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
liukuo362573 2021-4-24 18:16
23
0
大佬,怎么知道这个函数调用了哪些函数呢?
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
断脚的菜鸟 2021-9-22 15:50
24
0
大佬  我要某音的  留个联系方式给我
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
罗伟龙 2021-11-25 18:49
25
0
大佬 能给个联系方式吗 加你一个好友 愿意付费!
游客
登录 | 注册 方可回帖
返回