首页
论坛
专栏
课程

使用OllyDbg从零开始Cracking第八章

2014-2-23 23:59 22741

使用OllyDbg从零开始Cracking第八章

2014-2-23 23:59
22741
今天无意搜到一篇介绍一些破解前辈的简介,向前辈们致敬...
                                       评书版CCG人员及破解牛人简介
ID:sUNbIRD

被无数人崇拜,但是见者很少。此人做事一项低调,看超人电影入迷,随学习超人找了个印字典的文职工作掩人耳目。其真实身份身边几乎无人知晓。
自创教以来,招募教徒无数(据称不愿跟随的人被其拉入饭店严刑拷打嘴部,一个时辰过后欣然同意……教主还有什么招数让其就范至今不得而知…… 本人也受过其拉入饭店掌嘴之刑,威胁就范……)。

ID:似曾相识 

老大有多老也许一些人不知道。简单的说一下吧:
根据公安内部档案记载,此人出生年月不祥,宗教信仰属于拜CCG教,性别男,学历榜眼
据史料记载此人和孔子握过手,和老子喝过酒,和嬴政下过棋,同李白赏过月。同岳飞联手抗金,和朱元璋一起要饭。参加过甲午战争,的抗过日寇侵扰。解放后一心钻研电脑,对破解轻车熟路
这就是简单介绍了,想知道其有多大的人自己算算吧

ID:RUN

吴朝向兄简介:
此人进士出身,靠倒卖军火发家。互联网初期,此人网站展示各种军火,很多当时先进的武器(破解工具)都有。又研究bios改画面,文章被广为传送送发表。据称后因看小电影入迷,随研究流媒体等……
偶得此人相片数张,果真有道骨仙风得感觉(瘦就一个字……)
后据称此人被一美女俘获,做其俘虏,被关押在关塔纳摩监狱……随后消失……
以上简介如有出入请更正

ID:Iceworld

江湖人称冰天雪地,闻其称号不禁让人打个冷战……
此人苏杭人士,乃一绝顶刺客。据称此人英俊潇洒,但心狠手辣,杀人无数,且刀刀致命。江湖上无数软件作者惨死其刀下。并且此人性格怪异,苦爱肢解,喜欢在软件的关键地点下刀,一击致命
此人虽性格怪异,但却有位如花似玉的娇妻,真乃:自古英雄无美女,美女全被刺客包啊

ID:JOJO

此人犹如明教光明右使范遥,做事及其低调,但却深不可测。与sUNbIRD因WPS相识,以TKC自传相聚,臭味儿相投……故相传为开教二老之一,山寨二当家的。
此人奔跑速度极快,被誉为CCG内跑得最快的人。再一次公安的围捕过程中以110米跨栏12:87的速度逃脱,比刘翔的记录还快了0.01秒。但因非正式比赛世界田联不予承认。无极剧组看其速度飞快,曾经邀其参加逃命牌运动鞋的广告拍摄,被拒
如有人想入CCG,请先跑过他才能参加测试。 

ID:kanxue

俗名看雪,经调查和冰天雪地无直接关系。
此人学富五车,才高八斗。曾出书数本,因其文采飞扬,通俗易懂,所以一时间洛阳纸贵,抢购成风。本人有幸得有其墨宝(签名……),同睡一榻……(因为八爪鱼的床太小了),至今让人难忘。
其搭建的擂台既是国内各大高手比武的必到之所,也是各大水王的必经之处。 

ID:yaoyuan

此人成都人士,实乃西蜀枭雄,称霸西南十于载。
出道很早,对磁盘加密非常精通,作出的kingcopy曾让当时所有的软盘加密黯然失色,后又对杀狗感兴趣,也作出数款经典杀狗的软件。
四川曾是无数古人归隐首选之地,如今已经很少碰到此人,也许已经厌倦密解的打打杀杀,归隐山林,与青山绿水为伴,修身养性去了

ID: fly

状元出身,喜好题诗留词,其文章现被广为流传,成为无数新手的必读教材。文章数依然排列于看雪擂台的榜首。
虽为状元出身,但下手确不留任何情面,喜欢把软件杀后解剖,并做成标本详细讲解,让外人参观……
且酷爱脱壳,喜欢把软件的衣服一层一层的扒下来,然后把裸体展示给别人,还要当众详细讲解扒衣服的过程……
所以被官府誉为极度危险人物之一:提醒广大市民,穿衣服少的不要接近他,以免发生危险……

