微信小程序逆向 -- 易推无水印

微信小程序逆向案例 – 易推无水印

所需工具:

  • Node环境
  • 安卓模拟器
  • appium
  • wxappUnpacker
  • 微信开发者工具

参考blog:

  • wxappUnpacker的使用
  • adb shell

正文

​ 私以为微信小程序可以简单的理解为:微信在内部封装了一个浏览器并提供了一下接口API供开发者开发网页, 且微信提供一套类似于Vue的框架帮助你快速开发。,最终以APP中小程序的形式呈现。

​ 以夜神模拟器(安卓版本5,微信版本7.0.17)为例,当我们打开一个小程序时,该小程序的前端都会以wxapkg的压缩包形式下载到本地,例如浏览器中的Source资源,会在本地有一个缓存。具体位置在

/data/data/com.tencent.mm/MicroMsg/016407466c27a6a659baa3d49bead133/appbrand/pkg

微信小程序逆向 -- 易推无水印_第1张图片

​ 其中016407466c27a6a659baa3d49bead133为微信用户的个人文件夹,每登入一个用户用户都会创建一个文件夹用于缓存用户的个人信息。

​ 一个能够快速找到的方法是根据时间,一般你在模拟器中登陆微信,这个由于写入缓存这个文件的最后操作时间就会更改为离你最近的时间,我们可以依次更快的定位到当前登录账号的缓存文件。

​ adb pull可以实现安卓与PC的文件传输,我们在安卓手机中长按小程序的wxapkg将其打包为一个zip压缩包,之后通过adb pull将其传输到PC端。

# 电脑发文件到手机
adb push <电脑路径> <手机路径>

# 手机发文件到电脑
adb pull  <手机路径> <电脑路径>

微信小程序逆向 -- 易推无水印_第2张图片

​ 由于这个wxapkg的目录比较深这边提供一个更快速的方法

adb shell
#进入adb shell 如果爆连接设备不唯一就指定设备
#进入到shell 之后就和Liunx的操作一致我们可以通过cd + tab补全快速定位到wxapkg所在目录

之后复制所需的路径就好了
adb pull 安卓端文件路径 PC端路径

微信小程序逆向 -- 易推无水印_第3张图片

image-20210419115838942

​ 传输完成后将其解压得到wxapkg就可以使用wxappUnpacker进行反编译了,在反编译之前需要下载wxappUnpacker所需要的第三方依赖

npm install esprima
    
npm install css-tree
    
npm install cssbeautify
    
npm install vm2
    
npm install uglify-es
    
npm install js-beautify

npm install escodegen

npm install cheerio

​ 反编译结果如下:微信小程序逆向 -- 易推无水印_第4张图片

​ 至此我们就获得了小程序的源码,在这里我们使用微信开发者工具进行动态调试。关于易推的小程序端抓包分析在这就不多做讲解了,易推返回数据的接口为

# 视频解析接口
https://api8.177dot.com/Video/GetVideoInfo
#请求荷载的data:
key value
text http://xhslink.com/F3Ia3b,复制本条信息,打开【小红书】App查看精彩内容!
code 083kyIll25LuT64SH9ol20kDyy1kyIlH
versionCode 102
appId wx9bd0e7e316a31f28
sign 4944D6A79B4F3A3716CD67387E75745B

​ 其中字段text黏贴的解析文本,code、versionCode、appId、sign未知。

微信小程序逆向 -- 易推无水印_第5张图片

​ 在微信开发者工具中打开后呈如下样式,我们和谷歌浏览器一样ctrl shift F全局搜索这几个字段code、versionCode、appId、sign,结果如下:
微信小程序逆向 -- 易推无水印_第6张图片

微信小程序逆向 -- 易推无水印_第7张图片

​ 其中versionCode、appId为固定的 ,一个是小程序版本号,一个是小程序IP(唯一),code、sign未知,我们在微信开发者工具的network网络管理中查看GetCideoInfo的调用栈可以清晰的发现:

微信小程序逆向 -- 易推无水印_第8张图片

微信小程序逆向 -- 易推无水印_第9张图片

​ 打下断点其中e就是我们所需要的code,s为我们复制的文本和code的字典,在formParmas之后s变为

s:
{
text: "http://xhslink.com/F3Ia3b,复制本条信息,打开【小红书】App查看精彩内容!",
code: "013BSP000QQDyL1NOh300mhr1r2BSP0Z"
}

t.formParmas(s):
{
appId: "wx9bd0e7e316a31f28"
code: "013BSP000QQDyL1NOh300mhr1r2BSP0Z"
sign: "365D449E46A0EAE13CEE94533AA0E59C"
text: "http://xhslink.com/F3Ia3b,复制本条信息,打开【小红书】App查看精彩内容!↵"
versionCode: "102"
}

​ 进行到这里我们需要做的是向上追朔code=e,中code如何生成的,向下逆向t.formParmas(s)的加密函数。

​ 最后你会得到:code为wx.Login生成的临时登录身份,有效期为5min(详情看微信小程序开发文档),sign为md5加密。

你可能感兴趣的:(爬虫)