前排提示!!!!!
论坛禁止留联系方式!!
禁止求成品,也没有成品!
禁止求名字,也不会发。。
写在前面的话
1.这个APP是无法通过fd直接抓包的(不过httpcanary可以,但是不太习惯手机一直粘贴复制),所以要想办法让fd可以抓到包,就用到了Drony
2.但是Drony我在模拟器中测试是无法转发的。。(也可能是我的模拟器版本不太对?或者是不支持?反正操作是一样的。。最后在手机上成功了)
3.当然也可以直接用模拟器一键新机来弄邀请。这个简单。。也不用看下面的一大堆字和图了。。
4.vmos+XP框架+应用变量也能达到免root换机的功能...(PS:市面上还有很多的多开软件均可免root换机)
本贴用到的工具
1.反编译:jadx+mt管理器(mt管理器/NP管理器/Androidkiller等等别的工具均可)[jadx看java,mt用来修改APP]
2.抓包:fiddler+Drony(因为fd抓不到包,所以加个Drony,稍后由简单的说明)
3.加解密网站(由于可能会...所以这里就不贴了)
fiddler+Drony抓包
注意:本方法仅限http,https可能需要证书或者别的操作
配置Drony
2.打开APP,右滑到“settings”页面
3.点击“wi-fi”
4.Network list中选择当前wifi
5.配置fd的ip地址和端口后修改“Proxy type”为手动“Manual”
6.代{过}{滤}理格式“Proxy type”默认为“http”
7.“Rules”规则设置
点击Rules,点击右上角的+号
Action选择Local proxy chain
Application选择想要抓包的APP
然后点击右上角的保存
8.返回首页LOG页面点击OFF开启
9.打开APP,你会发现FD有数据包了
抓包+分析实操
打开APP并看fd的包
[PS:如果不是第一次打开,最好清空下应用数据,免得有一些数据找不到是哪出现的]
一看一大堆数字字母就是加密过的密文,所以我们要想办法解密密文。
接口 |
分析 |
提交类型 |
提交参数 |
app/ping |
类似cmd的ping,查看是否可用 |
post |
_data=B025A5C8C19162309523E7810179E92C |
app/info |
应该是获取app的信息 |
post |
_data=太长。。用XX替换 |
分析_data
2个接口都有_data字符串,所以我们可以在jadx(或MT/NP等,以下用jadx代替)中搜索"_data
发现两个相关的
public static PostRequest a(String str, HashMap<String, String> hashMap) {
String str2;
HttpParams httpParams = new HttpParams();
try {
JSONObject jSONObject = new JSONObject();
for (Map.Entry<String, String> entry : hashMap.entrySet()) {
jSONObject.put(entry.getKey(), entry.getValue());
}
str2 = jSONObject.toString();
} catch (Exception e) {
e.printStackTrace();
str2 = "";
}/* str2的处理方法 */
p.a("request-post==>" + str, str2);
httpParams.put("_data", a.a(str2, a.a, a.b), new boolean[0]);/* 搜到的_data */
return (PostRequest) a(str).params(httpParams);
}
那么这个a.a应该就是加密的函数,str2应该就是明文,那么我们看看a.a和a.b是什么?
[PS:跳这里的a.a能看到是"AES/CBC/PKCS5Padding"加密]
a.a
右键a.a跳到声明,
public class a {
public static final String a = o.a();/* a.a */
public static final String b = o.b();/* a.b */
/* 以下省略老多代码 */
}
可以看出a.a是由o.a()生成,而a.b是由o.b生成,我们再跳o.a和o.b,发现代码
public final class o {
public static final String a() {/* o.a */
byte[] a = com.jpdfh.friendly.http.a.a.a("34656664336636303630653230333332");
c.a((Object) a, "AesEncryptionUtil.hex2byte(UrlGroup.enKEY)");
Charset defaultCharset = Charset.defaultCharset();
c.a((Object) defaultCharset, "Charset.defaultCharset()");
return new String(a, defaultCharset);
}
public static final String b() {/* o.b */
byte[] a = com.jpdfh.friendly.http.a.a.a("35323532303266393134396530363177");
c.a((Object) a, "AesEncryptionUtil.hex2byte(Constants.enIV)");
Charset defaultCharset = Charset.defaultCharset();
c.a((Object) defaultCharset, "Charset.defaultCharset()");
return new String(a, defaultCharset);
}
public static final String c() {/* o.c */
byte[] a = com.jpdfh.friendly.http.a.a.a("35313532303266393134396530363161");
c.a((Object) a, "AesEncryptionUtil.hex2byte(UrlGroup.CHANNEL_KEY)");
Charset defaultCharset = Charset.defaultCharset();
c.a((Object) defaultCharset, "Charset.defaultCharset()");
return new String(a, defaultCharset);
}
}
o.a可以看出是AES的KEY,o.b是AES的IV偏移。o.c是CHANNEL_KEY暂时先不看他(因为AES解密有key和iv就够了。。)
那么一长串的34656664336636303630653230333332是什么东西呢?我们继续看com.jpdfh.friendly.http.a.a.a这个函数
public static byte[] a(String str) {
if (str == null || str.length() < 2) {
return new byte[0];
}
String lowerCase = str.toLowerCase();
int length = lowerCase.length() / 2;
byte[] bArr = new byte[length];
for (int i = 0; i < length; i++) {
int i2 = i * 2;
bArr[i] = (byte) (Integer.parseInt(lowerCase.substring(i2, i2 + 2), 16) & 255);
}
return bArr;
}
因为小弟自学的java也不咋地,只能借用e4a的接口函数调用com.jpdfh.friendly.http.a.a.a了。
[PS:搞到后来才想起逍遥一仙大佬说的易语言:HEX解码,结果一试。。果然是这个,哈哈,用e4a还浪费了点时间]
[PS:直到发帖的时候,才想起来,e4a也有类似的HEX解码的方法:十六进制到字节集,有点小尴尬。。。。]
调试输出 (到文本 (HEX解码 (“34656664336636303630653230333332”))) ' 易语言
字节到文本(十六进制到字节集(“34656664336636303630653230333332”),"utf-8") 'e4a
小小总结下a.a加密函数
a.a(str2, a.a, a.b)
参数 |
内容 |
最后结果 |
备注 |
str2 |
需要加密的明文 |
|
|
a.a |
o.a()=HEX解码('34656664336636303630653230333332') |
4efd3f6060e20332 |
key |
a.b |
o.b()=HEX解码('35323532303266393134396530363177') |
525202f9149e061w |
iv |
解密_data和返回的data
用在线AES解密或者易语言的e2ee成功解密
解密_data:
解密返回的app/info返回的data:
可以看出app/info返回了accessToken/userId/username/expiresIn/ads广告等信息。
填写邀请码user/bind
通过抓包我们发现user/bind中的加密参数XXXXXXXX,解密结果为{"code":"XXXXX"}
小小的分析一波
输入邀请码的时候只提交了code邀请码,那是怎么判断是哪一个用户提交的邀请码呢?我们看header
key |
Value |
来源 |
access-token |
67XXXXXXXXXXXXXe5 |
/app/info中解密的来 |
app-key |
ytg548ouyxnaq9 |
反编译APP,值是固定的 |
device-id |
86XXXXXXXXXX32 |
用户手机的imei |
接下来就可以编写注册+刷邀请的软件咯
注册+邀请软件
【PS:请自己动手。。】
1.抓包分析提交的参数和网址
2.结合编程工具伪造imei等参数,生成新用户
3.新用户填写邀请码..
我用的是易语言编程....很简单
体现在APP上是这样的
下载区
e4a语言_接口函数
之HEX解码源码,密码:52pj 下载: https://wwa.lanzoui.com/iBUWwktcwad
之HEX解码成品,密码:52pj 下载: https://wwa.lanzoui.com/iAimqktf9oh
APP的另外一些小小的分析
APP中的base64图片处理
这个APP的图片处理稍微有点意思,以前见过的APP都是直接data:image/jpeg;base64
而这个APP的图还出现了$$ ## ^^等字符
我们搜"## 发现
public static String a(String str) {
return str.replace("**", "=").replace("$$", "J").replace("##", "H").replace("^^", "A");
}
替换之后再解码,真正的图片就出现了
关于m3u8下载
还记得解密data的时候的图吗?
Referer: http://www.qq.com
记得要加Referer来源。。。
关于APP下载视频
抓包发现会通过dodownload判断是否允许下载视频
通过AutoResponder返回y,例:{"status":"y","data":"","time":"2021-01-25 14:11:47"}
当然也可以反编译,jadx搜dodownload,进行相关的反编译,小弟技术有限