-
-
[原创]dotnet KeyGenMe 变KeyGen
-
发表于:
2009-2-16 21:12
9176
-
[原创]dotnet KeyGenMe 变KeyGen
【文章标题】: dotnet KeyGenMe 变KeyGen
【文章作者】: dreamzgj
【作者主页】: http://hi.baidu.com/dreamzgj
【作者声明】: 本文也没什么含量,高手可以路过,只是希望大家可以多多交流.net平台下的软件安全问题。
下午在老外的一个论坛看到了个.net的KeyGenMe。没事就玩玩。
首先peid查壳,Microsoft Visual C# / Basic .NET。呵呵,无壳。(其实我不会脱壳, )。
我们用Dis#看看,名称都没问题,看来没有名称混淆,但发现方法体内都是:// decompiler error。看来是流程混淆了。
只好IL Dasm了。打开一看看到处都是跳转。工具反混淆吗?我是菜鸟也不知道用撒工具好,那就自己来吧,反正代码量又不多。
IL Dasm Dump出来程序,直接搜索button1_click。由于没有名称混淆,而此KeyGenMe也就一个按钮,不用说了这个事件是个关键。打开慢慢分析吧。
下面是button1_click事件整理后的代码:(以下代码是从IDA中分析整理的,因为IDA可以直接点击跳转的标号,这样就方便多了)
newobj void [System]System.Diagnostics.Stopwatch::.ctor()
Stloc 0
Ldloc 0
callvirt void [System]System.Diagnostics.Stopwatch::Start()
ldstr "Just so you know, the below loop is for testing purposes.”
Stloc 1
Ldc.i4.0
IL_loop:
Ldloc 2
Ldc.i4 0x3E8
Blt loc_632
Ldloc 0
callvirt void [System]System.Diagnostics.Stopwatch::Stop()
ldar.0
ldfld class [System.Windows.Forms]System.Windows.Forms.Label keygenme.Form1::label3
ldloc 0
callvirt int64 [System]System.Diagnostics.Stopwatch::get_ElapsedMilliseconds()
stloc 3
ldloca 3
call callvirt int64 [System]System.Diagnostics.Stopwatch::get_ElapsedMilliseconds()
callvirt void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(class System.String)
ldarg.0
ldfld class [System.Windows.Forms]System.Windows.Forms.TextBox keygenme.Form1::textBox2
callvirt class System.String [System.Windows.Forms]System.Windows.Forms.Control::get_Text()
//这里将正确的注册码压入堆栈
ldloc 1
//注意关键的地方
call bool [mscorlib]System.String::op_Equality(class System.String, class System.String)
//如果要爆破了话,就在这里了
brfalse loc_71B
ldstr “VALID”
call value class [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(class System.String)
pop
ret
loc_71B:
ldstr "Invalid..."
call value class [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(class System.String)
pop
ret
IL_632:
ldarg.0
ldfld class [System.Windows.Forms]System.Windows.Forms.TextBox keygenme.Form1::textBox1
callvirt class System.String [System.Windows.Forms]System.Windows.Forms.Control::get_Text()
//下面的Cenerate() 方法则是关键算法部分
call class System.String KeyGenerator::Generate(class System.String str)
stloc 1
ldloc 2
ldc.i4.1
add
stloc 2
br IL_loop
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)