123下一页
返回列表 发新帖

【实战教程】加菲猫影视邀请协议分析

  [复制链接]

28

主题

644

帖子

3676

积分

大学生

Rank: 5Rank: 5

金币
1590
好评
17
信誉
103
QQ
发表于 2021-12-3 13:56:55 | 显示全部楼层 | 阅读模式  来自 香港
本帖最后由 yuanyxh 于 2021-12-25 18:12 编辑
1.加菲猫影视1.6.2
2.小黄鸟
3.MT管理器
4.IDA

软件是别人发的,且被修改过,应该是服务器验证,所以没有尝试本地破解,直接进行算法分析;
本人技术有限,有说的不对的地方请大佬们指正

一.黄鸟抓包
打开黄鸟选择目标为加菲猫影视,打开加菲猫影视并输入邀请码提交,黄鸟抓到包后,打开 "http://jk.b557b8.com/App/AppUserInvitation/beOne" 这一条封包信息,




从响应信息来看就是这一条,再看提交信息,我们要分析的有 "token","token_id"和"request_key",其中"request_key"明显是经过加密处理的,且每次都不一样,那我们就先分析这个。



二.MT静态分析
使用MT反编译软件,搜索字符串"request_key",只有两个结果,打开第二个,转成java看一下,




可以看到在f方法内进行了加密处理,key和iv来自c层。


三.IDA静态分析
用IDA打开 "libnative-lib.so",在导出列表里搜索Java,找到对应java层的函数,




点进去查看发现都是明文:



找个在线解密网站试一下,加密方式为"AES/CBC/PKCS5"(ps:找的解密网站不支持,不过通过试验"AES/CBC/PKCS7"也能正常解密),密文编码为"HEX",输出结果如下:




其中,"code"为邀请码,"nt"很明显是时间戳,"ns"看起来也是加密过的,那我们继续使用MT进行分析。
四.ns密文分析
继续使用MT反编译,搜索字符串"ns"并勾选区分大小写及完全匹配,搜索到5个,打开最后一个,转成java,




"nt"确实是时间戳,"ns"则是"com.video.test.utils.EncryptUtils"类"getEncryptKey"方法的返回值,传了两个参数:"Context"和当前时间戳的字符串;从前面的分析得知这个方法是一个native方法,具体实现在c层,所以继续使用IDA分析,




可以看到就是获取一系列字符串然后进行MD5加密,由于本人技术有限,能静态分析出来的只有:包名,传进来的时间戳,"&z4Y!s!2br";"GetSignatureString"函数的返回值实在是分析不出来,所以采用动态调试的方式实时观察每个寄存器的值,在关键地方下断点后运行APP,再观察寄存器的值,得到结果如下:




那么"ns"就是由:包名 + "1A060008D770327E3BC1521FAB2114C788B77435749590CBF4DA5B97512AC7FA" + " &z4Y!s!2br " + 时间戳 MD5加密得来的,功能就是验证请求是否有效。


五.token及token_id的分析
MT反编译后搜索"token"和"token_id",可以搜索到,但是一直分析不出来源头,不过分析代码知道每次使用时是从"SharedPreferences"获取的,那我们直接在软件的数据目录"shared_prefs"文件夹进行搜索,




这样就有思路了,有获取就有写入,只需要找到写入的地方就能分析出来,继续反编译软件搜索,搜索目标换成"userToken"及"userTokenid",但是通过分析依旧找不到源头,




查找"setToken"及"setToken_id"的调用无法找到,那就只能换一个思路了,能看到上图中有"login success"的字样,猜测是发送登录请求后返回的"token"和"token_id",继续使用黄鸟抓包,并找到 "http://jk.256537.com/App/User/newLogin" 这一条封包,信息如下:




其中请求信息中的"token"和"token_id"新用户应该为"no",但是我在写教程的时候抓不到包了,所以用的是以前的抓包信息,我们继续使用解密网站解密"request_key"和"response_key",第一张图片是响应的,第二张是请求,



现在明确了"token"和"token_id"是通过发送登录请求后返回的,而登录请求中:"new_key"是设备id(通过之前的截图能看到),"old_key"通过多次试验是固定不变的,"ns"已经分析过,"nt"是时间戳,其他的不需要改变;到这里邀请协议所需要的信息全部分析完成。

