|
本帖最后由 yshell 于 2019-7-4 21:23 编辑
目标APP:淘最热点 2.3.3
之前看v2ex上有人提问这个app抓不到新闻列表数据包,随之分析一波
抓到包后看到些数据加密,首先hookjava层算法,很轻松几个md5,这里就不说了,就sign没有找到
jadx打开apk 轻松找到关键位置
点进去看到加载了名为tre的SO,调用其中的sign函数进行加密
解开apk把libtre.so拉到ida分析一波,找到导出函数sign,点进去
然后F5查看代码
我们发现一处关键字符串,以及使用base64编码,然后SHA1进行哈希算法,由于抓包看到sign的长度是固定40位,这里确定最终使用sha1算法,所有直接hook这个sha1input方法。
写个frida脚本,hook非导出函数,需要拿到so的例子与方法偏移
执行结果 soAddr: 0xd93a1000 sha1InputAddr: 0xd93a2745
明文 YXBwX3Zlcj01MyZjaGFubmVsPXNvdWdvdSZjb2RlPTExMTEmZGV2aWNlX2lkPTQ1YjhkMDFkOGZiZDVkYTYzOGVlM2ZkMjE2MmE1NjQxJmRldmljZV9uYW1lPWdvb2dsZSBOZXh1cyA1WCZkZXZpY2VfdWRpZD1lMDY1Yjk0NzhmMWU1NGIyY2QyZmZiNzg2NDU2NjNjMyZmcm9tPWFwcCZnZXR1aV9wdXNoX2lkPTZkYmE2N2VkYWQ5YjdkNmE4NDg5MzkzMzBmNzc3NzAwJmltZWkxPTM1MzYyNzA3MDMxNjcwMSZpbWVpMj1udWxsJm1hYz02NDpCQzowQzoyRDo4QTo3MSZub25jZT1hZG96cmMxNTYyMjQ0NTc1NTc0Jm9zX3Zlcl9jb2RlPTIzJnBob25lPTE5OTY1MDEzNjY1JnN5c3RlbT0xJnRpbWVzdGFtcD0xNTYyMjQ0NTc1YjJxS2d0YVc0LDl6OURgRm1zdD9LNUpaYkxZT1ldTlA2c3NHZjJVfjt6azlvQ05nb3l0ViF9d1c3aWErYHc5Zw==
上面的base64经过sha1后 de4973f9c3a5fc0a7acabb0aa1e93632ddde1ee3 正好是抓包的sign
base64前为
app_ver=53&channel=sougou&code=1111&device_id=45b8d01d8fbd5da638ee3fd2162a5641&device_name=google Nexus 5X&device_udid=e065b9478f1e54b2cd2ffb78645663c3&from=app&getui_push_id=6dba67edad9b7d6a848939330f777700&imei1=353627070316701&imei2=null&mac=64:BC:0C:2D:8A:71&nonce=e9ya841562244165987&os_ver_code=23&phone=19965013665&system=1×tamp=1562244165b2qKgtaW4,9z9D`Fmst?K5JZbLYOY]NP6ssGf2U~;zk9oCNgoytV!}wW7ia+`w9g
b2qKgtaW4,9z9D`Fmst?K5JZbLYOY]NP6ssGf2U~;zk9oCNgoytV!}wW7ia+`w9g为SO里面的盐
至此我们就完成了sign的加密分析
下面附上hook脚本最后hook的 SHA1Input是导出函数,没有注意,脚本可以更简单的,只说个分析过程,勿较真
- # -*- coding: UTF-8 -*-
- import frida, sys
- jsCode = """
- function ab2str(buf) {
- return String.fromCharCode.apply(null, new Uint8Array(buf));
- }
- function str2ab(str) {
- var buf = new ArrayBuffer(str.length * 2); // 每个字符占用2个字节
- var bufView = new Uint16Array(buf);
- for (var i = 0, strLen = str.length; i < strLen; i++) {
- bufView[i] = str.charCodeAt(i);
- }
- return buf;
- }
- Java.perform(function(){
- var soAddr = Module.findBaseAddress("libtre.so");
- send('soAddr: ' + soAddr);
- var sha1InputAddr = soAddr.add(0x1744 + 1);
- var resultPtr="";
- send('sha1InputAddr: ' + sha1InputAddr);
- Interceptor.attach(sha1InputAddr, {
- onEnter: function(args){
- var buffer = Memory.readByteArray(args[1], 1000);
- console.log("明文",ab2str(buffer));
- }
- });
- });
- """;
- def message(message, data):
- if message["type"] == 'send':
- print(u"[*] {0}".format(message['payload']))
- else:
- print(message)
- process = frida.get_remote_device().attach('com.maihan.tredian')
- script= process.create_script(jsCode)
- script.on("message", message)
- script.load()
- sys.stdin.read()
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|