吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5849|回复: 8
收起左侧

[其他转载] 搜索编程的艺术之C#实现小程序包解密算法

[复制链接]
daimaguo 发表于 2020-12-24 12:59
本帖最后由 daimaguo 于 2020-12-24 13:03 编辑

有点标题党了,艺术谈不上,但很实用,自己一点点编程的经验(自学),简单的语法也总是记不住,但是要搞一些工具用的时候怎么办?网上搜索也不一定完全有,大多时候需要自己动手,下面就是我的一些经验:通过搜索引擎获得代码功能片段,修改加工为己用,“我之所以能成功 ,是因为我站在巨人的肩上”——牛顿,群里也常说:问百度一分钟解决,问群里吹2个小时牛B!善用搜索,也能成为别人眼中的大神(离真大神还比较遥远)。
src=http _c-ssl.duitang.com_uploads_item_202004_09_20200409043336_AQ2xU.thumb.40.jpg

前提:略微有些编程基础。目的:C#实现小程序包wxapkg文件解密算法。
工具:vs2015+百度 .net版本选择2.0(环境依赖低)
备注:热乎的,昨晚刚完成。已知有python版本,有点重复造轮子。但exe的不用其它依赖,双击打开就能用岂不美哉!
首先我们通过GitHub大神获得小程序包已知加密算法:
PC端微信把wxapkg给加密,加密后的文件的起始为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标识

通过加密算法得知
已知参数:
  • 微信小程序ID
  • salt:saltiest
  • iv:the iv: 16 bytes
已知加密/解密方法:
  • pbkdf2
  • AES
  • 异或
撸起袖子加油干:
那我们在电脑C:\Users\Administrator\Documents\WeChat Files\Applet\目录随便找一个微信小程序包:

然后vs里创建个项目,画一个按钮和一个文本框。
3.jpg



然后定义已知参数:
[C#] 纯文本查看 复制代码
string wid = "wx94af8311484aa69a";
byte[] iv = Encoding.UTF8.GetBytes("the iv: 16 bytes");
string salts = "saltiest"

通过搜索引擎获取几个需要的函数(核心技术):
搜索关键词:
c# PBKDF2
c# 文件读写 byte
c# AES byte

当然并非直接可用,需要部分修改完善。但基本改动不大,省去很多时间,起码不用看c#从入门到精通了,整理修改得到如下代码
[C#] 纯文本查看 复制代码
        public static byte[] AESDecrypt(byte[] inputdata, byte[] iv, byte[] strKey)
        {
            SymmetricAlgorithm des = Rijndael.Create();
            des.Key = strKey;
            des.IV = iv;
            byte[] decryptBytes = new byte[inputdata.Length];
            using (MemoryStream ms = new MemoryStream(inputdata))
            {
                using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Read))
                {
                    cs.Read(decryptBytes, 0, decryptBytes.Length);
                    cs.Close();
                    ms.Close();
                }
            }
            return decryptBytes;
        }
        public byte[] PBKDF2(string wxid,string salts) {
            byte[] salt = Encoding.UTF8.GetBytes(salts);
            //RNGCryptoServiceProvider cryptoProvider = new RNGCryptoServiceProvider();
            //cryptoProvider.GetBytes(salt);
            Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(wxid, salt, 1000);
            return pbkdf2.GetBytes(32); // 改为32位
        }
        //读取文件到byte[]
        private byte[] FileContent(string fileName)
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                try
                {
                    byte[] buffur = new byte[fs.Length];
                    fs.Read(buffur, 0, (int)fs.Length);
                    return buffur;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }

        //利用byte[]数组写入文件
        protected void writerFile(byte[] array,string fileName)
        {              
            //创建一个文件流
            FileStream fs = new FileStream(fileName, FileMode.Create);
            //将byte数组写入文件中
            fs.Write(array, 0, array.Length);
            //所有流类型都要关闭流,否则会出现内存泄露问题
            fs.Close();  
        }

有了核心函数方法了我们来获取key:
[C#] 纯文本查看 复制代码
byte[] key = PBKDF2(wid, salts);

然后解密头部1023字节
[C#] 纯文本查看 复制代码
byte[] dataByte = FileContent("__APP__.wxapkg");
byte[] originData = AESDecrypt(dataByte.Skip(6).Take(1024).ToArray(),iv,key); //从第7个字节开始获取1024字节然后AESDecrypt

解密,再提取解密后的前1023字节,至此头部的解密完成,那么对不对呢,我们已知有python版的,那么我们就打印出来key和解密后的base64编码(为了方便比较统一编码)

微信截图_20201224125009.png

好像没什么毛病,剩下的就是把1024字节以后的与xorkey异或解密加上上面的头部写入即可。方法如上:重复搜索整理,相信大家已经掌握!由于本帖着重讨论方法而非源码,因此不再赘述!
总结:
拙见:编程重在解决问题的方法和思路而非编程本身,互联网真是知识的海洋,当然也有坑!
优势:有网能上天入地
缺陷:断网懵逼
文中代码参考资料:
  • https://www.cnblogs.com/ldyblogs/p/Byte.html
  • https://bbs.csdn.net/topics/394385963
  • https://blog.csdn.net/weixin_30794851/article/details/98793268
  • https://github.com/kksanyu/pc_wxapkg_decrypt_python
1.jpg

免费评分

参与人数 3吾爱币 +2 热心值 +3 收起 理由
yj741963 + 1 + 1 我很赞同!
3KING三金胖王 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
致远英才 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

李喔 发表于 2020-12-24 13:08
谢谢大佬
致远英才 发表于 2020-12-24 13:43
hnwang 发表于 2020-12-24 15:07
zhapkai 发表于 2020-12-24 23:10
谢谢大佬分享和解析,最好可以开源,方便小白学习
jovicisco 发表于 2020-12-25 17:07
太厉害了!
Qiudl 发表于 2021-4-21 15:53
找了好久终于看到一个可以用的,感谢分享
huangyique 发表于 2022-9-3 15:10
来学习一下
chinavy 发表于 2022-9-4 22:06
bing,或google可能半分钟解决.
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-26 16:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表