好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 leiphone4s 于 2018-6-4 11:00 编辑
跟大神学“[.NET逆向] 星宇财务记账软件正式版 -- 追码/注册机”
本人小白,也不搞程序开发,所以学习这个还是比较吃力的
最近在学.net程序破解,主要以爆破为主看到大神这个贴子,就跟着学
原贴地址 https://www.52pojie.cn/forum.php?mod=viewthread&tid=413431&extra=page%3D1%26filter%3Dtypeid%26typeid%3D256
发这个帖子是为了从小白的角度分析这个软件,有些地方和大神的不太一样,有的大神没说清楚,小白看起来吃力
我是先自己破解,然后才和大神的做比较,所以我在这主要就说下不一样的地方
1.软件爆破方面
我用的是dnspy 动态分析比较简单,首先也是分析出来输入注册码点确定提示重启软件,这块只是保存输入的用户名和密码,没啥关键用,所以肯定是在窗口加载的时候验证的
观察程序主程序,有“试用版”这些关键字,搜索这个能到man_load这个函数
2 注册方面
就是函数让我头疼了好一会,根据名字的意思是,由注册码反生成用户名,如果生成的用户名和原来保存的(就是最开始注册时输入的名字)一样,函数返回真,上层那个IF条件才能为真
一开始我就头疼了,完蛋这要怎么写注册机?我哪知道正确的注册码样式是什么样的?到这卡住 了
然后看大神的贴子,才知道那个method2是method3的逆向函数,根据名字也能看出是根据用户名算注册码,可是我没查到哪里有调用这个method2函数,我知道它的只调函数是GETSN()这个方法,
求大神帮忙分析下哪里有调用这个,作者写这个的用途是啥 ,为了方便我们破解?
静态分析不会的话,用dnspy动态分析。明确函数是method2这个,它有三参数
string encryptStr, string key, string IV encryptstr(输入的用户名) key (2008-10-10) iv(xysoft2008)
开始写注册机,小白这个也不会,我也是学的大概说下
用reflector打开脱壳的主程序
选择保存路径 会生成许多 .cs文件,找到里面的SLEncrypt.cs(因为method2在这里面)
打开SharpDevelop(编写c#程序的),新建 一个解决方案(为啥叫这名字?小白不懂)
添加SLEncrypt.cs
编一个这个窗体(这个不会就百度,没法细说),运行一下程序,报错,SLEncrypt.cs下class6什么的报错,把SLEncrypt.cs里面不重要的删掉
上面成这样,再运行不报错了,然后双击“生成注册码”编写代码
保存就可以了
我最后写的是这样的,为了验证方法3
最后还是声明 ,学破解是爱好,本人不搞软件开发,也没相关经验,上面的什么函数方法叫法什么的也都是百度学的,不对的大神指正。
谢谢
最后求大视分析 下这个方法
public static string smethod_3(string encryptedValue, string key, string IV) //encryptedvalue 这个是输入的注册码 key 2008-10-10 iv xfsoft2008
{
string text = encryptedValue; //text 等于encyptedvalue
if (text.Length < 16) //如果text长度小于16位 返回空
{
return "";
}
for (int i = 0; i < 8; i++) //循环8次
{
text = text.Substring(0, i + 1) + text.Substring(i + 2); // text=text从第一位取到第i+1+text从第一位取到第i+2位(这个对吧?)
}
encryptedValue = text; //encryptedValue = text;
key += "12345678"; //key=2008-10-1012345678
IV += "12345678"; //iv=xysoft200812345678
key = key.Substring(0, 8); //key=2008-10-
IV = IV.Substring(0, 8); //iv=xysoft20
string result;
try //下面这些看不懂了,大神帮忙分析下 谢谢
{
ICryptoTransform transform = new DESCryptoServiceProvider
{
Key = Encoding.UTF8.GetBytes(key),
IV = Encoding.UTF8.GetBytes(IV)
}.CreateDecryptor();
byte[] array = Convert.FromBase64String(encryptedValue);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write);
cryptoStream.Write(array, 0, array.Length);
cryptoStream.FlushFinalBlock();
cryptoStream.Close();
result = Encoding.UTF8.GetString(memoryStream.ToArray());
}
catch (Exception)
{
result = "";
}
return result;
} |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|