2021/12/25补充
ns密文中的"GetSignatureString"返回值应该是软件的SHA256签名,而登录请求中的"old_key"也不是固定不变的,而是阿里的库生成的UTDID,每个设备都不同,具体实现在com.ta.utdid2.device.c.h方法内,感兴趣的大佬可以去研究一下,最后感谢@dayeve 大佬的提醒;

七.结语
写了一下午,越写越糊涂,感觉写的好烂,希望看到的大佬们轻点骂
下面是从网上搜索,拼拼补补写的一个py脚本,经过大佬@正己 优化的:


  1. # -*- coding: utf-8 -*-
  2. import binascii
  3. import re
  4. import requests
  5. import time
  6. import random
  7. import hashlib
  8. from Cryptodome.Cipher import AES

  9. AESKEY = '8jhM5h6dezq4QifP'  # 请修改 一定是 16位的字符串
  10. AESIV = 'tho3aAHJyZCWAfTG'  # 和KEY保持一致即可


  11. class AESTool:
  12.     def __init__(self):
  13.         self.key = AESKEY.encode('utf-8')
  14.         self.iv = AESIV.encode('utf-8')

  15.     def pkcs7padding(self, text):
  16.         """
  17.         明文使用PKCS7填充
  18.         """
  19.         bs = 16
  20.         length = len(text)
  21.         bytes_length = len(text.encode('utf-8'))
  22.         padding_size = length if (bytes_length == length) else bytes_length
  23.         padding = bs - padding_size % bs
  24.         padding_text = chr(padding) * padding
  25.         self.coding = chr(padding)
  26.         return text + padding_text

  27.     def aes_encrypt(self, content):
  28.         """
  29.         AES加密
  30.         """
  31.         cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
  32.         # 处理明文
  33.         content_padding = self.pkcs7padding(content)
  34.         # 加密
  35.         encrypt_bytes = cipher.encrypt(content_padding.encode('utf-8'))
  36.         # 重新编码
  37.         result = binascii.b2a_hex(encrypt_bytes).upper()
  38.         return result

  39.     def aes_decrypt(self, content):
  40.         """
  41.         AES解密
  42.         """
  43.         generator = AES.new(self.key, AES.MODE_CBC, self.iv)
  44.         content += (len(content) % 4) * '='
  45.         # decrpyt_bytes = base64.b64decode(text)           #输出Base64
  46.         decrpyt_bytes = binascii.a2b_hex(content)  # 输出Hex
  47.         meg = generator.decrypt(decrpyt_bytes)
  48.         # 去除解码后的非法字符
  49.         try:
  50.             result = re.compile('[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f\n\r\t]').sub('', meg.decode())
  51.         except Exception:
  52.             result = '解码失败,请重试!'
  53.         return result



  54. def invite():
  55.     #随机手机型号
  56.     model_name = ["oppo-pedm00","oppo-peem00","oppo-peam00","oppo-x907","oppo-x909t",
  57.                       "vivo-v2048a","vivo-v2072a","vivo-v2080a","vivo-v2031ea","vivo-v2055a",
  58.                       "huawei-tet-an00","huawei-ana-al00","huawei-ang-an00","huawei-brq-an00","huawei-jsc-an00",
  59.                       "xiaomi-mi 10s","xiaomi-redmi k40 pro+","xiaomi-mi 11","xiaomi-mi 6","xiaomi-redmi note 7",
  60.                       "meizu-meizu 18","meizu-meizu 18 pro","meizu-mx2","meizu-m355","meizu-16th plus",
  61.                       "samsung-sm-g9910","samsung-sm-g9960","samsung-sm-w2021","samsung-sm-f7070","samsung-sm-c7000",
  62.                       "oneplus-le2120","oneplus-le2110","oneplus-kb2000","oneplus-hd1910","oneplus-oneplus a3010",
  63.                       "sony-xq-as72","sony-f8132","sony-f5321","sony-i4293","sony-g8231",
  64.                       "google-pixel","google-pixel xl","google-pixel 2","google-pixel 2 xl","google-pixel 3"]
  65.     random_model_name = random.choice(model_name)
  66.    
  67.     #调用aes加密
  68.     aes = AESTool()
  69.    
  70.     #注册账户
  71.     t = str(int(round(time.time() * 1000)))
  72.     #随机设备id
  73.     device_id = "".join(random.choice("0123456789ABCDEF") for i in range(32))
  74.     ns = 'com.jfm2110152DAA94115DC5C48038693654FFCC3AA095CBD093165B47BD7F15C8F83CA1BC9B&z4Y!s!2br' + t
  75.     MD5ns = hashlib.md5(ns.encode(encoding='UTF-8')).hexdigest()
  76.     Request_key = '{"new_key":"' + device_id + '","phone_type":"1","ns":"' + MD5ns + '","nt":"' + t + '","old_key":"YYqIkUniVrkDAACxRfIkIvsY","recommend":""}'
  77.     MD5Request_key = aes.aes_encrypt(Request_key)
  78.     HexMD5Request_key = MD5Request_key.decode('unicode_escape')
  79.     body = 'token=no&token_id=no&phone_type=1&versions_code=1402&phone_model='+ random_model_name +'&request_key=' + HexMD5Request_key + '&app_id=1&ad_version=1'
  80.     header = {
  81.         'Cache-Control': 'no-cache',
  82.         'Version': '210930',
  83.         'channel_code': 'xc_tg18',
  84.         'Referer': 'http://jk.b557b8.com',
  85.         'Content-Type': 'application/x-www-form-urlencoded',
  86.         'Host': 'jk.b557b8.com',
  87.         'User-Agent': 'okhttp/3.12.0'
  88.     }
  89.     urls = 'http://jk.256537.com/App/User/newLogin'
  90.     Response_body = requests.post(url=urls, data=body, headers=header).text
  91.     Response_body_Encrypt = Response_body[49:241]
  92.     Response_body_Decrypt = aes.aes_decrypt(Response_body_Encrypt)
  93.     token_id = Response_body_Decrypt[13:22]
  94.     token = Response_body_Decrypt[33:65]

  95.     #邀请
  96.     Request_key2 = '{"code":"2UDYUB","ns":"' + MD5ns + '","nt":"' + t + '"}'  #code后填入你的邀请码
  97.     Request_key_Encrypt2 = aes.aes_encrypt(Request_key2)
  98.     HexRequest_key_Encrypt2 = Request_key_Encrypt2.decode('unicode_escape')
  99.     body2 = 'token=' + token + '&token_id=' + token_id + '&phone_type=1&versions_code=1402&phone_model=' + random_model_name + '&request_key=' + HexRequest_key_Encrypt2 + '&app_id=1&ad_version=1'
  100.     urls2 = 'http://jk.b557b8.com/App/AppUserInvitation/beOne'
  101.     Response_body = requests.post(url=urls2, data=body2, headers=header) # 返回200即邀请成功
  102.     print(Response_body.text)

  103. if __name__ == '__main__':
  104.     j = 0
  105.     for i in range(50):  # 五十次即可永久去广告
  106.         time.sleep(random.randint(1, 15))  # 设置随机延时
  107.         invite()
  108.         print("已刷{}次".format(i))
  109.         j += 1
  110.         if j == 50:
  111.             break
