-
-
[原创]再堕落一次:破解慧源通用进销存(.net)
-
发表于:
2005-2-22 16:52
12211
-
[原创]再堕落一次:破解慧源通用进销存(.net)
名称:慧源通用进销存
版本:单机版1.13
编译:VB.net
网址:www.hysb.net
保护方式:模糊器(Obfuscator)
圈内人常说喜欢爆破的人比较堕落,我不是圈内人,所以不在乎,这不,又堕落了一次。
首先运行一下,弹出如下窗口,显示未注册版本还能使用几次。(图1)
用Reflector打开慧源数霸.EXE,发现经过了模糊,满眼都是毫无意义的b、h、au等等。(图2)
点击“注册”,弹出窗口中要输入用户名和密码。(图3)
这是我第一次面对模糊过的.NET程序,只能摸索自已的思路。现在首先要做的就是从茫茫代码中找出判断注册码的算法所在。用ILDASM将慧源数霸的EXE反汇编,可以得到很多资源文件。我们用Resorucer打开这些资源,发现了突破口,因为几乎每个资源中都有一张图片,表示出当前窗口。还记得我们刚才的注册窗口中的“软件注册”的图片吗,找的就是它。
找遍所有的资源,都没有发现这张图片,难道注册码判断不在主文件中?我完全有可能。于是将所有的DLL反汇编,终于,在HYSB.DLL中被发现。原来注册窗口的主代码就是HYSB.DLL-->am中的private void b(object A_0, EventArgs A_1)和private string a(string A_0, string A_1, string A_2)。(图4)
而注册窗口中的序列号刚是在.ctor()中实现的。代码如下:
public am()
{
int num1;
int num2;
string text1;
string text2;
this.n = false;
this.p = new au();
this.a();
string text3 = @"C:\";
am.GetVolumeInformation(ref text3, ref text1, 0xff, ref this.q, ref num1, ref num2, ref text2, 0x100);
this.r = StringType.FromInteger(this.q);
this.r = Strings.Mid(this.r, this.r.Length - 4);
this.l().Text = this.r;
}
public bool h()
{
bool flag1;
try
{
string text1;
string text2;
string text3;
RegistryKey key1;
if (this.d())
{
this.b();
text2 = @"Software\HYSB\Soft\" + this.a;
key1 = Registry.CurrentUser.OpenSubKey(text2);
if (key1 == null)
{
string text5 = @"Software\Microsoft\Windows\" + this.a;
RegistryKey key2 = Registry.CurrentUser.OpenSubKey(text5);
if (key2 != null)
{
string text6 = StringType.FromObject(key2.GetValue("Code"));
string text7 = StringType.FromObject(key2.GetValue("NoCode"));
key1 = Registry.CurrentUser.CreateSubKey(text2);
key1 = Registry.CurrentUser.OpenSubKey(text2, true);
key1.SetValue("Code", this.c(text6));
key1.SetValue("NoCode", this.c(text7));
key1.Close();
key2.Close();
}
}
key1 = Registry.CurrentUser.OpenSubKey(text2);
if ((key1 != null) && (key1.GetValue("Code") != null))
{
text1 = this.a((byte[]) key1.GetValue("Code"));
text3 = this.a((byte[]) key1.GetValue("NoCode"));
goto Label_0152;
}
}
return false;
Label_0152:
key1.Close();
text2 = @"AdmiSoft\" + this.a;
key1 = Registry.CurrentUser.OpenSubKey(text2);
if (key1 == null)
{
return false;
}
string text4 = this.a((byte[]) key1.GetValue("UnitName"));
if (StringType.StrCmp(this.a(text4, text3, this.a), text1, false) == 0)
{
return true;
}
if (StringType.StrCmp(this.a(text4, text3), text1, false) == 0)
{
Interaction.MsgBox("\u672c\u8f6f\u4ef6\u5df2\u7ecf\u66f4\u65b0\u6ce8\u518c\u53f7\u3002\u5982\u679c\u60a8\u662f\u4e00\u4e2a\u5df2\u7ecf\u6ce8\u518c\u7684\u6b63\u7248\u7528\u6237\uff0c\u8bf7\u5411\u8f6f\u4ef6\u5f00\u53d1\u5546\u7d22\u53d6\u65b0\u7684\u6ce8\u518c\u53f7\u3002", MsgBoxStyle.Information, this.i());
return true;
}
flag1 = false;
}
catch (Exception exception2)
{
ProjectData.SetProjectError(exception2);
Exception exception1 = exception2;
this.c(exception1);
ProjectData.ClearProjectError();
}
return flag1;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)