X果

X果

X果逆向协议分析

img

token

url中的token大多是前面请求返回的而不是生成的。

对url中间部分进行搜索找到token的位置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
method static constructor <clinit>()V
.registers 4
00000000 const/4 v3, 0
00000002 const/4 v0, 4
00000004 new-array v0, v0, [String
00000008 const-string v1, "http://mapi.yiguo.com/MobileApi.aspx?token=CA0C4043E9594934BB51BCE0AD9D36EB&v="
0000000C aput-object v1, v0, v3
00000010 const/4 v1, 1
00000012 const-string v2, "http://devtest.yiguo.com:8086/MobileApi.aspx?token=819934DD44CB4359B167C352EA473BCA&v="
00000016 aput-object v2, v0, v1
0000001A const/4 v1, 2
0000001C const-string v2, "http://172.17.7.227:8086/MobileApi.aspx?token=819934DD44CB4359B167C352EA473BCA&v="
00000020 aput-object v2, v0, v1
00000024 const/4 v1, 3
00000026 const-string v2, "http://premapi.yiguo.com/MobileApi.aspx?token=CA0C4043E9594934BB51BCE0AD9D36EB&v="
0000002A aput-object v2, v0, v1
0000002E sput-object v0, c->b:[String
00000032 new-instance v0, StringBuilder
00000036 invoke-direct StringBuilder-><init>()V, v0
0000003C sget-object v1, c->b:[String
00000040 aget-object v1, v1, v3
00000044 invoke-virtual StringBuilder->append(String)StringBuilder, v0, v1
0000004A move-result-object v0
0000004C const-string v1, "4.3.0"
00000050 invoke-virtual StringBuilder->append(String)StringBuilder, v0, v1
00000056 move-result-object v0
00000058 const-string v1, "&os=android&sign="
0000005C invoke-virtual StringBuilder->append(String)StringBuilder, v0, v1
00000062 move-result-object v0
00000064 invoke-virtual StringBuilder->toString()String, v0
0000006A move-result-object v0
0000006C sput-object v0, c->a:String
00000070 return-void
.end method

如上token应该是固定值

UserName和Password

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static f a(String arg4, String arg5, String arg6) {
f v0 = new f();
try {
v0.a().a("yiguo.mapi.user.login");
v0.b().putOpt("UserName", ac.a(arg4));
v0.b().putOpt("Password", ac.a(arg5));
v0.b().putOpt("AdChannelName", arg6);
String v1 = d.p(v0.c());
if(v1 == null) {
return null;
}

return new f(v1);
}
catch(Exception v0_1) {
v0_1.printStackTrace();
}
catch(JSONException v0_2) {
v0_2.printStackTrace();
}

return null;
}

搜索找到如上,进入username和password的加密函数,

1
2
3
4
5
6
7
8
9
10
11
12
13
public static String b(String arg6) {
String v0_1;
if(arg6 == null || (arg6.equals(""))) {
v0_1 = "";
}
else {
Cipher v0 = Cipher.getInstance("AES/CBC/PKCS7Padding");
v0.init(1, new SecretKeySpec(e.a("879FC8CB80958B9599C1CADF9F979B9A8190CBCC8E9F8B9198C0CADE9F939E9B8F", new String(e.b)).getBytes("utf-8"), "AES"), new IvParameterSpec(e.a("879BCDCC84918B9099C4CADF9A979E9F859AC7C98F978C9098C7C8D99E9D959F84", new String(e.b)).getBytes("utf-8")));
v0_1 = b.a(v0.doFinal(arg6.getBytes("utf-8")));
}

return v0_1;
}

分析发现密钥并未提交给服务器,所以密钥是静态的即服务器已有,而不是动态的。

既然是静态的只需要获得key和iv即可,进行动态调试就可以获得这两项,再进行aes 的解密即可。

url中的sign

一般数据包的签名在最后执行,所以sign的运算在UserName和Password之后。

在 String v1 = d.p(v0.c());中的d.p找到可能性函数,进入获得

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static String a(String arg5) {
try {
MessageDigest v0_3 = MessageDigest.getInstance("MD5");
v0_3.update(arg5 + e.a("879BCDCC81918B9099C4CADF9F979E9F859ECDC984918E9099C1CFDA9A979E9A8599CCC882948A9198C7CBDE9D979899879BC8CE83938A9192C0C9D99F979F9585", new String(e.b)).getBytes("utf-8"));
String v0_4 = e.a(v0_3.digest()).toLowerCase();
return v0_4;
}
catch(Exception v0) {
v0.printStackTrace();
}
catch(UnsupportedEncodingException v0_1) {
v0_1.printStackTrace();
}
catch(NoSuchAlgorithmException v0_2) {
v0_2.printStackTrace();
}

return "";
}

是一个md5加密并且在原提交数据包内容中加了后缀,因为并未对后缀进行数据传输,服务器获取不到客户端的后缀现值,因此排除动态后缀的可能性。同样进行动态调试找到后缀的值即可。

# 推荐文章
  1.vpy加密视频破解转mp4-JAVA代码实现
  2.x715quan逆向协议分析
  3.20200516 每日记录
  4.AutoGeneratorCode
  5.C语言知识小计

评论


:D 一言句子获取中...

加载中,最新评论有1分钟延迟...