大家都能发现,现在的手机应用隔三差五就要更新,存储空间的需求还越来越大,而各类平台的小程序凭借着面相用户轻量便捷,面相平台丰富生态的作用越来越受到市场的追捧。小程序介于网页端和应用端,同时具备了两者的优点,甚至有些厂商渐渐砍掉应用的研发,转而开发和维护小程序端口。但是目前的小程序安全却是良莠不齐,有的层层加固,有的直接裸奔。
本文记录了对一个去除视频水印小程序的逆向过程:
解密与解包:
我们使用wedecode这个开源项目进行解密和解包。
加密工具使用时,如果小程序包已从原 Applet 地址移出,也应当保留小程序包上两级的路径,如: ~\Applet\wx1680cca9a19ee3c8\48\__APP__.wxapkg"。“wx1680cca9a19ee3c8”这一字符串应当保留,与解密有关(采用的 AES 加密,这个字符串与秘钥生成有关,后面比对发现,这个字符串同时也是 APPID。)
然后使用 wedecode 解包后,使用微信开发者程序打开调试。可能因为文件解包的问题,或多或少都会遇到几个文件语法格式的问题:

我们得根据提示一个一个修正:
[x] app.json: componentFramework 字段需为 exparser,glass-easel componentFramework 字段需为 string
"componentFramework": {
"allUsed": [
"exparser"
],
"default": "exparser"
},
修改为:
"componentFramework":"exparser",
[x] app.json: [“tabBar”][“list”][0][“iconPath”] should not contain \
把全部的“\\”替换成“/”,
重新编译之后就可以运行:

分析核心功能:
定位 index.js 中的 query 方法。
query: function(e) {
var a = this,
n = a.isUrl(a.data.inputvalue);
n && wx.showLoading({
title: "正在解析"
}) && (wx.request({
url: t.globalData.url + "query",请求体
data: {
url: n,
token: wx.getStorageSync("token"),
id: wx.getStorageSync("id"),
user_id: t.globalData.user_id
},
success: function(t) {
wx.hideLoading(), 104 == t.data.code ? wx.showModal({
title: "提示:",
content: t.data.message,
confirmColor: "#ff9900",
showCancel: !1,
success: function(t) {}
}) : (wx.hideLoading(), a.setLog(a.data.inputvalue), 3 != t.data.data.type ? a.setData({
title: t.data.data.title,
photo: t.data.data.photo,
downurl: t.data.data.downurl,
url2: t.data.data.url2 ? t.data.data.url2 : 0,
pics: t.data.data.pics
}) : (wx.setStorageSync("picsaa", t.data.data), wx.navigateTo({
url: "pagespicshhindex"
})))
}
}), setTimeout((function() {
o && a.data.ad_chaping && o.show().catch((function(t) {
console.error(t)
}))
}), 2e3))
},
在 app.js 中找到 globalData 对象:
.........
globalData: {
url: "https:qq.yyymvp.com",
user_id: 8
}
});
从业务代码可知,请求体是:
wx.request({
url: t.globalData.url + "query",请求体
data: {
url: n,
token: wx.getStorageSync("token"),
id: wx.getStorageSync("id"),
user_id: t.globalData.user_id
},
可以看到它的安全性确实太低了,token 和 id 都是不验证的,userid 就是硬编码的。那么这个工具的小程序后台我们就可以直接使用了,避免烦人的广告。
简易代码如下:
import requests
Url="https:qq.yyymvp.com"
o_url= "https:example"
user_id=8
token=‘’
id_=‘’
data={
"url":o_url,
"token":token,
"id":id_,
"user_id":8
}
res=requests.post(
Url+"query",
data=data,
)
res_text=res.json()
print(res_text[‘data’][‘downurl’])
我们可以把它部署在自己的电脑上,或者编写一个短小的程序,供自己使用。