首页
社区
课程
招聘
[原创]由字符串参考想到的。。。
发表于: 2006-3-13 05:31 8807

[原创]由字符串参考想到的。。。

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期)

收藏
免费 7
支持
分享
最新回复 (17)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好文章真的一看就懂!顶你!
2006-3-30 20:17
0
雪    币: 257
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
二哥的脱文中也提到过此方法,对小程序还可以,对大点的程序,说不定会搞死OD
2006-3-30 21:17
0
雪    币: 47147
活跃值: (20455)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
新人第一篇文章,鼓励一下。

鼓励的力量是无穷的
2006-3-30 21:25
0
雪    币: 707
活跃值: (1301)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
5
最初由 kanxue 发布
新人第一篇文章,鼓励一下。

鼓励的力量是无穷的


不公平//
2006-3-30 22:42
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
真厉害!真厉害!
2006-3-31 02:52
0
雪    币: 47147
活跃值: (20455)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
7
最初由 qyc 发布
不公平//


呵~你的几篇文章也不错,多写些算法、技巧、新意的东西,还是很容易得到精华的。
2006-3-31 08:59
0
雪    币: 250
活跃值: (103)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
支持!
2006-3-31 14:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢提供,努力学习中。
2006-3-31 23:40
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我按操作步骤,却没有出现你所说的结果,为什么,能不能指点一二
2006-4-1 00:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
upppppppp
2006-4-1 10:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这位大哥的确厉害啊,刚用你的方法解决了一个让我郁闷半天的东西,心情舒畅!!!
2006-4-1 17:30
0
雪    币: 461
活跃值: (93)
能力值: ( LV9,RANK:1170 )
在线值:
发帖
回帖
粉丝
13
好文章,支持.
  我这也有一个VB练习程序,破解了好久,没找到头绪.不知有哪位大侠能帮助一下,还请讲出详细的步骤.不过我没有上传附件的权限,下面是我的网络优盘的地址:
http://bxm78.ys168.com
2006-4-1 21:51
0
雪    币: 707
活跃值: (1301)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
14
最初由 kanxue 发布
呵~你的几篇文章也不错,多写些算法、技巧、新意的东西,还是很容易得到精华的。

现在正在认真学习PEDIY/
ing....只要能学到东西/得不得精也无所谓/不过我还是很想的/我一定会超过你的精华的/你等着。。。。
2006-4-2 20:50
0
雪    币: 253
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
15
估计这人还在用98,98下才有这种效果,我研究过这个问题。
2006-4-2 21:37
0
雪    币: 225
活跃值: (55)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
16
学习!
2006-4-2 23:26
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
认真学习!~
2006-4-4 05:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
确实如此,包括xp系统.
2006-5-24 15:25
0
游客
登录 | 注册 方可回帖
返回
//