type
status
date
slug
summary
tags
category
icon
password
一、目标参数
gsid
二、抓包
.png?table=block&id=2da32d56-077c-4def-8993-68a860b7b621&t=2da32d56-077c-4def-8993-68a860b7b621&width=1104&cache=v2)
表单里面必要的几个参数checktoken、mfp、appkey,其中appkey是固定值。
.png?table=block&id=51ae064c-e0ed-4a81-a2ee-9c27fbf28c04&t=51ae064c-e0ed-4a81-a2ee-9c27fbf28c04&width=1104&cache=v2)
1、checktoken
jadx搜索checktoken,跟进去发现个b方法,用r0tracer hook一下这个方法,根据抓包对应下发现是uid+ "/" + did+ "/" + "obiew"拼接后传入ai.a中。
.png?table=block&id=7981fe85-8efa-4da8-92f5-11ff6f527db7&t=7981fe85-8efa-4da8-92f5-11ff6f527db7&width=1104&cache=v2)
跟进去ai.a方法里面,发现个关键字md5。
.png?table=block&id=e22b70ac-783b-47cf-81cd-42aa2febec6e&t=e22b70ac-783b-47cf-81cd-42aa2febec6e&width=1104&cache=v2)
测试一下。标准的md5。
.png?table=block&id=c56b4452-62b6-4bd9-a9ea-7eaa76213763&t=c56b4452-62b6-4bd9-a9ea-7eaa76213763&width=1104&cache=v2)
2、mfp
jadx直接搜索mfp,找到关键点,分别hook下查看参数及返回值。
.png?table=block&id=6aab5dbe-28f8-47bf-b3a0-6226ba612182&t=6aab5dbe-28f8-47bf-b3a0-6226ba612182&width=1104&cache=v2)
.png?table=block&id=b2d110cd-4fd7-4f17-80c2-c2cab0dc3b4a&t=b2d110cd-4fd7-4f17-80c2-c2cab0dc3b4a&width=1104&cache=v2)
生成的主要位置如下图,底下标出了encryptRsa,可能是个RSA,再看下。
.png?table=block&id=1bc3b854-f236-46a7-b616-7ab06eb093c9&t=1bc3b854-f236-46a7-b616-7ab06eb093c9&width=1104&cache=v2)
注意这里看这个a方法时候,jadx有可能出现下面的情况,可以换个版本试试或者用jeb查看java代码。
.png?table=block&id=d5d20d93-e52e-4f3c-a88c-33fea478ddb1&t=d5d20d93-e52e-4f3c-a88c-33fea478ddb1&width=1104&cache=v2)
.png?table=block&id=74d902d3-b1bf-41bb-a881-90a9a79aecc3&t=74d902d3-b1bf-41bb-a881-90a9a79aecc3&width=1104&cache=v2)
Cipher类为加密和解密提供密码功能。它构成了Java Cryptographic Extension(JCE)框架的核心。
- Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding") 参数String transformation的格式是“算法/工作模式/填充模式”,不同的算法支持不同的工作模式以及填充模式。
- c.init(1, g.b(arg12)); public final void init(int opmode, Certificate certificate) // 用取自给定证书的公钥初始化此Cipher对象
- v1_1.doFinal(v11_1, v9, v12_1); // 按单部分操作加密或解密数据,或者结束一个多部分操作
公钥找到了,用Python或者Java还原一下就可以了,测试了下,校验无误。
.png?table=block&id=d7f57cf2-191f-4f48-b3a2-40e841bca0d8&t=d7f57cf2-191f-4f48-b3a2-40e841bca0d8&width=1104&cache=v2)
Python还原一下checktoken和mfp,初始化的时候无uid直接传空就行,第一次注册会返回uid,接下来看did。
.png?table=block&id=856c3344-4b53-4edc-874e-e18b0b067325&t=856c3344-4b53-4edc-874e-e18b0b067325&width=1104&cache=v2)
3、did
jadx搜索,然后结合Frida和抓包,找到did生成的地方,是一个native方法。
.png?table=block&id=7b6125db-e400-4b3e-8548-8b0cae3a295c&t=7b6125db-e400-4b3e-8548-8b0cae3a295c&width=1104&cache=v2)
.png?table=block&id=9af72567-2bf1-49d4-aa70-dc0dc782aa2f&t=9af72567-2bf1-49d4-aa70-dc0dc782aa2f&width=1104&cache=v2)
Frida主动调用下。
.png?table=block&id=d8768672-d37b-4a5d-8ee1-5e9b47722d57&t=d8768672-d37b-4a5d-8ee1-5e9b47722d57&width=1104&cache=v2)
ida查看,静态注册
.png?table=block&id=7e9094da-8165-448e-a2fb-1c1662621453&t=7e9094da-8165-448e-a2fb-1c1662621453&width=1104&cache=v2)
首先修改参数名称方便分析。
.png?table=block&id=406c623e-a39d-4909-8a51-47001233ff59&t=406c623e-a39d-4909-8a51-47001233ff59&width=1104&cache=v2)
从下往上分析
.png?table=block&id=42d6cc82-d57c-454c-8a38-eeda83f557c1&t=42d6cc82-d57c-454c-8a38-eeda83f557c1&width=1104&cache=v2)
3、1 MDString
Hook一下MDString,验证一下是md5
.png?table=block&id=aa218137-86c3-4b59-8a17-c94486629a5e&t=aa218137-86c3-4b59-8a17-c94486629a5e&width=1104&cache=v2)
3、2 sub_28B0
md5(str2+"20220118"+"haogtaok")
.png?table=block&id=a91fd341-ec08-4466-873c-c42d77630e03&t=a91fd341-ec08-4466-873c-c42d77630e03&width=1104&cache=v2)
genCheckId只是把传值进行了拼接
.png?table=block&id=b4d3de20-2744-48c9-b579-aca784b6da35&t=b4d3de20-2744-48c9-b579-aca784b6da35&width=1104&cache=v2)
最后发现did就是,传值的md5就可以了(qaq),有能力的同学可以自己分析下,checktoken和mfp放在末尾,感兴趣的同学可以自己动手做下。 公众号传送门
.png?table=block&id=d8336303-5eaf-4a59-8a55-57a1040d784d&t=d8336303-5eaf-4a59-8a55-57a1040d784d&width=1104&cache=v2)
- 本案例仅做分析参考,如有侵权请联系删除
- 作者:404False
- 链接:https://blog.404nofoundx.top//article/ea8ae41b-b801-4131-b0df-efcdd25fd3e6
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。