ID:情狼

狼亦有情
情狼兄心地善良。对兄弟情字为先,对软件狼字当头,可谓善恶分明。无数软件以及狗儿死于其利齿之下,现在偶尔还可见软件尸体上留有其印记

ID:小牧童

F不羡鸳鸯不羡仙,只爱牧牛山野间……
听其名就知为世外高人之辈。此人酷爱养狗,对狗之喜爱超乎长人,对狗之习性了如执掌。无数凶猛名犬均俯首贴耳拜于膝下。他的可怕之处在于并不杀狗抛尸,让狗闻风丧胆,且对狗只构造与弱点如指掌……有独门武器制服,可比当年洪七公老前辈~~~~~高人

ID:商朝子 

此人商朝王族后裔,曾酷爱文学,出书育人,留有教程数片,引导无数人修成正果。后性情大变(原因至今是个迷……),成为各大论坛之水王,所到之处无不洪水泛滥,死伤无数,被官府通缉。但有人看到其换马甲继续灌水与官府对抗。如果您家大旱缺水,请务必请其帮助

ID:娃娃

此人名称经常可在盗版光盘上见得。(Windows优化大师旁边往往放着他的算号器……)
此人曾去南洋留学取经,练就“耶稣神拳”,后因护照到期并且和基地组织有联系被遣送回国(这件事情有待考证……)。回来后其拳法怪异,招招狠毒一时间无数软件惨死其拳下,包括著名的优化大师也死于非命……随即被官府悬赏20万大洋通缉!

ID:老妖/pll621

By:yyxzz
康佳某部头目,与硕士女友分隔两地前沉迷于diy,酷爱AV小电影,曾因陪客户在东莞夜总会玩耍时被条子抓去,屈打成招,与硕士女友同居后就没diy的需要了
住址:黑风村黑风山山顶的黑风洞的第二个入口向左拐
要老妖的C32asm 39个测试版的崇拜者可联系本人,不过也是很贵的

我只知道坛主和fly...

下面是刚刚更新的第八章内容,第9章开始就是步入破解的内容了...

                                                    第八章
本章,我们将来看看前面章节忽略了的一些重要的指令。我们学习完了这部分,就可以开始破解一些小玩意儿了。

循环指令
为了实现循环可以使用前面介绍过一些指令。例如,你可以将任意通用寄存器指定为计数器(通常ECX作为计数器使用),你可以将其初始化为需要循环的次数,然后执行循环体,接着计数器递减1,判断计数器是否为0,如果计数器不为0继续重复前面的过程,如果计数器为0,就不继续循环了,而直接执行下面的代码。代码如下:
XOR ECX,ECX
MOV ECX,15h
将计数器初始化为循环次数15h。接下来就是循环体了:
Label:
DEC ECX
该计数器每次递减1。
其实就是循环体了,循环体里面可以是任意指令。
最后,你需要添加一个判断计数器是否为0的指令以及条件跳转指令。
CMP ECX,0
JNE Label
第一次判断,计数器的值为14h,因为14h不为0,所以将继续执行循环,以此类推,直到计数器为0为止。
我们完整的来写一遍上面的循环:
XOR ECX,ECX
ADD ECX,15h
Label:
DEC ECX
;循环体
TEST ECX,ECX
JNE Label
让我们在OD上输入上面的代码:

黄色突出显示的是循环代码,这个部分将重复执行,直到ECX的值为0。循环体里面包含了多个NOP指令。
我们来单步跟踪一下循环代码,亲眼看一下循环的执行过程。按一下F7键看看ECX是怎么初始化的。

再次按F7键,计数器将变成15h,保存了需要循环的次数。

然后继续按F7键,直到DEC ECX,这个时候我们的计数器的值将减少至14h。
继续F7单步直到TEST ECX,ECX。该指令判断ECX是否为0,为0零标志位Z就置1,这样就停止循环,否则将继续循环。

因为此时计数器不为0,零标志位Z没有置1,所以条件跳转指令JNZ将跳转到401007地址处。下一步计数器继续递减1,这一次减少至13h。继续单步跟踪直到计数器为0。
当计数器为0时,零标志位Z将置1,这个时候JNZ将不会跳转至401007地址处,而是继续向下执行。

