oep1在《NET程序的破解(二)》一文里介绍了如何爆破NQQTools这类混淆的很面目全非类型程序的思路,已经说得已经很详细了,这里就不再重复了。
我这里要说的是,其实当时只要再深入一步,就可以得到其注册算法!
还记的那个发生异常而中断的画面吧?那个抛出异常的函数名字叫Decrypt3DES(),属于类NQQTools.Jm。用Reflector找到该类,可以发现有两个Decrypt3DES函数,上边的那个只有两个参数的就是它了,可惜看不到源代码。但也没关系。
看看同一个类里边还有什么?!
看到那两个名字叫Encrypt3DES的函数了吗?原来粗心的作者居然连注册算法也给我们留下了!当然还有一种可能是源代码其他地方也用到了,不得不留下。我估计这个NQQTools.Jm在被混淆前应该叫做NQQTools.Cryptography之类的,是专门用于安全处理的核心类。
至此,熟悉.NET的人很容易就能写出这两个函数,只要我们能知道这个key,就什么都搞定了。而key在《NET程序的破解(二)》里已经得到了,是24ynlisB4uity11!5(QQ。
注册解密的函数如下:
public string Encrypt3DES(string a_strString, string a_strKey)
{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(a_strKey));
DES.Mode = CipherMode.ECB;
ICryptoTransform DESEncrypt = DES.CreateEncryptor();
byte[] Buffer = ASCIIEncoding.ASCII.GetBytes(a_strString);
return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}
我们甚至也能得到当初的加密函数:
string Decrypt3DES(string a_strString, string a_strKey)
{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(a_strKey));
DES.Mode = CipherMode.ECB;
ICryptoTransform DESDecrypt = DES.CreateDecryptor();
string result = "";
try
{
byte[] Buffer = Convert.FromBase64String(a_strString);
result = ASCIIEncoding.ASCII.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}
catch(Exception e)
{
throw(new Exception("Invalid Key or input string is not a valid base64 string" , e)) ;
}
return result ;
}
这都要感谢那个没有被改换过的函数名字。阿门!
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法