最近感觉微信小程序挺火的,身边很多人都在玩“跳一跳”、“脑王”等小游戏。
我对小程序也有浓厚的兴趣。
当我第一次看到小程序的官方介绍并阅读一些小程序的开发文档时,我本能地认为微信小程序只是一个浏览器框架,而小程序只是一个网页。首先认为小程序通过HTTP协议传输相应的JS和HTML文件。我开始抓HTTP协议,发现进入小程序后的数据包可以找到,但是找不到小程序的结构包。因此猜测可能是通过其他协议传输。
在使用过程中,我惊奇地发现,在桌面添加小程序后,发现有些小程序在断网后仍然可以使用。这时候我猜测小程序是缓存在本地的。
所以,笨手笨脚的人先删除微信目录下的数据文件,记录此时的文件信息,然后登录自己的账号,进入小程序,添加到桌面,然后退出微信。对比文件信息,发现多了几个可疑的数据包。
文件的具体目录是./data/data/com..mm//[你自己的微信目录,是一串字符]//pkg/
首先,将可疑数据包直接拉取到本地计算机,以方便进一步分析。这里小程序的文件名也是一串字符。
通过HEX分析软件对其中一个apkg包进行了分析。浏览过程中发现很多地方都是明文,所以猜测整个apkg包没有加密。
例如,开头有很多文件路径,但中间乱码较多,后半部分出现纯文本。在这些明文中我找到了关键字。这是我在捕获数据包时使用的主机。因此,找到的 包有 90% 的可能性是关键数据包。
通过分析多个小程序的数据包。得出以下结论:
文件的开头是一个结构体,标识了数据包的一些信息,文件的结尾是具体文件的主体。
文件以 0xBE 开头,后跟四字节索引长度和四字节文件长度。然后是0xED的尾部。接下来是一个四字节的文件号。这里的数据,用计算器算一下,十进制是69。首先按下按钮。接下来,数据就比较清晰了。四字节文件名长度为N,N字节文件名,四字节文件起始位置,四字节文件大小。超过整个索引长度后,就是正常的文件体了。
写一段代码帮助我们自动解析数据包
代码可以在底部下载。
通过代码,成功恢复了小程序“心王”的代码。
我们可以清晰的看到文件结构,其中是游戏图片资源,page是游戏部分页面。
app-.json是小程序的配置文件,定义了页面地址等信息
这是格式化的。建议大家阅读js、json等代码。最好先格式化一下。
page-.html从字面上可以理解为页面框架。
软件的主要逻辑在app-.js中。格式化后看一下
通过定义多个js文件。这里我想知道数据包中的标志的由来。
数据包:
=26&uid=&t=34&符号=
直接搜索标志通常是不现实的。毕竟,标志必须出现在很多地方。我们来搜索一下URL中的关键词:/
我们找到了:“///”
然后搜索
定位:
var s = ("./../net/.js"),
t = ("./..//.js"),
e = .;
e. =(e,r){
s.post(t.., {
:{
:e
},
: (s) {
r(空,s)
},失败:(s) {
.warn("失败。-" + s.), r(s)
})
我们顺着这个js,找到了sign的地方
var n = 这个,
a = .({}, i.),
d =“”,
你=“”;
a.uid = t.uid, at = Date.now();
for (var c in a) "" != d && (d += "&", u += "&"), d += c + "=" + (a[c]), u += c + “=”+a[c];
var g = e.(t., u);
“获取”== o? (a.sign = g, d = a) : d += "&sign=" + g;
注意:这里将uid,,和传入的值赋值给a,然后格式化构造d:=26&uid=&t=34和u:=26&uid=&t=34。致电 e.加密。抬头一看,发现了 e var e = ("./../util/util.js") 的定义,
然后进入util.js,这里定义了多个方法,我们通过key键找到最后一个地方
钥匙: ””,
:(e,t){
var r =“”,
o = (t += "&=" + e).("&");
o.sort();
for (var a = 0; a < o.; a++) r += o[a];
r = n.(r)
这段代码是什么意思?就是先将传入的两个参数拼接在一起,构造=26&uid=&t=34&=XXX(这里登录成功后返回),然后根据&分割字符串,然后排序后,最终结果为=26t=== ,然后对字符串进行md5加密,最后得到我们想要的符号值。通过自己拼接得到MD5,验证了这个想法的正确性。
至此,整个分析过程就完成了。
整个分析过程也遇到了很多坑,慢慢分析完成。