爱它,就要占有它

今日偶然在硬盘的某个角落发现一款名为“netsuper”的局域网超级工具,这个工具非常适合菜鸟在网吧恶作剧,具体的功能我就不介绍了,想了解的朋友可以参考软件自带的帮助文件。
双击运行,居然叫我注册。

那要看你有没有这个本事了!立志成为Cracker的我怎么能容忍这样的软件在我的电脑里存在呢!OK! 菜鸟跟我来!看我如何完全占有她!
工具:

  • PEID(查壳)
  • W32asm(静态分析)*
  • OD(动态跟踪)
  • pexplorer(资源修改)

一 温柔一刀(暴破)

根据破解的一般步骤,先用PEID查壳,没加壳。

直接用W32asm载入,选择字符串参考,查找刚刚提示的“软件试用期已过,请你注册!”
双击字符串来到如下代码:

* Reference To: MFC42.Ordinal:0ACC, Ord:0ACCh
                                  |
:0040ACFA E8B1C50000       Call 004172B0
:0040ACFF 83F8FF          cmp eax, FFFFFFFF
:0040AD02 7417                 je 0040AD1B
:0040AD04 8B4C243C  mov ecx, dword ptr [esp+3C]
:0040AD08 51                      push ecx
:0040AD09 8D4C2444  lea ecx, dword ptr [esp+44]
* Reference To: MFC42.Ordinal:0ACC, Ord:0ACCh
:0040AD0D E89EC50000       Call 004172B0
:0040AD12 83F8FF         cmp eax, FFFFFFFF
:0040AD15 0F854F010000      jne 0040AE6A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040AD02(C)
|
:0040AD1B 6A00                    push 00000000
:0040AD1D 6A00                    push 00000000
Possible StringData Ref from Data Obj ->"软件试用期已过,请你注册!"

要达到破解的目的就要改变程序的执行流程,让程序跳过这个出错消息,我们看到跳转来自
0040AD02,在这个地址上点右键->返回来到

:0040AD02 7417                 je 0040AD1B

这里就是传说中的关键跳了。我们用OD载入Netsuper.EXE,按CTRL+G,输入关键跳的地址0040AD02,按确定后来到了该行代码处,按F2下断,F9运行程序,程序被断在0040AD02,并且指向出错消息0040AD1B的箭头呈红色,说明跳转已经实现,我们此时按一下空格键将je改为jne,点汇编后点取消,F8单步,可以看到程序没有跳到出错消息处,继续F8到

0040AD15             jnz NetSuper.0040AE6A

这里又是一个跳转,并且箭头呈绿色,说明跳转没有实现,下面就是出错消息,如果不跳的话……
所以,我们要将jnz改为jz,F8后程序跳走了,没有执行到出错消息处,说明我们的修改是成功的!
在代码上右键->复制到可执行文件->所有改动->全部复制,在弹出的窗口里右键->保存文件,
输入文件名test。赶紧运行刚刚生成的test.exe,胜利在向我们招手,可是,可是居然弹出如下消息!郁闷吧!

OK!不要着急,我们还是用刚才的w32asm载入test. exe,还是刚才的方法,查找“软件被破坏!”字符串。
双击来到代码:

:0040A91A 85C0                   test eax, eax
:0040A91C 7426                    je 0040A944
:0040A91E 53                        push ebx
:0040A91F 53                        push ebx
Possible StringData Ref from Data Obj ->"软件被破坏!请到http://www.sea-soft.com上去下载

看到没,它前面有个跳转:

:0040A91C 7426                  je 0040A944

右键->编辑修改,将74改为75,应用。等于是把je改为了jne,运行一下刚刚生成的test_BAK.EXE,
怎么样!这次OK了吧!

二 死缠烂打(追码)

 作为一个立志成为Cracker的菜鸟,当然不能只满足于暴破,对吧!
 运行原程序Netsuper.exe,出现图1的消息,点确定后弹出注册框,我输入注册名hkliya和注册码87654321,点确定后出现的对话框!


OK!这就是我们想要的!用W32asm载入Netsuper.exe,查找“注册码错误!注册失败!”字符串,双击来到如下代码:

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004126C2(C), :004126D9(C)
|
:00412731 6A00                    push 00000000
:00412733 6A00                    push 00000000
* Possible StringData Ref from Data Obj ->"注册码错误!注册失败!"

根据提示可知跳转来自004126C2和004126D9。
打开OD,按CTRL+G输入004126C2,确定后来到:

004126C2        je short NetSuper.00412731

向上看,在前面是一个CALL:

004126BA          call <jmp.&MFC42.#2764>;

根据经验这里是关键比较(经过后来的分析也证实了这一点),我们在这行代码上按F2下断,F9运行,输入假的注册名和注册码,我还是输入hkliya和8764321(大家可以随便填,只要自己记住就行,因为我们后面还要用到),F9运行后程序断在了刚刚下的断点处,F7跟进(因为我们知道这里是一个比较,所以跟进来看一下是谁在和谁作比较),进来后F8两下发现又是一个CALL,因为下一行是retn(就是返回语句),所以我们必须F7跟进,要不就什么也看不到了。在单步的时候请注意一下右边的寄存器窗口,按F8四下后我的寄存器窗口出现了刚刚输入的假注册码87654321

和另外一串字符,
至此可以断定是用我们输入的注册码和-791082867(这个字符串是根据机器码计算出来的,你的应该和我的不一样,把你的记下来就行)比较,CTRL+F2重新运行程序,注册名还是填hkliya,注册码填你刚刚在寄存器窗口看到的字符串,我这里就是-791082867,确定后程序还是断在我们下在断点:

004126BA          call <jmp.&MFC42.#2764>

既然我们已经知道里边的情况,这次就不用再跟进了,F8步过,2步后来到关键跳004126C2,很高兴这次跳转的箭头呈绿色,说明跳转没有实现,继续F8单步,没走几步又来到一个CALL:

004126D1           call <jmp.&MFC42.#2764>

下面又是一个跳转,并且还是跳向出错消息的,这和上面的情况是不是很相似呢?我们可以看到这个CALL和刚才那个调用的是同一断代码,由此我们更加确信这里又是一个关键比较,刚刚比较的是注册码,这次是不是该比较注册名了呢?进去看看不就知道了……还是跟刚才一样,进去之后又是一个CALL,我们仍然选择跟进,几下F8以后来到:

73D8658F            mov eax,dword ptr ds:[esi]

这时下边的窗口中出现了的画面:

OK!果然是我们输入的注册名和另一串字符作比较,请大家一定记下这个字符串,直接运行原程序netsuper.exe,这次注册名处填-2033769190,注册码处填-791082867,确定后果然注册成功了:

三 妇从夫姓(改资源)

至此我们已经完全把它征服了,但我是一个追求完美的人,所以决定再对它进行一番改造。用PE Explorer打开netsuper.exe,选择视图->资源,找到对话框下关于对话框,修改的方法太简单,我就不说了,下面是我修改后的:

本文发表于一蓑烟雨论坛: http://www.unpack.cn/thread-15020-1-1.html