这程序显示NAG是用了另一种方法,不是用messagebox. 让我们先运行程序,开始的NAG窗口有2个按钮,按第一个给出一小的信息窗口(Don't
be lame ... blah blah blah) ,第2个将带你进入程序。 想想我们该如何去掉nag?第一件事是用W32Dasm看看...
装载程序后,点击W32Dasm 的串式数据参考(String Data References),列出相关字符串,双击[Don't be lame ...]
,这时你将来到: * Referenced by a (U)nconditional or (C)onditional
Jump at Address: |:0040105F(C) | :0040109E 6840100000 push 00001040 *
Possible StringData Ref from Data Obj ->"NO!" | :004010A3
6808204000 push 00402008 * Possible StringData Ref
from Data Obj ->"Don't be lame, crack the program." | :004010A8
680C204000 push 0040200C :004010AD FF3500204000 push dword ptr [00402000] *
Reference To: USER32.MessageBoxA, Ord:0000h | :004010B3 E89B000000 Call
00401153 :004010B8 C9 leave :004010B9 C21000 ret 0010 第一行*
Referenced by...是告诉你这个信息框调用来自于[0040105F](小c意思是条件转移) 因此我们用转到代码位置命令(shift+F12)跳到0040105F,来到: *
Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00401032(C)
| :0040105B 837D1001 cmp dword ptr [ebp+10], 00000001 :0040105F 743D je
0040109E :00401061 837D1002 cmp dword ptr [ebp+10], 00000002 :00401065
7404 je 0040106B :00401067 C9 leave :00401068 C21000 ret 0010 这里是程序判断你的按钮,如你按第一个按钮,0040105B测试,然后跳出一对话框"Don't
be lame..",如你按第二个按钮,将在:00401061测试,.... 现在我们需要做的是,不管你按第一还是第二个按钮,都应带我们进入程序,这样做可防止我们改别的东西程序运行出错。我们将
[je 0040109E] 改成 [je 0040106B] 我们现在HVIEW里改: 打开程序,按F4选择模式,有3个,在这里先DECODE,将反汇编程序,按F7查找机器码837D1001,将来到: 0000065B:
837D1001 cmp d,[ebp][00010],001 ;"" 0000065F: 743D je 00000069E
00000661: 837D1002 cmp d,[ebp][00010],002 ;"" 00000665: 7404
je 00000066B 大家注意了在HVIEW看到的地址和我们在W32DASM看到不同,HVIEW是显示的是文件的偏移地址(File
offset),而W32DASM和SOFTICE下显示的地址完全一样,是内存地址(memory offset)或称虚拟地址。它们之间的换算有多种方法:
第一、用我刚才方法,查找机器码来确定其位置。 第二、是借助些这方面的工具软件来计算,在主页的工具下载中第2个链接站点有这方面的工具。
第三、此种方法更简单:你在W32DASM中光标定位需要一行,看看W32Dasm的最底端,将会看到类似:
Line:298 Pg 4 of 12 Code Data @:0040113E @Offset 0000073Eh
in File:????.exe 其中 Offset 0000073Eh就是HVIEW中的位置。
我们按F3进入编辑状态,按TAB键或回车键,将[je 00000069E] 改成 [je 00000066B],按F9存盘。当然这时你的W32DASM不能调用此文件,不然是不能存盘的。
Ok,完成第一步 看看,上一段代码是何处被调用?是00401032(C)处,因此我们跳转此处: *
Reference To: USER32.DialogBoxParamA, Ord:0000h | :0040101D E82B010000
Call 0040114D :00401022 E911010000 jmp 00401138 :00401027 C8000000 enter
0000, 00 :0040102B 817D0C11010000 cmp dword ptr [ebp+0C], 00000111 :00401032
7427 je 0040105B :00401034 817D0C10010000 cmp dword ptr [ebp+0C], 00000110
:0040103B 7410 je 0040104D :0040103D 837D0C10 cmp dword ptr [ebp+0C], 00000010
:00401041 0F84F1000000 je 00401138 :00401047 33C0 xor eax, eax :00401049
C9 leave :0040104A C21000 ret 0010 看看[00401032],另一条件指令(一个检测你按了哪个按钮的指令),你不需了解它是如何比较的,因此我们让它直接跳转0040105B处,不让它在那里循环等待你按哪个键,因此我们简单将
00401032 处的JE改成JNE,这样程序应被cracked了! 让我运行程序看看,天啊!跳出一警告窗口!!ERROR...说什么程序被改了!因此这程序有CRC检测功能(如检测你修改程序将停止运行),好吧,再让我们把它干掉。
在W32Dasm串式数据参考(String Data References)中查找'ERROR' 信息,双击来到:
*
Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004010E8(C)
| :004010EE 6840100000 push 00001040 * Possible
StringData Ref from Data Obj ->"ERROR" | :004010F3 68BD204000
push 004020BD * Possible StringData Ref from Data
Obj ->"ERROR: Program has detected tampering. " ->"Execution
terminated" | :004010F8 6881204000 push 00402081 :004010FD FF3500204000
push dword ptr [00402000] 上述被[004010E8]调用,让我们来到那里:
*
Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004010D0(C)
| :004010DE 813D04204000697A0000 cmp dword ptr [00402004], 00007A69 :004010E8
7504 jne 004010EE :004010EA C9 leave :004010EB C21000 ret 0010 好了,我们不必再了解此段代码是何处引用了,足够了。这段程序是检测源代码是否修改,如果修改将给出出错信息,我们将:004010E8处的JNE
NOP掉或改成JE.。 Ok,再运行,YE.。成功! 小结:本题主要是了解如何用W32DASM来静态反汇编调试程序,以及HVIEW的用法。
|