这里需要注意一下,JNZ指令与我们前面使用过的JZ刚好相反,当零标志位Z为0的时候跳转,为1的时候不跳转。

见到灰色箭头,意味着什么?-这里意味着跳转不会发生。按F7键我们将跳出循环继续执行下面的代码。

我们使用熟悉的指令模拟了一个最简单的循环例子。其实有专门用于循环的指令。我们来看一看。

LOOP
LOOP指令可以帮我们完成前面例子中的事情- 将计数器ECX的值减1,判断ECX的值是否为0,如果为0就跳转到指定的地址-将像前面的例子一样。(可惜的是,大多数现代的处理器中该指令的效率不如前面模拟的例子。)

在DEC ECX指令上单击鼠标右键选择-Binary-Fill with NOPS。对TEST ECX,ECX和JNZ 401007两条指令也进行同样的操作。这三条指令用一条LOOP 401007指令替代。
第一行突出显示(401000)-单击鼠标右键选择-New origin here。现在我们来执行新的LOOP指令吧。
按F7键,再次看到计数器ECX首先被初始化为0了,然后又被设置为15h了。我们继续单步跟踪,直到LOOP指令。

这里还是像之前一样,跳转至401007地址处,因为计数器不为0。这里,计数器递减1,现在为14h。

继续单步跟踪。当计数器为0时,循环将结束。

这里还有一些与LOOP指令相关的指令:
LOOPZ, LOOPE     循环条件:ECX!=0且ZF= 1
LOOPNZ, LOOPNE  循环条件:ECX!=0且ZF= 0

这几条指令同样是循环指令,即重复循环体,直到计数器为0,每次循环将计数器的值递减1。此外,LOOPZ,LOOPNZ指令还将检查零标志位Z是否为0。只有计数器的值和零标志Z同时满足条件时才循环。

接着,我们来介绍一下字符串操作类指令。
串操作
下面,介绍一下串操作类的基本指令
MOVS 
该指令是从一个地址向另一个地址复制数据。源地址保存在ESI寄存器中,目的地址保存在EDI寄存器中。我们不需要显示地指定参数。现在我们在OD中写入MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]指令,样子如下:

这里我们用ESI来保存源地址,EDI来保存目的地址。
在拷贝内容之前,让我们在数据窗口中来看一看源地址和目的地址的情况。
你可以在数据窗口中,单击鼠标右键选择-Go to-Expression,然后输入地址40366C。还有一个更加简单的方法:在第一条指令上面单击鼠标右键选择-Follow in Dump-Immediate constant,如下图所示:

源地址(ESI)中指定的地址单元中的待拷贝的内容。
目的地址(EDI)指向的地址单元

目的地址指向的地址单元将保存拷贝过来的内容。
按F7键,执行MOVS指令,我们可以看到4个字节被拷贝了。

这里MOVS拷贝4个字节的内容,即DWORD,另外一种书写形式为:MOVSD。与之对应的还有拷贝两个字节的MOVSW指令和拷贝一个字节的MOVSB指令。
请注意ESI,EDI拷贝的方向,拷贝的方向取决于方向标志位D。

REP 
该指令可做为前面介绍的一些指令的前缀,尤其是MOVS指令。该前缀表示当前指令需要执行的次数ECX。每次循环计数器ECX的值递减1,和前面介绍的循环一样。
因此,REP MOVS不一定拷贝是4个字节,它拷贝的大小为 每次拷贝的大小 * ECX, 源指针ESI和目的指针EDI每次递增4或者递减4(递增或递减取决于方向标志位D)。该指令看起来很实用,是不是?
该指令可以配合前面介绍的指令实现从一个地址单元拷贝任意数目的字节内容到另一个地址单元,但是很多现代处理器中实现的该指令效率并不是很高。
我们来修改前面的例子:添加REP前缀以及初始化计数器ECX。

源地址现在是40365C(仅供说明),目的地址和之前的一样,是40369C。我们来到第一条指令处,单步跟踪到REP MOVS指令处。

我们注意到OD的解释窗口中-出现了源地址和目的地址已经里面的包含的内容以及其他一些有用的信息。按F7键。

