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

一、准备工具

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

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

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

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

                找稳定版下载(我的环境是 win10):

二、解密小程序

        1、登录PC端微信,找到目标小程序打开后可关闭,目的是为了小程序源码包下载缓存至本地:

        2、点击打开文件夹:

        3、点击进来后,有对应的小程序缓存,类似于 “wxd418ee346d79d382”就是打开过的小程序的id。按照路径找到加密过的文件 "__APP__.wxapkg":

      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、反编译结果如下,用微信开发者工具打开。

        

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

 四、开始逆向分析
        1、Fiddler抓包分析

        

       2、关键词查找

        1、根据接口的特征搜索,比如 headers、post body 等等。

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

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

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

        3、AES加密、解密转换成python代码

                1、首先需要找到 秘钥(u)、偏移量(l)。按住ctrl键,找到定义位置。

                

注意:是用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

       

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值