0


记录一次完整的微信小程序+反编译+AES加、解密爬虫

一、准备工具
    1、反编译工具:wecgatMiniAppReverse.zip(链接:微信小程序-反编译工具 (0积分下载))

            ps:(编译不成功,可以使用此工具:unveril2.0反编译工具(0积分下载))

    2、安装 nodejs并配置全局变量

    3、微信小程序开发者工具(链接:微信开发者工具链接)

            找稳定版下载(我的环境是 win10):![](https://img-blog.csdnimg.cn/direct/6e7f3b0c46c84c58b4ebe6d7a6b0c135.png)
二、解密小程序
    1、登录PC端微信,找到目标小程序打开后可关闭,目的是为了小程序源码包下载缓存至本地:

    2、点击打开文件夹:

    3、点击进来后,有对应的小程序缓存,类似于 “wxd418ee346d79d382”就是打开过的小程序的id。按照路径找到加密过的文件 "__APP__.wxapkg":![](https://img-blog.csdnimg.cn/direct/403b235979994f0fb43998950d156c1b.png)

  4、解密该文件

           4.1、首先 cmd 命令进入解密工具文件夹

           4.2、为了方便,把需要解密的文件复制到同一目录下 “wxd418ee346d79d382”

           4.3、输入命令格式:**
pc_wxapkg_decrypt.exe -wxid 微信小程序id -in 要解密的wxapkg路径

**

                  ** 本示例命令:pc_wxapkg_decrypt.exe -wxid wxd418ee346d79d382 -in wxd418ee346d79d382\450\__APP__.wxapkg**

           4.4、提示解密成功,得到 **“”dec.wxapkg“”**

            **注意:路径中不要带空格,比如 “Program File”**

三、反编译小程序
    1、cmd命令进入 “”wxappUnpacker-master“”路径

    2、执行命令,反编译解密的文件 “dec.wxapkg”:**node wuWxapkg.js ..\decrypt\dec.wxapkg**

    3、 命令结束后,会在 “”../decrypt “” 目录下生成一个  “dec” 文件夹,里面就是反编译小程序的源码。ps:(复杂的小程序,不会100%完全编译出来)

    4、反编译结果如下,用微信开发者工具打开。

    ![](https://img-blog.csdnimg.cn/direct/f8ced097626249ef829ff8ecaf060e9d.png)![](https://img-blog.csdnimg.cn/direct/3d6329b932b7479dbced7f770d7ff736.png)

点击确定,就可以愉(苦)快(逼)的逆向了。

四、开始逆向分析
1、Fiddler抓包分析
    ![](https://img-blog.csdnimg.cn/direct/f693fa906ed547e3bec84f284feb3441.png)
2、关键词查找
    1、根据接口的特征搜索,比如 headers、post body 等等。

    2、可以直接一套组合拳:“AES(decrypt\encrypt)、MD5、Base64”等等  查看此处

    3、若是对小程序开发流程很熟悉的人,可以根据代码入口查看。

检索结果,非常熟悉的加、解密方法。

3、AES加密、解密转换成python代码
            1、首先需要找到 秘钥(u)、偏移量(l)。按住ctrl键,找到定义位置。

            ![](https://img-blog.csdnimg.cn/direct/d70653bd70a24cd2983bb3cbc063d256.png)

注意:是用pkcs7方式补齐数据的。

import json

from Crypto.Cipher import AES
import base64

def pkcs7_unpadding(txt):
    padding_size = txt[-1]
    return txt[:-padding_size]

def data_decrypt2(data):
    secret = b"f13df6c54e8efdfe"  # 秘钥
    iv = b"a3648c7c1ef3e9fe"  # 偏移量
    iv1 = bytes(list(bytes(iv)))  # 偏移量
    aes = AES.new(secret, mode=AES.MODE_CBC, iv=iv1)
    b_data = base64.b64decode(data)
    meg = aes.decrypt(b_data)
    # print(meg)
    b = pkcs7_unpadding(meg)
    # print(b.decode())
    print(json.loads(b))

txt1 = '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'

data_decrypt2(txt1)

得到的结果:

还有headers,code字段值需要加密带入访问返回结果。

需要解密的文本:

ibdHN7yyu2DjOMJoVeXOmBtW9sb2DL/eiptsdkVPQ0OHJWrF2FGw4aqWBZQ3+JGAN7+xbsrtNnAckuHksLS6fY0hf+1xwx2+FRN5dWXB4vTM3gMNiFy0WWTlzsqp3jG94dZaH2p6MQsJE3saUp2TrnqlApXj+rdeMkSVlc7o2Ys=

解密结果:

知道了code加密数据结构了,那就拼接好数据后,再执行加密方法即可。

加密代码如下:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64

key = 'f13df6c54e8efdfe'  # 秘钥
iv = "a3648c7c1ef3e9fe"  # 偏移量

# 补足字节方法 --- 选择pkcs7补全
def pad2(value):
    # 选择pkcs7补全
    pad_pkcs7 = pad(value.encode('utf-8'), AES.block_size, style='pkcs7')  # 选择pkcs7补全
    return pad_pkcs7

# AES加密
def AES_aescode(data):
    data = pad2(data)  # 字节补全
    AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
    AES_en_str = AES_obj.encrypt(data)
    AES_en_str = base64.b64encode(AES_en_str)
    AES_en_str = AES_en_str.decode("utf-8")
    return AES_en_str

data = '{"app_type":"Wechat","version":"3.0","time":1702284047422,"rand":15957198,"openid":"oYQX40ICMDZKf18ywpEgiXFKsHy4"}'
 a = AES_aescode(data)
 print(f"加密为:{a}")

得到的结果为:

加密为:ibdHN7yyu2DjOMJoVeXOmBtW9sb2DL/eiptsdkVPQ0OHJWrF2FGw4aqWBZQ3+JGAN7+xbsrtNnAckuHksLS6fY0hf+1xwx2+FRN5dWXB4vTM3gMNiFy0WWTlzsqp3jG94dZaH2p6MQsJE3saUp2TrnqlApXj+rdeMkSVlc7o2Ys=

至此,完结!!!!

参考:https://juejin.cn/post/7202583557750603833


本文转载自: https://blog.csdn.net/huagangwang/article/details/135013405
版权归原作者 lewis@110 所有, 如有侵权,请联系我们删除。

“记录一次完整的微信小程序+反编译+AES加、解密爬虫”的评论:

还没有评论