1

看我如何用云函数撸一个PC小程序代码包在线解密工具

 2 years ago
source link: http://xuedingmiao.com/blog/scf_wxapkg_decrypt.html
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.

使用云函数实现 PC 端小程序包在线解密

前一段时间突发奇想,想白嫖腾讯云云函数的能力来实现无服务模式下 PC 端小程序包的在线解密(注意这里仅仅是做解密)。

因为业余时间以捣鼓有意思的东西作为娱乐活动,对于小程序技术这块本身理解也是比较深刻了,所以碰到相关需求都会首先去想:这 gie 能不能用云函数实现?

于是碰上这种有意思的功能自然想尝试用云函数去搞一下了,顺便积累下云开发经验,看看无服务器云函数到底可以做到什么程度。

# 开发前准备

开发之前我们是肯定有一套理论指导的,而且这个算法也是开源的。

主要内容如下:

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

有这个理论知识只要专注实现就可以了,而且已经有大佬实现了相应算法,我们只要拿来测试改一改就可以了。

# 本地调试

这里调试分别使用了 go 语言版本与 nodejs 版本,go 版本是没有问题的,node 版需要稍微改动一下。

调试环境

  • MacOS Catalina 10.15.7
  • Nodejs 14.17.0
  • go 1.17.2 darwin/amd64

本地验证运行 go 及 nodejs 版本都没有问题,然后就是如何迁移到云函数环境了。

# 云端开发

这里并没有纠结于具体使用什么版本的 node,所以一开始就默认用了 10.15,在腾讯云的云开发控制台创建应用时如果选择 koa 应用就默认是这个版本。

然后就是一顿操作了:

  1. 注册处理路由;
  2. 增加文件上传功能(小文件可以用云函数直接接收,大的就不行了会报请求体大小超限错误),上传文件至云存储;
  1. 触发解密操作后从云存储下载文件;
  2. 调用 node 脚本去执行解密操作;
  3. 将解密后文件上传至云存储后提供下载链接。

文件上传这块有个小插曲,因为不支持大文件直传,所以专门问了云函数产品页面上的客服,说云函数的使用遇到了问题,结果告诉我说这块不归他们管,需要找云开发团队,然后我就懵了,云函数不是云开发下面的产品吗??咋还不归他们管??这是什么合作关系??不过最后为了解决问题我就加了客服微信,然后客服把云开发的技术大佬们拉了一个外部群,群内有十几个人之多,这阵势可让我是受宠若惊啊。不过最后还是解决了,技术大佬给了个方案,扔了几个文档链接让我自己捣鼓,就是看个文档手撸代码嘛,没啥难的,我就"好的"然后自己捣鼓去了。

具体方案就是:

并且额度方面也是够用的:

所以我就按着大佬给的提示继续往下尝试了,编写初始版本。

完事之后我们要进行调试。

# 云函数调试

这里要区分下大小文件的情况,大文件倒是 OK 的,可以正常获取解密后的文件。

小文件(主要 5M 以内)的情况下测试了很多遍,无一例外都失败了,而且错误原因是(这个和是否使用云存储无关):

{
  "library": "digital envelope routines",
  "function": "EVP_DecryptFinal_ex",
  "reason": "bad decrypt",
  "code": "ERR_OSSL_EVP_BAD_DECRYPT"
}

个人感觉是云端 nodejs 运行时带来的版本兼容问题,因为 10.15 是有些低了,所以将函数下载到了本地并把运行时改为了相对较新的 12.16 看看有没有救。

修改 cloudbaserc.json 里面的 runtime 运行时配置:

{
  "envId": "xxx",
  "functionRoot": "functions",
  "functions": [
    {
      "name": "koa-decrypt",
      "timeout": 50,
      "runtime": "Nodejs12.16",
      "installDependency": true,
      "handler": "tcbindex.main"
    }
  ]
}

然后使用命令行覆盖上传云函数即可更改云端运行时。

不过遗憾的是并没有作用,错误依旧。

# 总结

使用最新的无服务模式实现 PC 端代码包解密功能上云,听起来有意思但是实际上做的时候并没有那么美丽,一番体验下来感觉就是坑好多啊。不过还好大文件的解密是执行成功的,算是成功了一半,要啥 🚲。

# 体验地址

工具地址:PC 代码包在线解密

AppId:wxd968ed6b8bb866da

测试包:__APP__.wxapkg

# 参考资料


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK