6

Misaki's Blog

 3 years ago
source link: https://misakikata.github.io/2021/03/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E8%A7%A3%E5%8C%85/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

认识微信小程序

此处使用Windows版微信做介绍,但是Windows版和手机版稍微有点区别。先去获取一个Windows版的微信小程序包。默认位置在:C:\Users\user\Documents\WeChat Files\Applet。移动端的包在/data/data/com.tencent.mm/MicroMsg/{id}/appbrand/pkg,此处没有移动设备,不使用移动设备做演示。

目录下有一堆wx开头的目录,这些ID就是对应的小程序ID,可以在访问小程序抓包中获取到,如果懒得抓包也不知道小程序ID就把这些删掉,重新访问会再次下载,根据日期来找到对应的包即可。

Windows版的小程序包自动在外部加了一层的加密,我们看到的包名统一为:__APP__.wxapkg。我们可以看到这样的文件头,V1MMWX标识就是加密后添加的标识。

image-20210322151852954

这个是需要解密的,借助大佬的go语音项目来解密:https://github.com/BlackTrace/pc_wxapkg_decrypt,同时也有编译后的程序,直接用即可。

那Windows版的小程序的加密流程为:

  1. 首先pbkdf2生成AES的key。利用微信小程序id字符串为pass,salt为saltiest 迭代次数为1000。调用pbkdf2生成一个32位的key
  2. 首先取原始的wxapkg的包得前1023个字节通过AES通过1生成的key和iv(the iv: 16 bytes),进行加密
  3. 接着利用微信小程序id字符串的倒数第2个字符为xor key,依次异或1023字节后的所有数据,如果微信小程序id小于2位,则xorkey 为 0x66
  4. 把AES加密后的数据(1024字节)和xor后的数据一起写入文件,并在文件头部添加V1MMWX标识

解密后,就能获得一个以微信小程序ID命令的包,这个包就是需要解析来获取小程序源码的包。先来看一下小程序的结构。

image-20210322152633592

从十六进制中可以看到,旁边的文件目录文件。这种包并非一个压缩格式的包,而是一个二进制的包,需要特定的方法解包。

小程序解包

使用工具:https://gist.github.com/Integ/bcac5c21de5ea35b63b3db2c725f07ad

执行:python3 python.py wxid.wxapkg,可以看到目录下生成的微信id的目录包。

或者使用:https://github.com/xuedingmiaojun/wxappUnpacker,一个nodejs的项目。提供Windows的安装版。

获取到小程序的源码格式包的时候,跟原来的源码还是稍微有点区别。在一级目录下,可以看到有三个文件,实际上不同的解包工具看到的不一样,有时候是四个文件。

  1. app-service.js
  2. app-config.json
  3. page-frame.html
  4. //app.js

app-service.js是所以js的汇总,只是微信把js都压缩到这个js内。

app-config.json: 小程序工程 app.json 以及各个页面的 JSON 配置文件汇总,可直接查看;

page-frame.html: 所有页面的 .wxmlapp.wxss 样式文件的汇总;

*.html: 包含每个页面对应的 .wxss 信息,可读性较好;

static: 各类图片、音频等资源文件。

获取解包后,小程序源码有什么用?

小程序内的信息泄露

有一部分开发者会把Appid和Secret放在小程序内请求,比如如下的开发者

image-20210322161110075.png

如果这个appid和secret可以使用,就能获取到seesion_key。借用官方的登陆流程。

img

所以需要code和appid还有secret,code如何获取,只需要使用带有登陆功能的点,需要触发了wx.login()功能,点击登陆抓包即可。

一般打开小程序的时候就有流量交互了。比如,但这个code只能使用一次

image-20210322162950522

构造一个请求,查看小程序官方文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

  1. curl https://api.weixin.qq.com/sns/jscode2session?appid=wxxxxx&secret=568wdxxx&js_code=041xxxx&grant_type=authorization_code

为了方便,此处使用云函数功能测试,需要小程序开启云函数。使用python的第三方包python-weixin。但云函数功能不一定都开放,需要小程序开放才能查询。

  1. from os import environ, path
  2. from weixin import WxAppCloudAPI
  3. appid = environ.get("WXAPP_APPID", "wx88xxxxx")
  4. secret = environ.get("WXAPP_SECRET", "56xxxxx")
  5. env = "test-id"
  6. example_db = path.abspath(path.join(path.dirname(__file__), "./example_db"))
  7. app_cloud = WxAppCloudAPI(
  8. appid=appid, app_secret=secret, grant_type="client_credential"
  9. )
  10. token = app_cloud.client_credential_for_access_token().get("access_token")
  11. print(token)
  12. cloud_api = WxAppCloudAPI(access_token=token)
  13. # 获取库的集合信息
  14. db_info = cloud_api.db_collection_info(json_body={"env": env, "limit": 10})
  15. print(db_info)

根据包的wiki来利用云函数操作小程序,文档:https://github.com/gusibi/python-weixin/wiki/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BA%91%E5%BC%80%E5%8F%91

利用accesstoken

获取session_key是用户数据的加密密钥,那accesstoken就是操作小程序的调用凭证。

先获取accesstoken,也可以利用上面提到的代码来获取accesstoken。

  1. https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

获取到token后可以利用官方的接口操作小程序来查询等操作,比如查询最近一天的访问

  1. https://api.weixin.qq.com/datacube/getweanalysisappidvisitpage?access_token=ACCESS_TOKEN
  2. data = {"begin_date" : "20170313","end_date" : "20170313"}

其他查询接口查看:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK