-
-
[原创]由字符串参考想到的。。。
-
发表于:
2006-3-13 05:31
8807
-
大家都看过CCDebuger大哥写的《OllyDBG 入门系列(二)-字串参考》吧。同样的例子使用我的方法试一试。
启动 OllyDBG,选择菜单 文件->打开 载入 CrackMe3。F9运行。点击“Register now!”跳出一个对话框,“Wrong Serial”。来动手了,呵呵,在OD(OllyDBG)中点击F12(什么不知道这是干什么的,赶紧查OD帮助,F12 - 停止程序执行,同时暂停被调试程序的所有线程。请不要手动恢复线程运行,最好使用继续执行快捷键或菜单选项【像 F9】。),好了,最神奇的开始了,我们按Alt+F9(什么又不知道,Alt+F9 - 执行直到返回到用户代码段,跟踪程序直到指令所属于的模块不在系统目录中,在此期间不进入子函数也不更新CPU数据。因为程序是一条一条执行的,所以速度可能会慢一些。按Esc键,可以停止跟踪。),那么现在我们该干什么呢?当然简单了,点 CrackMe3中的Beggar off窗口中的确定按钮了。呵呵,看到了吗?
0043D13C |. 53 PUSH EBX ; /Style
0043D13D |. 57 PUSH EDI ; |Title
0043D13E |. 56 PUSH ESI ; |Text
0043D13F |. 8B45 FC MOV EAX, [EBP-4] ; |
0043D142 |. 8B40 24 MOV EAX, [EAX+24] ; |
0043D145 |. 50 PUSH EAX ; |hOwner
0043D146 |. E8 3191FCFF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
0043D14B |. 8945 F8 MOV [EBP-8], EAX ; OD断在这里(*)
0043D14E |. 33C0 XOR EAX, EAX
怎么回事应该可以看到“Wrong Serial”的?
往上看看,
0043D0CD |. 50 PUSH EAX ; /pRect
0043D0CE |. 8B45 FC MOV EAX, [EBP-4] ; |
0043D0D1 |. 8B40 24 MOV EAX, [EAX+24] ; |
0043D0D4 |. 50 PUSH EAX ; |hWnd
0043D0D5 |. E8 EA90FCFF CALL <JMP.&user32.GetWindowRect> ; \GetWindowRect
。。。。。。。
0043D0FE |. 83D2 00 ADC EDX, 0
0043D101 |> 03D0 ADD EDX, EAX ; |
0043D103 |. 52 PUSH EDX ; |X
0043D104 |. 6A 00 PUSH 0 ; |InsertAfter = HWND_TOP
0043D106 |. 8B45 FC MOV EAX, [EBP-4] ; |
0043D109 |. 8B40 24 MOV EAX, [EAX+24] ; |
0043D10C |. 50 PUSH EAX ; |hWnd
0043D10D |. E8 6A92FCFF CALL <JMP.&user32.SetWindowPos> ; \SetWindowPos
。。。。。。。
呵呵看明白了吧,这些是与windows窗体相关的函数。也就是,它不是单纯的调用WinAPI MessageBoxA。那么,我们现在怎么办呢?Ctrl+F9(这个你知道该干什么的吧)
0043D1A7 |. E8 5891FCFF CALL <JMP.&user32.SetActiveWindow> ; \SetActiveWindow
0043D1AC \. C3 RETN
0043D1AD .^ E9 AE60FCFF JMP 00403260
0043D1B2 .^ EB A7 JMP SHORT 0043D15B
0043D1B4 . 8B45 F8 MOV EAX, [EBP-8] ;OD断在这里(*)
0043D1B7 . 5F POP EDI
0043D1B8 . 5E POP ESI
0043D1B9 . 5B POP EBX
0043D1BA . 8BE5 MOV ESP, EBP
0043D1BC . 5D POP EBP
0043D1BD . C2 0400 RETN 4 ;运行到这里
再按F8
00440F74 |. B9 80104400 MOV ECX, 00441080 ; ASCII "Beggar off!"
00440F79 |. BA 8C104400 MOV EDX, 0044108C ; ASCII "Wrong Serial,try again!"
00440F7E |. A1 442C4400 MOV EAX, [442C44]
00440F83 |. 8B00 MOV EAX, [EAX]
00440F85 |. E8 DEC0FFFF CALL 0043D068
00440F8A |. EB 18 JMP SHORT 00440FA4
00440F8C |> 6A 00 PUSH 0
00440F8E |. B9 80104400 MOV ECX, 00441080 ; ASCII "Beggar off!"
00440F93 |. BA 8C104400 MOV EDX, 0044108C ; ASCII "Wrong Serial,try again!"
00440F98 |. A1 442C4400 MOV EAX, [442C44]
00440F9D |. 8B00 MOV EAX, [EAX]
00440F9F |. E8 C4C0FFFF CALL 0043D068
00440FA4 |> 33C0 XOR EAX, EAX ;OD断在这里(*)
00440FA6 |. 5A POP EDX
00440FA7 |. 59 POP ECX
余下该干什么明白了吧。
现在该总结一下原理了:弹出窗口的时候我们的程序处于系统领空。而点击完确定回到了程序领空。所以我们只需要让OD在回到程序的领空是断下来就可以。
补充一下上面程序由Borland Delphi编写的。看代码和外表像使用了ShowMessage函数(Borland实现的消息窗口的一个方法)。所以我们断的地方离我们的目的地远了一点。
总结一下操作方法:运行程序,点按钮,切到OD,中断程序执行,在程序领空中断。简单的说就是F9,F12,Alt+F9,然后就。。。
解释一下为什么要F12:F12就是让OD知道现在程序处于系统领空。而Alt+F9正好告诉OD在回到程序领空的时候中断。
所以关键就是F12了,那么什么时候能用F12呢,对于Delphi和C++Builder的程序,这个方法不是万能的。为什么呢?我碰到的主要有三种情况,一个就像刚才碰到的离目标远了点,另一个是,程序一旦运行,根本就F12不了。我没有详细研究过Delphi的架构,但是Borland程序内部有自己的一套通讯机制,OD在F12时要向程序写入一些东西,所以F12也就断不下程序了。还有第三种,我们F12断下程序后,Alt+F9立刻就断下来了,在这种情况下如何使用本方法,我还没有想出来,也就请各位能人指教了。
说了这么多不能的情况,那那个能――VB。
本鸟才疏学浅刚入密界,看了几篇破解VB的文章就敢来大侠面前丢人,请各位大侠不要看后笑话。
这几篇文章都使用BP rtcMsgBox,rtcMsgBox就是生成刚才那个窗口函数。但是这个东西是MSVBVM60的,所以可以说程序是在系统空间下的。点过确定后,不用说肯定在程序空间下的。所以本方法一去一个准。肯定在Call MSVBVM60.rtcMsgBox这个东西的下一行。
例如CrackMeNo3.exe【http://bbs.pediy.com/showthread.php?s=&threadid=20790】
运行,随便输入用户名,密码,点击确定,F12,Alt+F9
0040536C . 8D4D 88 LEA ECX, [EBP-78]
0040536F . 51 PUSH ECX
00405370 . FF15 50104000 CALL [<&MSVBVM60.#595>] ; MSVBVM60.rtcMsgBox
00405376 . 8D95 58FFFFFF LEA EDX, [EBP-A8] ; OD 断在这里
0040537C . 52 PUSH EDX
0040537D . 8D85 68FFFFFF LEA EAX, [EBP-98]
00405383 . 50 PUSH EAX
怎么样在MSVBVM60.rtcMsgBox下面吧。
小鸟不会VC,所以也就请各位大侠补上了。
方法是死的,人是活的,还有什么新花样就全看各位了。
小鸟刚入密界,写的不对的地方还请各位大侠指出。
谢谢
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)