复制代码




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
已有4人评分好评 金币 理由
两个笑靥 + 1 + 1 赞一个!
dayeve + 1 + 1
正己 + 1 + 1 简仙人太强了!!!
XuanRan + 1 + 10 创作奖励

查看全部评分 总评分:好评 +4  金币 +13 

“其实最让人焦虑的,不是忙,也不是累,而是没有什么特别感兴趣的东西,觉得世间一切,怎样都可以,也没有什么特别想见的人,想动的心,明知道自己该努力了,却又不知道,该往哪里用力”
回复

使用道具 举报

36

主题

3645

帖子

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
2160
好评
101
信誉
192

MT论坛最佳新人考神MT论坛帅哥MT论坛新人MT论坛活跃会员MT论坛侠客

发表于 2021-12-3 13:58:24 来自手机  | 显示全部楼层  来自 湖北武汉
简仙人的沙发我就坐了
回复

使用道具 举报

28

主题

644

帖子

3676

积分

大学生

Rank: 5Rank: 5

金币
1590
好评
17
信誉
103
QQ
发表于 2021-12-3 14:00:18 | 显示全部楼层  来自 香港
怜渠客 发表于 2021-12-3 13:58
简仙人的沙发我就坐了

膜拜大佬
“其实最让人焦虑的,不是忙,也不是累,而是没有什么特别感兴趣的东西,觉得世间一切,怎样都可以,也没有什么特别想见的人,想动的心,明知道自己该努力了,却又不知道,该往哪里用力”
回复

