更新第二章
请下载附件阅读,更方便于阅读,排版清楚。
附件中包含本文的pdf格式和随文附件。

=============================================


使用OllyDbg从零开始Cracking
第二章
(翻译:BGCoder)


当我们回顾了OllyDbg的结构组成,基本要素和原理后,需要探究一下数制系统。

数制系统

最常用的数制系统是二进制,十进制和十六进制。
了解它们,最主要的你要知道是:
  二进制:只有符号0和1,因此称为二进制。 
  十进制:出现10个字符(从0到9),因此称为十进制。
  十六进制:从0到F(0-9,A,B,C,D,E和F,总共16个字符)。
通常,除非另有说明,当我们提及某一具体数字时都将其认作十六进制。

我们不使用将数值从一种数制转换为其它数制的令人不太愉快的数学公式。当前,Cracker 们一般使用Windows自带的计算器,它将更加快捷和容易使用,以避免繁冗的工作。

打开计算器,准备工作。

进入菜单View,选择科学模式。


这里,我们看到默认的是十进制模式,在旁边还有其它三种进制可供选择,十六进制Hex,八进制Oct,二进制Bin。

八进制使用8个字符,在Cracking中不太常用,但如果需要,也可在计算器中选择使用。

因此,将一个数字从一种数制系统转换到另一种数制系统,最简单的方法,先将计算器选择到数字初始数制的位置,例如,你需要将数字55从十进制转换为十六进制,在计算器位于十进制位置时输入55。


现在将计算器换到十六进制符号的位置,结果将自动转换并显示出来。


这样,显然在十进制中的数字55转换为十六进制后为37。

当使用在十进制中未出现的符号A, B, C,D,E,,F时,我们可以从键盘输入这些信息。

我认为这种方法在实践中更有用途,允许我们不费力的将数字从一种数制转换到另一种数制。

十六进制负数

这有些难于理解,所以让我们从头道来。十六进制数制一定可以表示负数。如果不行话,那怎样表示一个相对应的十进制负数,例如-1,用十六进制表示是什么?

考虑到这个问题后,我希望所有的问题将会逐渐变的明朗。

如果我们将00000000 到FFFFFFFF所有可能的十六进制数都写出来,我们怎样表示负数?

我们将其中的一半表示正数,一半表示负数。

正数从00000000到7FFFFFFF,负数从80000000到FFFFFFFF

正数

00000000和十进制0相同
00000001仍然是十进制中的1
……
……
7FFFFFFF为十进制的2147483647(也是最大正数)

负数

FFFFFFFF和十进制-1相同
FFFFFFFE为十进制-2
……
……
80000000等同于十进制的-2147483648(也是最小负数)

你可以试着用CommandBar插件查询7FFFFFFF在十进制中的值,只需在其前加问号,然后回车。


在右边,我们看到它返回了十进制值2147483647,完全正确。

现在,我们想看看80000000的值是否为负,我们看到它不能显示(译注1)7FFFFFFF之后的值(这是CommandBar的一个bug),那么在OllyDbg中如何检验它的值呢?


这是一个小技巧。
在寄存器窗口点选EAX。


右键点击选择Modify


出现的窗口让我们修改EAX的值,这个窗口也可以完成不同的转换功能。第一栏填入我们想转换的十六进制值,第二栏会出现相对应的十进制值。

这里,我们看到十六进制80000000转换为了十进制-2147483648。


如果你想检验FFFFFFFF为十进制-1。


在这个窗口中,可以更新寄存器。当我们轻松的验证完负数后,点击Cancel。我们不要以任何方式改变寄存器的值。

ASCII字符

在以下截图中,看到的这种数据将是我们学习的内容之一。每个字符都被赋予了十六进制值。这允许我们将它们视为字符组合,字符和值等等。

这张表拷贝自(嘿嘿)Теории ассемблера (Caos Reptante),你可以看到十进制值,相应的十六进制值和字符。例如,你想在OllyDbg中使用空格,你可以使用20 (Hex) 或者 32 (Dec)。



另外,在CommandBar中,我们可以查询十六进制数字对应的字符。
?45


我们看到45对应的是大写字母E,如果你在上表中间一列查询45,会发现它确实就是大写字母E的十六进制值。


在OllyDbg的数据(Dump)窗口中有一列为ASCII字符,让我们看看在CrackMe(译注2)中是否出现了其中的一些字符。


在显示十六进制值那列的旁边,就是ASCII列,在那里,你可以看到由ASCII字符组成的文本字串。

堆栈是什么?

它是内存的一块区域,用于短暂存储数据,这些数据稍后不久就要恢复取出。

就像在桌上放一叠信件或纸牌,最新的信件或纸牌都是放在最顶部,如果一张张地取走信件或纸牌,总会从最上面的开始取。

这是堆栈的主要性质,放在顶部的信件总会被最先取走。

以后我们将学习OllyDbg的堆栈怎样工作。


好的,我认为这次的课程应该结束了。在第三章,我们将学习寄存器,标志以及它们的意义。





译注1
CommandBar插件只能显示到7FFFFFFF的值,输入7FFFFFFF之后的任意数值,它也只会显示7FFFFFFF的结果。

译注2
本文使用第一章的CrackMe,包含在随文附件中

随文附件
1.  CrackMe:ollydbg01-Crackme.zip


翻译说明:
该系列教程目前官方已更新到第47章。本文原文为俄语,译者不才,斗胆翻译,采用了能用的所有手段。虽经本人严加审校,但难免讹误。有些词句加入了译者的理解,所以部分内容可能与原文有所出入。翻译本文也是译者学习的过程,所以错误在所难免。如发现错误,敬请指正,以免误人子弟。

该系列教程链接:http://wasm.ru/series.php?sid=17

本文原文链接:http://wasm.ru/article.php?article=ollydbg02


本文原文版权:[C] Рикардо Нарваха, пер. Aquila
译文版权:BGCoder,http://www.pediy.com/

pdf格式和随文附件:

上传的附件 使用OllyDbg从零开始Cracking 第二章翻译.rar