正如你所看到的,前面4个字节已经成功拷贝,由于ECX不等于0,所以将继续指令REP指令。这里ECX为3,指针ESI和EDI递增4,只要我们按F7键,后面的4个字节将继续被拷贝。

按F7键。

又有4个字节被成功拷贝,现在ECX减少至2。

再次F7,ECX变成1。

继续F7。

拷贝结束,因为此时计数器为0。

总结:加上REP前缀的MOVS指令拷贝的字节数为单独使用MOVS拷贝字节数的4倍,这要归功与REP前缀指令,从而从源地址向目的地址成功拷贝16个字节的内容。
请记住,MOVS指令不能将数据拷贝到没有写入权限的内存单元中,强制写入的话会引发异常。
此外,REP前缀还可以衍生出REPE/REPZ和REPNE/REPNZ指令,这个时候我们就需要考虑零标志位Z了。但是REPE/REPZ或者REPNZ/REPNE连同MOVS指令一起使用就没有太大意义了。此外还有其他指令支持前缀,我们以后再讨论。

LODS 
该指令从源地址(像之前一样,ESI)拷贝数据到EAX中。

我们在OD里面来看一个LODS指令例子,这里OD写成了LODS DWORD PTR DS:[ESI],如果你懒得去寄存器窗口中看ESI的值,可以看OD解释窗口中的提示信息。

我们再到数据窗口中来看看ESI指向内存单元中内容。

这4个字节将保存到EAX中。按F7键。

我们可以看到,EAX保存了这4个字节的内容。

REP前缀也可以与LODS指令配合使用,他们会重复执行直到计数器ECX的值为0。
当循环执行REP LODS指令时,解释窗口中会提示ECX的值,以及ESI指向的内存单元中下一次将被拷贝到EAX寄存器中的内容。

按F7键。

现在ECX为3,ESI的值增加了4-它指向下一个将被拷贝到EAX中的4个字节的内容。
也有一次拷贝两个字节和一个字节的LODSW和LODSB指令。

STOS 
该指令是将EAX的值拷贝到EDI指向的内存单元中。

我们单步跟踪直到执行完STOS指令,在解释窗口我们可以看到当前EAX的值以及当前EDI指向内存单元中的值。

在数据窗口中查看一下EDI指向内存单元中的情况。

和之前介绍的一样,我们可以使用REP前缀,还有每次操作两个字节的STOSW指令和每次操作一个字节的STOSB指令。

CMPS 
该指令比较ESI和EDI指向内存单元的内容。

我们在OD中输入CMPS DWORD PTR [ESI],DWORD PTR [EDI],OD中将显示为CMPS DWORD PTR DS:[ESI],DWORD PTR ES:[EDI]。
解释窗口中会提示要比较的值:

正如你所猜想的一样,该指令执行的是算数减法运算,这里,差值为0,所以零标志位Z将置1。

因为该指令影响的零标志位Z,所以你可以配合REPE/REPZ前缀指令使用,直到计数器ECX的值为0或者零标志位清0。

在数据窗口中的40365C和40369C地址处,我们看到之前操作过的内容。
这里将ECX初始化为10h。使用REPE前缀指令,当ECX为0或者零标志位Z清0时将停止比较。

单步跟踪直到REPE指令。然后按F7键,ESI和EDI指向内存单元的内容相等,所以零标志位Z置1。

零标志位Z置1表示继续循环比较。按F7键。
继续按F7键,直到比较的内容不同为止。ECX没有递减至0之前就会有不同的比较内容。如下:

随后按下F7键,零标志位Z清0,随即循环终止。

如果全部16个双字都是相等的话,那么循环终止将是由计数器ECX为0造成的。
前面提到的REPNZ也同样可以与CMPS配合使用。
我们已经介绍了很多有用的指令,但是浮点运算指令我们还没有介绍,我们将在后面讨论。大家需要重复练习前面介绍的内容,直到大家能够熟练运用为止。

寻址方式
直接寻址

这是最简单的一种寻址方式-该指令的操作数中包含一个具体的地址。
例如:
MOV DWORD PTR [00513450], ECX
MOV AX, WORD PTR [00510A25]
MOV AL, BYTE PTR [00402811]
CALL 452200
JMP 421000
不需要进行任何有关地址解析的计算,地址的值是纯数字。

