本帖最后由 H夜 于 2019-6-6 18:16 编辑
软件名称:南方起名程序 V3.30
下载地址:http://www.nfzhouyi.com/qita/Download.htm
起名程序爆破下载地址:链接:http://pan.baidu.com/s/1nuY35bj 密码:lfz4
解压密码:www.52pojie.cn
续昨天完成南方周易排八字的.net逆向练习之后,有朋友说把南方起名程序也破解了吧。于是就在来看看,
因为昨天爆破的排八字,没有找到全局的爆破点,导致大家下载回去,还需要输入一个假注册码。今天就
继续来分析,下载程序开工。
一、复习昨天的知识
工具还是昨天使用的Dnspy、Reflect和Reflecxi插件。
1、Let's Go Go,继续向.Net进军
由于是同一系列的软件,有了昨天的基础,今天就少了很多分析的过程,直接用昨天的套路就可以搞定,所以
今天直接在Dnspy里面搜索了这个字符串 "a@^*(^*ga$(&%io"; 因为我们已经知道,当注册码计算完成的时
候,下面有这段字符串出现。
[C#] 纯文本查看 复制代码 public static bool b()
{
string right = "";
string left = "";
bool flag = c.e().FileSystem.FileExists(t.m + "\\msqimchx330.dll");
bool result;
if (flag)
{
FileSystem.FileOpen(1, t.m + "\\msqimchx330.dll", OpenMode.Input, OpenAccess.Default, OpenShare.Default, -1);
string text = FileSystem.LineInput(1);
string text2 = FileSystem.LineInput(1);
FileSystem.FileClose(new int[]
{
1
});
text2 = r.b(text2);
string[] array = Strings.Split(text2, "|", -1, CompareMethod.Binary);
try
{
right = array[0];
left = array[1];
t.g = array[2];
t.h = array[3];
t.i = array[4];
}
catch (Exception expr_B8)
{
ProjectData.SetProjectError(expr_B8);
ProjectData.ClearProjectError();
}
bool flag2 = Operators.CompareString(r.b, right, false) != 0;
if (flag2)
{
result = false;
}
else
{
r.a(ref right);
bool flag3 = Operators.CompareString(left, r.c, false) == 0;
if (flag3)
{
r.c = "a@^*(^*ga$(&%io";
result = true;
}
else
{
result = false;
}
}
}
else
{
result = false;
}
return result;
截图上我做了注释,我们今天省略中间的过程,直接奔主题。通过搜索,知道t.a、t.b是2个关键过程,在每个
过程的头部加上断点,其中t.b是程序加载的时候,就会断下的,看来全局的标志和这个t.b有关。我们跟踪这
个t.b的过程,跟踪了一会,发现这段代码里面的Flag没有影响注册的过程,程序飞了。没有什么关键的flag
让我们来处理,仔细想想,那么唯一的可能就是在这个t.b的上面,还有一个调用。为了验证我们的想法,我
们要怎么来做呢。Follow Me
2、找到上层调用,发现全局爆点的老巢
为了验证我们的猜想,找到调用t.b的那个过程,要怎么来操作呢,通过摸索,原来是这样子的,在t.b的过程名上鼠标
右键,在弹出的菜单中,选中"分析",在分析器页面,出现了一个"使用"、"被使用",按我们的想法,应该是到被使用
那里看看,看看t.b是被"谁"使用了。接着我们继续看图。
点开"被使用",,然后是一个名叫t.c的过程调用了t.b,我们双击进去看看是什么情况。打开t.c过程,眼前一亮,非常简洁
的代码,
[Asm] 纯文本查看 复制代码 public static void c()
{
global::t.g();
global::t.f();
bool flag = global::t.b() & Operators.CompareString(global::t.p, global::r.b, false) == 0 & !File.Exists(global::t.m + "\\sysqimin330.dll");
if (flag)
{
global::t.o = true;
}
else
{
global::t.o = false;
}
}
看到这里,基本上大家都明白要如何来做了,这里有一个Global全局变量的Flag,在这里下断,然后重新加载程序,
程序按照我们的预期在这里断下来,然后选中那个Flag标志,按F2,手动把false改成true,然后F5让程序跑起来,到
注册那里一看,我们成功了,嘿嘿。。。
3、Reflecto大法修改爆点
安全的按照我们的预期,找到了爆破点,并且是个全局的,相比于昨天,,我们又进步了一点点:)
总结:
和昨天的破解相比,又掌握了Dnspy的一个用法,通过分析功能,可以知道一个函数或者过程的调用路径,
知道有谁调用了它,又知道它调用了谁。这对我们逆向很有帮助。看来每个工具都有好多的功能,让我们去了
解。希望这篇分析,能对刚入门的有所帮助。特别是要记得今天的关键学习点,要学会Dnspy的
分析功能。
谢谢大家的捧场。
|