使用道具 举报

36

主题

1962

帖子

4513

积分

大学生

Rank: 5Rank: 5

金币
953
好评
12
信誉
73

考神MT论坛新人MT论坛帅哥MT论坛最佳新人MT论坛活跃会员

发表于 2021-12-3 14:41:51 来自手机  | 显示全部楼层  来自 湖北武汉
支持一波
回复

使用道具 举报

49

主题

1437

帖子

4444

积分

大学生

Rank: 5Rank: 5

金币
1500
好评
1
信誉
100
发表于 2021-12-3 15:18:33 | 显示全部楼层  来自 福建宁德
写这么复杂只能给大神看,但是大神也不需要这样的教程吧?
回复

使用道具 举报

2

主题

5604

帖子

1万

积分

博士生

萌新

Rank: 7Rank: 7Rank: 7

金币
1932
好评
43
信誉
100

考神MT论坛最佳新人MT论坛帅哥MT论坛新人

发表于 2021-12-3 15:18:59 来自手机  | 显示全部楼层  来自 广东湛江
感谢分享
回复

使用道具 举报

173

主题

2783

帖子

8233

积分

硕士生

法式小面包

Rank: 6Rank: 6

金币
872
好评
9
信誉
100

MT论坛最佳新人考神

发表于 2021-12-3 16:14:40 来自手机  | 显示全部楼层  来自 贵州遵义
太复杂  我还是去白嫖算了
回复

使用道具 举报

26

主题

2971

帖子

8004

积分

硕士生

Rank: 6Rank: 6

金币
367
好评
19
信誉
100

考神MT论坛最佳新人MT论坛帅哥MT论坛活跃会员

发表于 2021-12-3 16:35:54 来自手机  | 显示全部楼层  来自 香港
简仙人 666, yyds
回复

使用道具 举报

21

主题

2002

帖子

9149

积分

硕士生

Rank: 6Rank: 6

金币
4097
好评
279
信誉
108

MT论坛元老MT论坛荣誉管理MT论坛帅哥考神MT论坛活跃会员MT论坛最佳新人MT论坛侠客MT论坛新人

发表于 2021-12-3 17:58:20 来自手机  | 显示全部楼层  来自 河南南阳
可以精华了
回复

使用道具 举报

0

主题

3203

帖子

5792

积分

硕士生

Rank: 6Rank: 6

金币
1242
好评
0
信誉
100

MT论坛最佳新人MT论坛新人考神

发表于 2021-12-3 18:19:11 来自手机  | 显示全部楼层  来自 江西宜春
感谢分享
回复

使用道具 举报

0

主题

138

帖子

284

积分

初中生

Rank: 3Rank: 3

金币
8
好评
0
信誉
100
发表于 2021-12-3 18:24:59 来自手机  | 显示全部楼层  来自 河南信阳
厉害啊 接单吗?
回复

使用道具 举报

4

主题

1010

帖子

3108

积分

大学生

Rank: 5Rank: 5

金币
1175
好评
2
信誉
100

MT论坛新人MT论坛帅哥MT论坛最佳新人考神

发表于 2021-12-3 20:13:50 来自手机  | 显示全部楼层  来自 上海
感谢分享
回复

使用道具 举报

102

主题

4113

帖子

9319

积分

硕士生

Rank: 6Rank: 6

金币
402
好评
7
信誉
100
发表于 2021-12-4 00:15:31 来自手机  | 显示全部楼层  来自 广东中山
回复

使用道具 举报

0

主题

3957

帖子

8115

积分

硕士生

Rank: 6Rank: 6

金币
3514
好评
0
信誉
100
发表于 2021-12-4 00:48:42 | 显示全部楼层  来自 广西
谢谢分享
回复

使用道具 举报

4

主题

745

帖子

3369

积分

大学生

Rank: 5Rank: 5

金币
124
好评
1
信誉
100
发表于 2021-12-4 02:46:56 来自手机  | 显示全部楼层  来自 湖北
支持一下大佬
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表