首页
社区
课程
招聘
[分享]我的断点心得——帮初学者进阶
发表于: 2008-12-21 16:02 51084

[分享]我的断点心得——帮初学者进阶

2008-12-21 16:02
51084
【文章标题】: 我的断点心得——帮初学者进阶
【文章作者】: 书呆彭
【使用工具】: OD,MSDN,VC
【作者声明】: 本文完全是个人的心得与体会,看到许多初学者还在苦苦寻找“字符串”和“关键跳”,特写此文,其中错误和不当之处,欢迎大家多多批评指正。
------------------->8-------------------------------------------------------------
【详细过程】
  
  在正文开始之前,先说几句。
  
  要写一篇文章是很累的,要打字,为了效果好还要截图、排版等。
  
  而且写这些东西是没有报酬的,属于义务劳动。
  
  我只希望能对出学者有所帮助,为论坛做点贡献。
  
  我也希望读者能仔细地把文章看完。
  
  看完后有什么意见就说什么。
  
  我不希望看的人随便把网页往下一拉,顺手回复个“好”,“顶”,“支持”之类的。
  
  对了,还有“先顶后看”的。
  
  我觉得,要先看过了,再回复。有话要说就回,没什么说的可以不回。
  
  我的意思就是,技术不同于灌水。
  
  
  ---------------->8------------------------------------------------------------
  
  
  开始。
  
  本文不讲脱壳,不讲算法,也不讲anti-anti,主要讲一讲如何用OD定位到一个程序的关键代码位置。
  
  
  由于解密技术的发展,带动了软件加密的发展。现在已经很难像两年前,或者更早,那样,用“W32Dsm->参考->字符串参考”的方法来定位程序的关键代码点了。
  
  但是还是有很多人抱着“字符串”这个“法宝”不放。不愿意,或者也可能没有找到方法,去学习一下更有效的定位关键代码的动态方法:断点。
  
  甚至有时根据别人的指点用API断点已经到达关键代码了,却又习惯地去寻找“字符串”。
  
  
  本人不才,算不上什么高手,但是我在逆向研究程序时,几乎没有使用过字符串的方法来定位关键代码。
  
  我记得两年前,很多流行的破文中都说,先静态,后动态。
  
  但我恰恰相反。在跟踪代码时我总是先动态定位代码,然后再阅读静态的反汇编结果。
  
  并且,在分析代码时,我常常是“动静结合,先猜后验证”的方法,以前我写过一个CRACKME的分析,讲过这个,就不说了。
  
  
  
  
  断点,BreakPoint,顾名思义,就是要正在运行的程序break的点。在Intel x86体系中,大家都知道断点是一种异常,然后通过异常处理的机制,让调试器获得控制权。
  
  下面我的描述,总是假设:
  
  1.程序代码没有被加密,通常就是指加壳。
  
  2.程序中没有anti-debug
  
  3.程序是本机代码,不是虚拟机伪指令,如VB
  
  
  
  
  首先,什么是关键代码?
  
  我们知道一个完整的程序,所包含的代码是海量的,我们虽然有反汇编工具,但不可能把所有的代码都去看一下。
  
  我们所说的关键代码,通常就是指包含有注册算法和有效性验证的程序代码。
  
  我们下断点的目的,是找到关键代码“附近”的代码,从而定位到最终的关键代码。
  
  
  通常,关键代码都具有这样的结构:
  
  1.读取用户的输入
  
  2.经过一定的计算、验证
  
  3.显示(或不显示,仅存储)验证结果。
  
  其中,2是“真正关键”的代码,而1和3就是我说的“附近”的代码。
  
  
  在Windows下的应用程序,2完全自主的,我们没办法,但1和3(也就是输入和输出)无论如何也必须通过某种形式的操作系统调用才能实现。所以,API断点几乎是通用的办法。
  
  而难点,就在于我们下断点的技巧。
  
  
  先说思路1,从输入角度来下。学过一点C语言的人知道,在控制台下,获取用户输入是从stdin文件中读取的。而win32窗口应用程序怎么获得用户输入呢?
  
  我们最常见的情况,是从编辑框(Edit)控件中输入信息。
  
  这种情况下程序要获取用户的输入,也就是获取编辑框的文字。通过什么途径?这里就需要一些编程的基础知识了。(所以我总强调编程是逆向的基础)
  
  GetWindowText()和GetDlgItemText()是最常用的两个API。至于A还是W,试试就知道了。

  ---------------->8------------------------------------------------------------
  
  例1:
  
  下载
  
  
  
  我们用OD载入,bp GetDlgItemTextA,F9运行。点check,被OD断下了。看下堆栈窗口中给出的提示:
  
  
  0013FA48   004010B0  /CALL 到 GetDlgItemTextA 来自 010.004010AB
  0013FA4C   002108A2  |hWnd = 002108A2 ('Pusillus Crackme 1.0',class='#32770')
  0013FA50   00000BB8  |ControlID = BB8 (3000.)
  0013FA54   00403044  |Buffer = 010.00403044
  0013FA58   0000000A  \Count = A (10.)
  

  
  是不是我们要找的呢?你当然可以执行到返回,然后看缓冲区Buffer = 010.00403044的内容是不是自己输入的。
  
  我给出另一种方法:ControlID == 0xbb8,在OD中转到“窗口”窗口(有点绕),看到
  
  
  Windows
  句柄           标题                              父窗口     WinProc    ID         风格       扩展风格   线程       ClsProc    类
  002108A2       Pusillus Crackme 1.0              Topmost                          94C800C4   00010101   主          7D96A3F2   #32770
  K00140878                                        002108A2              [COLOR="Red"]00000BB8[/COLOR]   50010080   00000204   主          7D9637BF   [COLOR="Red"]Edit[/COLOR]
  K0019088A      Default IME                       002108A2                         8C000000              主          7D9A0638   IME
  IE0023085A     M                                 0019088A                         8C000000              主          FFFF08A1   MSCTFIME UI
  E0020085C      Check                             002108A2              00000BB9   50010001   00000004   主          7D960F28   Button
  

  
  我们看到ID为0xBB8的控件是唯一的一个Edit控件。

  这个ID是程序作者定义的,对于一个程序,每个控件的ID是不变的。
  
  这个CrackMe非常简单,所以返回到用户代码后就是“关键”代码了。
  
  
  
  ---------------->8------------------------------------------------------------

  例2:
  
  下载http://bbs.pediy.com/showthread.php?t=77302
  
  
  
  这个例子是VC7写的,unicode程序,所以这回我们下bp GetDlgItemTextW,随便输入,点确定。
  
  咦,没断到,直接弹出了错误提示。如图:
  
  
  
  我们换另一个试试,bp GetWindowTextW,结果发现我们无法切换到CrackMe的界面了,只要一切换就被OD断下来。
  
  第一次中断时,堆栈参数:
  
  0013F6FC   7DBF9A40  /CALL 到 GetWindowTextW 来自 COMCTL32.7DBF9A3A
  0013F700   001500DC  |hWnd = 001500DC ('确定',class='Button',parent=000E00AE)
  0013F704   00269050  |Buffer = 00269050
  0013F708   00000003  \Count = 3
  

  
  F9,又中断到这里
  
  
  0013F960   7DBF73F4  /CALL 到 GetWindowTextW 来自 COMCTL32.7DBF73EE
  0013F964   000C00CA  |hWnd = 000C00CA ('用户名:',class='Static',parent=000E00AE)
  0013F968   00269050  |Buffer = 00269050
  0013F96C   00000005  \Count = 5
  

  
  再F9,
  
  
  0013F960   7DBF73F4  /CALL 到 GetWindowTextW 来自 COMCTL32.7DBF73EE
  0013F964   002C01DC  |hWnd = 002C01DC ('注册码:',class='Static',parent=000E00AE)
  0013F968   00269050  |Buffer = 00269050
  0013F96C   00000005  \Count = 5
  

  
  再F9,就运行了。我们看一下,为什么会中断呢?
  
  原来是因为系统要绘制“确定”按钮。
  
  不过,上面几次中断,并没有获取编辑框文字。
  
  这就引出了今天要讲的另一个技巧:条件断点。
  
  我们希望只有在读取用户输入内容时才中断。
  
  先来到OD的“窗口”窗口:
  
  
  Windows
  句柄           标题                              父窗口     WinProc    ID         风格       扩展风格   线程       ClsProc    类
  000E00AE       MFc7                              Topmost                          94C800CC   00050101   主          7D96A3F2   #32770
   000C00CA      用户名:                          000E00AE              FFFFFFFF   50020000   00000004   主          FFFF0743   Static
   001500DC      确定                              000E00AE              00000001   50010001   00000004   主          FFFF074B   Button
   002C01DC      注册码:                          000E00AE              FFFFFFFF   50020000   00000004   主          FFFF0743   Static
   [COLOR="Lime"]0036011E [/COLOR]                                       000E00AE              000003E8   50010080   00000204   主          FFFF06AB   [COLOR="Red"]Edit[/COLOR]
   004101E8                                        000E00AE              000003E9   50010080   00000204   主          FFFF06AB   [COLOR="Red"]Edit[/COLOR]
   009E0104      Default IME                       000E00AE                         8C000000              主          7D9A0638   IME
    002501F6     M                                 009E0104                         8C000000              主          FFFF07D9   MSCTFIME UI
  

  
  我们看到有两个Edit控件,我们随便取其中一个,比如0036011E,记下这个句柄。你可以根据你机器上显示的值来确定。

  注意,这个窗口句柄是在窗口创建时由系统分配的,每次运行程序时的值可能不一样。但是窗口一旦创建,那么在它销毁前它的句柄是保挂不变的。

  再回到反汇编窗口,在GetWindowTextW这行按Shift+F2,弹出如下条件断点对话框:——有朋友说这一句不好理解,改成下面这样:

  回到反汇编窗口,按Ctrl+G,输入GetWindowTextW,来到这个API的代码处,然后按Shift+F2,弹出编辑断点条件的对话框:
  
  
  
  我们看一下堆栈,窗口句柄是第一个参数,位于[ESP+4],于是我们输入[ESP+4]==0x36011E,确定。
  
  现在我们再运行程序,输入点什么,点确定,OD给断下来了。堆栈中看看,
  
  
  0013F568   0040C544  /CALL 到 GetWindowTextW 来自 009.0040C53E
  0013F56C   0036011E  |hWnd = 0036011E (class='Edit',parent=000E00AE)
  0013F570   00899980  |Buffer = 00899980
  0013F574   00000005  \Count = 5
  

  
  我们看到返回地址就在程序EXE模块中,所以直接返回,看一下,是这么一副模样。
  
  
  0040C516  /$  8BFF          MOV     EDI, EDI
  0040C518  |.  55            PUSH    EBP
  0040C519  |.  8BEC          MOV     EBP, ESP
  0040C51B  |.  56            PUSH    ESI
  0040C51C  |.  8BF1          MOV     ESI, ECX
  0040C51E  |.  837E 50 00    CMP     DWORD PTR DS:[ESI+50], 0
  0040C522  |.  75 2F         JNZ     SHORT 009.0040C553
  0040C524  |.  FF76 20       PUSH    DWORD PTR DS:[ESI+20]            ; /hWnd
  0040C527  |.  FF15 20965200 CALL    DWORD PTR DS:[<&USER32.GetWindow>; \GetWindowTextLengthW
  0040C52D  |.  8D48 01       LEA     ECX, DWORD PTR DS:[EAX+1]
  0040C530  |.  51            PUSH    ECX                              ; /Count
  0040C531  |.  8B4D 08       MOV     ECX, [ARG.1]                     ; |
  0040C534  |.  50            PUSH    EAX                              ; |/Arg1
  0040C535  |.  E8 6BA2FFFF   CALL    009.004067A5                     ; |\009.004067A5
  0040C53A  |.  50            PUSH    EAX                              ; |Buffer
  0040C53B  |.  FF76 20       PUSH    DWORD PTR DS:[ESI+20]            ; |hWnd
  0040C53E  |.  FF15 24965200 CALL    DWORD PTR DS:[<&USER32.GetWindow>; \GetWindowTextW
  0040C544  |.  8B4D 08       MOV     ECX, [ARG.1]
  0040C547  |.  6A FF         PUSH    -1                               ; /Arg1 = FFFFFFFF
  0040C549  |.  E8 6693FFFF   CALL    009.004058B4                     ; \009.004058B4
  0040C54E  |.  5E            POP     ESI
  0040C54F  |.  5D            POP     EBP
  0040C550  |.  C2 0400       RETN    4
  0040C553  |>  8B4E 50       MOV     ECX, DWORD PTR DS:[ESI+50]
  0040C556  |.  8B01          MOV     EAX, DWORD PTR DS:[ECX]
  0040C558  |.  5E            POP     ESI
  0040C559  |.  5D            POP     EBP
  0040C55A  \.  FFA0 8C000000 JMP     DWORD PTR DS:[EAX+8C]
  
  

  
  看来这是一个包装(Wrapper)函数,我们继续返回,就来到了“关键代码”了(不贴了)。
  
  
  ---------------->8------------------------------------------------------------

  例3:
  
  下载
  
  
  
  再看这个,是某版本的易语言的。bp GetWindowTextA,同例2一样,我们切换不到程序界面了。按上面的方法,下个条件断点,OK,我们到了:
  
  
  0013F110   100AE3BA  /CALL 到 GetWindowTextA 来自 krnln.100AE3B4
  0013F114   004701D8  |hWnd = 004701D8 (class='Edit',parent=001100CA)
  0013F118   02367AF0  |Buffer = 02367AF0
  0013F11C   00000005  \Count = 5
  

  
  可是这个返回点是在krnln模块中,并不是EXE当中啊,怎么办?
  
  我们先回来krnln领空。
  
  下面我来讲今天的第3个技巧:RUN跟踪。不熟悉的人先去看看OD的说明书,照着说明书将相关选项设置好,否则可能不起作用。
  
  使用工具之前阅读说明书是一个好习惯。
  
  我们Alt+E,看一下EXE模块的地址:
  
  
  Executable modules, 条目 0
[COLOR="Red"]   基址=00400000
   大小=0001F000 (126976.)[/COLOR]
   入口=00403831 015.<模块入口点>
   名称=015
   路径=F:\Debugee\Crack Me\015.exe
  

  
  好,我们按Ctrl+T,选中“EIP位于范围内”,后面的范围就填整个模块的范围吧,无所谓,见图:
  
  
  
  确定后,我们按Ctrl+F11(至于F11还是F12,视情况而定,这里本例仅为一个特例),看到什么了?OD停在了这里:
  
  
  0040993E    DD45 F4         FLD     QWORD PTR SS:[EBP-C]
  00409941    DC45 E8         FADD    QWORD PTR SS:[EBP-18]
  00409944    DC05 04914000   FADD    QWORD PTR DS:[409104]
  0040994A    DD5D E0         FSTP    QWORD PTR SS:[EBP-20]
  0040994D    68 01060080     PUSH    80000601
  00409952    FF75 E4         PUSH    DWORD PTR SS:[EBP-1C]
  00409955    FF75 E0         PUSH    DWORD PTR SS:[EBP-20]
  00409958    68 01000000     PUSH    1
  0040995D    BB 68010000     MOV     EBX, 168
  00409962    E8 9F010000     CALL    015.00409B06
  [COLOR="Red"]00409967    83C4 10         ADD     ESP, 10				;我们停在了这里,刚从函数返回[/COLOR]
  0040996A    8945 DC         MOV     DWORD PTR SS:[EBP-24], EAX
  0040996D    6A FF           PUSH    -1
  0040996F    6A 08           PUSH    8
  00409971    68 04000116     PUSH    16010004
  00409976    68 01000152     PUSH    52010001
  0040997B    E8 92010000     CALL    015.00409B12
  00409980    83C4 10         ADD     ESP, 10
  00409983    8945 D8         MOV     DWORD PTR SS:[EBP-28], EAX
  

  
  至于这里是不是关键代码,还用我说吗?
  
  
  ---------------->8------------------------------------------------------------
  
  上面用3个例子,说了“输入”这个方面的API断点。

  我拿这几个程序做例子完全是为了说明文中的方法。单说这几个CrackMe,由于本身都非常简单,很多人都有更加简单的方法直接定位关键代码。这不在本文讨论之列。
  
  实际当中,还会遇到更复杂的,因为WIN32的API种类多而繁杂,要获取用户输入的方法还有很多种,不仅仅限于上面讲的两个API。
  
  说回来,还是得具有一定的编程基础。我再公布一个常用API,那就是SendMessage,它也常用来获取窗口的文字。具体怎么用,我不详细说了,有编程基础的人应该知道。
  
  
  
  
  本来还准备写点输出API函数方面的内容,一时没时间,先搁下,有时间再补上吧,对不住各位了。
  
  不过,只要你开动脑筋,灵活应用,使用我上面讲的API断点+条件断点+RUN跟踪,就已经可以对几乎所有未加密的程序,快速地定位到关键代码。
  
--------------------------------------------------------------------------------
【经验总结】
  建议大家不要只是看,多写几个小程序,自己再多调试调试,实践出真知,熟能生巧。
  
  如果觉得自己学逆向很困难,那就先好好学学编程。这是我的建议。
  
--------------------------------------------------------------------------------
【版权声明】: 【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年12月21日 15:51:35

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 8
支持
分享
最新回复 (92)
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
2
恭喜,不过你的OD好奇怪,界面咋那个色的啊
2008-12-21 16:33
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
3
看得真仔细。

不是OD的颜色奇怪,我把系统的颜色改了,所有对话框和窗口都是这个颜色。亮白色太刺眼,我改个柔和一些的。
2008-12-21 16:37
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
非常好,非常好.
2008-12-21 16:38
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
5
我是发现了,书呆子继笨笨雄大后的可能成为逆向教父又一人选
2008-12-21 16:48
0
雪    币: 133
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
啊啊啊啊,就是要这样的文章啊,

照顾初学者的感觉
2008-12-21 17:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢,我觉得对我这样的初学者非常有参考价值,我有个疑问,我照着你写的的内容,练习了第一个Pusillus的例子,我用自己习惯的字符串查找,也看到了几个关键的ASCII:
push    00403022                           ASCII "Bad Serial, Sorry!"
这个我自己觉得是个关键点,F2下断,随便输入123456789就断下了,仔细分析了一下算法,大体内容如下:
1。取前8个输入有效ASCII字符,把每一位与32异或,结果保存;
2。把保存下来的8个值,两两异或,变为4个,保存;
3。把保存下来的4个结果异或,变为2个,保存;
4。把保存下来的2个结果异或,保存在AL中;
5。取第一步保存的8个结果,每一个都与AL异或在保存;
6。将保存的结果与【403008】处的8个值,一位一位地比较,一旦不同,就跳转到显示错误信息

【403008】处的值为:71 18 59 1B 79 42 45 4C,我现在不知如何进行逆运算找到真正的注册码;
用了自己的方法后,在看你的介绍,我参考OD教程的做法,在主窗口右键-->查找-->当前模块的名称,随后看到了如下的内容:
0040200C     区段=.rdata                 输入                   USER32.GetDlgItemTextA
我用F2下断,此时0040200C颜色变红,表示下断成功,F9运行,可是却出现了错误:不知如何运行,因为内存地址0000000A不可读,请尝试更改EIP或忽略异常。
这是为什么呢?
取消该断点,然后查找所有模块中的名称,找到了:
77D6B05E USER32 区段=.text 输出   GetDlgItemTextA
7D591F1C SHELL32 区段=.text 输入 USER32.GetDlgItemTextA
用F2下断,但是77D6B05E,7D591F1C颜色没有变红啊,可是在断点中却可以看到已经对这两处下了,为什么会这样呢?
F9执行,还是出现:在SHELL中出现几个损坏的断点,。。。。。。
删除7D591F1C断点后正常,这是为什么呢?
2008-12-21 17:39
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
8
我举这个例子并不是说它无法找到字符串参考,我只是用它来说明API断点的用法。

API断点是通用的,不管有没有字符串信息,我们都可以用API断点来定位关键代码。

这个例子的算法,你分析得很正确。

算法的逆推,原来的教程中有,我以前也写过一篇文章。

这是教程的页面:

http://www.pediy.com/tutorial/chap6/Chap6-1-11.htm

这是我补充的内容:

http://bbs.pediy.com/showthread.php?t=77367
2008-12-21 18:09
0
雪    币: 622
活跃值: (65)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
9
赞一个,学习了。
2008-12-21 18:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我本就是那种死守字串的初学者啊……
在若干次碰壁后也开始学习分析代码了
如此好文怎么能不感谢一下!
另外事实是,大多数新手一上来就是强壳或者各种各样的陷阱,
死在里面的无数啊,
能够让大家练习API和分析断点的例子,大概只有去crack自己编写个理想化的程序或教学程序了。
这样理解才更透彻。
2008-12-21 18:59
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
11
到CrackMe区,有CrackMe合集,各种难度的CrackMe都有。

从中一定能找到适合自己水平的。
2008-12-21 19:15
0
雪    币: 27
活跃值: (90)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
12
非常好的学习资料啊,感谢书呆彭。
2008-12-21 21:09
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
提几个意见

1,上面那个'windows窗口句柄'里面的数据太也乱了吧,是人都看不懂

2,我发现句柄这东西别说不同的机子了,同一机子每次加载句柄都是不一样的,最好能说明免得有新手按部就班的时候出错了都不知道哪的问题

3,希望能出个word版或PDF版我想收藏
2008-12-21 21:32
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
14
1.格式乱是由于论坛编辑模式和最终格式空白字符宽度不一致,已经编辑过了。

2.窗口句柄确实不是固定的,但只要窗口不关闭,它的句柄是不变的。已经编辑说明了。

3.收藏就不必了,我也不想再去排什么版。很简单的东西,一点就通。关键在于自己要在实践当中多练习。
2008-12-22 00:21
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感谢,比较清晰的知道了使用方法。谢谢!
2008-12-22 09:54
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
16
嗯,严重同意。
2008-12-22 10:25
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
17
每年都有人写这样的文章
每年这样的贴子都沉
每年新人都看不到这样的贴子
2008-12-22 11:01
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
18
思路清晰,叙述详细。

对有编程基础的人,一点就通。
但对编程基础薄弱的人读起来较吃力,因为这篇文章没有简单地介绍编程的相关基础知识。

以前笨笨雄就很注意雅俗共赏,没有编程基础的人也能大致看懂。
希望LZ照顾一下业余破解爱好者。

爬格子不容易,LZ辛苦了。
2008-12-22 11:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学习,我也是在查找字符串的树上吊死了呵呵
2008-12-22 11:22
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
例2。

再回到反汇编窗口,在GetWindowTextW这行按Shift+F2,弹出如下条件断点对话框:
  

  (图)
  

  我们看一下堆栈,窗口句柄是第一个参数,位于[ESP+4],于是我们输入[ESP+4]==0x36011E,确定。
  
  现在我们再运行程序,输入点什么,点确定,OD给断下来了。堆栈中看看,

------
我们看一下堆栈,窗口句柄是第一个参数,位于[ESP+4],!!!这个[ESP+4]是如何看到的。用什么方法。
2008-12-22 11:46
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
21
[QUOTE=我脱;554215]例2。
这个[ESP+4]是如何看到的。
[/QUOTE]

OD已经给出了参数的注释,告诉我们哪个参数是hWnd,如图红字,而堆栈窗口中,ESP指向的“栈顶”位置,OD是高亮显示的,可以看一下自己OD中堆栈窗口,如图绿字:

  [COLOR="SeaGreen"]0013F568[/COLOR]   0040C544  /CALL 到 GetWindowTextW 来自 009.0040C53E
  0013F56C   0036011E  |[COLOR="Red"]hWnd [/COLOR]= 0036011E (class='Edit',parent=000E00AE)
  0013F570   00899980  |Buffer = 00899980
  0013F574   00000005  \Count = 5


我只能建议你,在熟练掌握好汇编语言的基础上,先好好读一读OD的说明书。

看起来你连工具的用法都不是很熟练啊。
2008-12-22 12:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
认真学习,努力提高!
2008-12-22 12:30
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
谢谢,[ESP+4]不是看出来的,是算出来的.谢谢!!
汇编不懂了. 我会慢慢学的.
2008-12-22 13:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
书呆,我想问一下,第一个CrackMe的注册码怎么推出来。
我只能修改EDI的值后,才能用同一个注册码可以注册成功(123456789),但是我算不出真正的注册码。。。。。

这个是不是没有真正的注册码,就只是做为一个练习用的
研究算法和爆破和做内在PATCH的练习呢

说的不对请别见笑,偶是菜中菜

顺便问一下,咱们坛子上可以贴收费软件破文吗?
偶是在网上转的时候看到有人求破,就把比他求破的软件的最新版给下下来了,看了看很简单就给破了。
偶不知道咱们坛子让不让发,偶就没敢发。先问问。嘿嘿
千万别让我看坛规,偶最怕看那个东东了。好长,看的我发晕。嘿嘿
2008-12-22 14:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
非常谢谢的 哦,学习了!
2008-12-22 15:08
0
游客
登录 | 注册 方可回帖
返回
//