搜索编程的艺术之C#实现微信小程序包解密

目的: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里创建个项目,画一个按钮和一个文本框。然后定义已知参数:

 string wid = "wx94af8311484aa69a";
 byte[] iv = Encoding.UTF8.GetBytes("the iv: 16 bytes");
 string salts = "saltiest";

通过搜索引擎获取几个需要的函数:

搜索关键词:
c# PBKDF2
c# 文件读写 byte
c# AES byte

当然并非直接可用,需要部分修改完善。但基本改动不大,省去很多时间,起码不用看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

byte[] key = PBKDF2(wid, salts);

然后解密头部1023字节

byte[] dataByte = FileContent("__APP__.wxapkg");
byte[] originData = AESDecrypt(dataByte.Skip(6).Take(1024).ToArray(),iv,key); //从第7个字节开始获取1024字节然后AESDecrypt

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


剩下的就是把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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值