间接寻址
MOV DWORD PTR[EAX], ECX
CALL EAX
JMP [EBX + 4]
要想在指令执行之前看到真实地址,需要在该指令上下断点,断下来以后查看寄存器的值或者查看解释窗口中的提示信息。
许多程序使用间接寻址来完成一些复杂的操作,因此刚开始分析调试的时候真实地址并不会显示出来。直到我们执行到这条指令的时候,查看相应寄存器的值才能够直到真实的地址。
现在我们再次用OD加载Cruehead’a的CrackMe。


这里我们来看一看间接寻址的例子:PUSH [EBP + 8]
因为当前我们处于入口点,在执行PUSH [EBP + 8]指令之前我们并不能预先直到EBP寄存器的值,我们在该指令处(4010E9)按下F2键,设置一个断点。
然后按F9键(运行)-CrackMe运行一会儿就会断在我们设置的断点处。

解释窗口中提示EBP+8=12FFF8。在我的机器上面此时EBP为12FFF0,所以EBP+8=12FFF8。

现在让我们在数据窗口中看看EBP+8指向内存单元的值,在数据窗口中单击鼠标右键选择-Go to-Expression,输入EBP+8

内容是

按F7键,这个值将被压入到堆栈中。

使用间接寻址的指令,只能在执行这条指令的时候获取地址当前的值。
第九章我们会将基础知识运用到破解中去。

WORD版:


图片太多了,上传的我手都酸了...

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

上传的附件:
最新回复 (28)
安于此生 34 2014-2-24 00:36
2
0
沙发自己做...
anglehua 2014-2-24 06:10
3
0
哈哈 2楼是我的
airbar 2014-2-24 08:08
4
0
那3楼是我的了!
熔岩 2014-2-24 08:12
5
0
辛苦了,感谢翻译!
安于此生 34 2014-2-24 09:36
6
0
保持队形......
killbr 2014-2-26 13:10
7
0
感谢大神翻译。
稻天 2014-2-26 14:19
8
0
一直在追。。。
安于此生 34 2014-2-26 14:22
9
0
追火影...
学编程 1 2014-2-27 11:12
10
0
不错,辛苦了。
xingbing 2014-3-2 18:26
11
0
辛苦了,感谢翻译!
炎黄一脉 2014-3-2 23:03
12
0
一直在默默的支持着楼主,道一声辛苦了,顶起。
baiyunbian 2014-3-11 09:17
13
0
太感谢了,郑重道谢!
Promisejhy 2014-3-11 18:28
14
0
都是大牛,小菜只能默默看着。
金白水清 2014-4-4 22:54
15
0
楼主翻译的相当棒,一直在默默关注你的更新,感谢你为CRACK做出的努力
王绍庆 2014-4-30 09:11
16
0
默默追!
jmp 2014-5-3 02:00
17
0
赞一个!
xingbing 2014-5-8 21:18
18
0
太好了,系统学习。
enjon 2014-5-29 19:15
19
0
呵呵楼主很风趣啊,谢谢分享辛苦了
xiaobinghe 2014-6-14 09:53
20
0
感谢,学习了
安于此生 34 2014-7-18 10:49
21
0
感谢luzhiyuan指正:
原文:
LOOPZ, LOOPE       重复循环,直到零标志位Z置1
LOOPNZ, LOOPNE  重复循环,直到零标志位Z清0

修改为:
LOOPZ, LOOPE        循环条件:ECX!=0且ZF=1
LOOPNZ, LOOPNE   循环条件:ECX!=0且ZF=0
killbr 2014-7-20 08:12
22
0
来看看安大仙。
hbcld 2014-7-28 21:45
23
0
后面的没有附件了吗?
byebing 2014-8-1 13:16
24
0
路过支持~~都在默默的看着,支持着~~
WuWeiXue 2015-1-12 23:33
25
0
手机客户端无法搜索楼主的信息,特别郁闷!
罗焕栋 2017-4-2 17:39
26
0
内容简单翔实,我这个小白也看明白三四,可以
wx_喻明琪 2017-12-11 16:59
27
0
感谢
学习拆弹 2017-12-12 17:00
28
0
哇,楼主英明
字符画file 2017-12-17 11:33
29
0
感谢分享
游客
登录 | 注册 方可回帖
返回