当前位置:   article > 正文

记录一次完整的微信小程序+反编译+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方式补齐数据的。

  1. import json
  2. from Crypto.Cipher import AES
  3. import base64
  4. def pkcs7_unpadding(txt):
  5. padding_size = txt[-1]
  6. return txt[:-padding_size]
  7. def data_decrypt2(data):
  8. secret = b"f13df6c54e8efdfe" # 秘钥
  9. iv = b"a3648c7c1ef3e9fe" # 偏移量
  10. iv1 = bytes(list(bytes(iv))) # 偏移量
  11. aes = AES.new(secret, mode=AES.MODE_CBC, iv=iv1)
  12. b_data = base64.b64decode(data)
  13. meg = aes.decrypt(b_data)
  14. # print(meg)
  15. b = pkcs7_unpadding(meg)
  16. # print(b.decode())
  17. print(json.loads(b))
  18. txt1 = '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'
  19. data_decrypt2(txt1)

 得到的结果:

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

需要解密的文本:

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

  解密结果:

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

加密代码如下:

  1. from Crypto.Cipher import AES
  2. from Crypto.Util.Padding import pad
  3. import base64
  4. key = 'f13df6c54e8efdfe' # 秘钥
  5. iv = "a3648c7c1ef3e9fe" # 偏移量
  6. # 补足字节方法 --- 选择pkcs7补全
  7. def pad2(value):
  8. # 选择pkcs7补全
  9. pad_pkcs7 = pad(value.encode('utf-8'), AES.block_size, style='pkcs7') # 选择pkcs7补全
  10. return pad_pkcs7
  11. # AES加密
  12. def AES_aescode(data):
  13. data = pad2(data) # 字节补全
  14. AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
  15. AES_en_str = AES_obj.encrypt(data)
  16. AES_en_str = base64.b64encode(AES_en_str)
  17. AES_en_str = AES_en_str.decode("utf-8")
  18. return AES_en_str
  19. data = '{"app_type":"Wechat","version":"3.0","time":1702284047422,"rand":15957198,"openid":"oYQX40ICMDZKf18ywpEgiXFKsHy4"}'
  20. a = AES_aescode(data)
  21. print(f"加密为:{a}")

得到的结果为:

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

至此,完结!!!!

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

       

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/279451
推荐阅读
相关标签
  

闽ICP备14008679号