• 首页
  • 世界杯直播网
  • [分享]新手收集篇,把自己学习进度分享给大家!本帖更新贴1月7号更新

[分享]新手收集篇,把自己学习进度分享给大家!本帖更新贴1月7号更新

发布:admin2025-06-24 19:17:44 7439条浏览分类:世界杯直播网

查看: 7550|回复: 19

[分享]

新手收集篇,把自己学习进度分享给大家!本帖更新贴1月7号更新

[复制链接]

独孤の宿命

独孤の宿命

当前离线

好友

阅读权限10

听众

最后登录1970-1-1

电梯直达

楼主

独孤の宿命

发表于 2011-1-6 11:45

本帖最后由 独孤の宿命 于 2011-1-7 15:25 编辑

如果你的原版OD + StrongOD最新版,依然被Anti了,那么做如下:

1.升级dbghelp.dll,下载

2.StrongOD中选择CreateAsRestrict

3.改变OllyDbg.ini中的驱动名称

4.改OD窗体类名

方法如下:

主窗体类名:

VA:004B7218

Offset:000B6018

各子窗体类名:

VA:004B565B ~ 004B568A

Offset:000B445B ~ 000B448A

改成任意,可以过GetWindow检测

如果发现你的OD刚刚载入程序就被关闭

1,OllyDBG v1.10本身的原因:

ThemIDA等壳会针对OllyDBG v1.10原版处理浮点的一个BUG,使OD崩溃

解决方案:

使用StrongOD插件,先开调试器,然后在载入程序,或者自己patch一下OD的相关位置,在0x4AA2E0处,把整个过程改成下面的二进制

D9 7D DC 66 81 65 DC FE FF 66 81 4D DC 00 04 D9 6D DC 66 81 78 08 3E 40 5 01 C3 DB 28 DF 38 9B C3

2,DbgHelp.dll的问题

大家可以看到OD目录下有个dbghelp.dll,大小大概是475KB,这个文件存在一个溢出漏洞

解决方案:

替换成附件中的dbghelp.dll,附件的dbghelp.dll大小大约为1M。

另外,这个版本的dbghelp.dll会使OD自动载入pdb,使调试更加方便。不建议将这个dbghelp.dll替换system32下面那个

补充一下:最近用OD新出一个问题,载入的程序,发现根本无法运行起来,但用正常方式开启程序又可以!这里可以用他补丁工具把你要使用的程序!生成补丁一下!在用OD读取你生成后的程序!

3楼为转载贴!我觉得这个对新人来说价值很高!所以收集在一起了!可以看一下!思考一下!我完全弄懂后会在楼层方式用自己个人理解来解答.....

什么是关键跳?14楼发表!!如有错误高手指出!

收藏3

淘帖0

有用0

分享到朋友圈

发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

回复

举报

独孤の宿命

独孤の宿命

当前离线

好友

阅读权限10

听众

最后登录1970-1-1

沙发

楼主|

独孤の宿命

发表于 2011-1-6 11:46

|楼主

1,OllyDBG v1.10本身的原因:

Themida等壳会针对OllyDBG v1.10原版处理浮点的一个BUG,使OD崩溃

解决方案:

使用StrongOD插件,先开调试器,然后在载入程序,或者自己patch一下OD的相关位置,在0x4AA2E0处,把整个过程改成下面的二进制

D9 7D DC 66 81 65 DC FE FF 66 81 4D DC 00 04 D9 6D DC 66 81 78 08 3E 40 5 01 C3 DB 28 DF 38 9B C3

2,DbgHelp.dll的问题

大家可以看到OD目录下有个dbghelp.dll,大小大概是475KB,这个文件存在一个溢出漏洞

解决方案:

替换成附件中的dbghelp.dll,附件的dbghelp.dll大小大约为1M。

另外,这个版本的dbghelp.dll会使OD自动载入pdb,使调试更加方便。不建议将这个dbghelp.dll替换system32下面那个

【吾爱破解论坛总版规】 - [让你充分了解吾爱破解论坛行为规则]

回复

支持

举报

独孤の宿命

独孤の宿命

当前离线

好友

阅读权限10

听众

最后登录1970-1-1

3#

楼主|

独孤の宿命

发表于 2011-1-6 11:48

|楼主

吾爱破解论坛没有任何官方QQ群,禁止留联系方式,禁止任何商业交易。

本帖最后由 独孤の宿命 于 2011-1-7 11:39 编辑

回复 1# 独孤の宿命

【文章标题】: 我的断点心得——帮初学者进阶

【文章作者】: 书呆彭

【使用工具】: 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 00000BB8 50010080 00000204 主 7D9637BF Edit

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:

这个例子是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

0036011E 000E00AE 000003E8 50010080 00000204 主 FFFF06AB Edit

004101E8 000E00AE 000003E9 50010080 00000204 主 FFFF06AB Edit

009E0104 Default IME 000E00AE 8C000000 主 7D9A0638 IME

002501F6 M 009E0104 8C000000 主 FFFF07D9 MSCTFIME UI

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

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

再回到反汇编窗口,在GetWindowTextW这行按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

基址=00400000

大小=0001F000 (126976.)

入口=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

00409967 83C4 10 ADD ESP, 10 ;我们停在了这里,刚从函数返回

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跟踪,就已经可以对几乎所有未加密的程序,快速地定位到关键代码。

如何升级?如何获得积分?积分对应解释说明!

回复

支持

举报

zl22887659

zl22887659

当前离线

好友

阅读权限0

听众

最后登录1970-1-1

头像被屏蔽

4#

zl22887659

发表于 2011-1-6 11:50

《站点帮助文档》有什么问题来这里看看吧,这里有你想知道的内容!

提示: 作者被禁止或删除 内容自动屏蔽

呼吁大家发布原创作品添加吾爱破解论坛标识!

回复

支持

举报

zl22887659

zl22887659

当前离线

好友

阅读权限0

听众

最后登录1970-1-1

头像被屏蔽

5#

zl22887659

发表于 2011-1-6 11:52

提示: 作者被禁止或删除 内容自动屏蔽

如何快速判断一个文件是否为病毒!

回复

支持

举报

skyxiaotian

skyxiaotian

当前离线

好友

阅读权限10

听众

最后登录1970-1-1

6#

skyxiaotian

发表于 2011-1-6 11:54

真是,在现有阶段内,赶紧学点东西

回复

支持

举报

zl22887659

zl22887659

当前离线

好友

阅读权限0

听众

最后登录1970-1-1

头像被屏蔽

7#

zl22887659

发表于 2011-1-6 11:56

提示: 作者被禁止或删除 内容自动屏蔽

回复

支持

举报

zl22887659

zl22887659

当前离线

好友

阅读权限0

听众

最后登录1970-1-1

头像被屏蔽

8#

zl22887659

发表于 2011-1-6 12:03

提示: 作者被禁止或删除 内容自动屏蔽

回复

支持

举报

zl22887659

zl22887659

当前离线

好友

阅读权限0

听众

最后登录1970-1-1

头像被屏蔽

9#

zl22887659

发表于 2011-1-6 12:04

提示: 作者被禁止或删除 内容自动屏蔽

回复

支持

举报

y123456789

y123456789

当前离线

好友

阅读权限20

听众

最后登录1970-1-1

10#

y123456789

发表于 2011-1-6 12:56

这个很实用 谢谢咯

回复

支持

举报