返回介绍

第二章 - 数值系统

发布于 2025-01-31 21:06:54 字数 4705 浏览 0 评论 0 收藏 0

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

数制系统

最常用的数制系统是二进制,十进制和十六进制。 了解它们,最主要的你要知道是:

· 二进制:只有符号 0 和 1,因此称为二进制。

· 十进制:出现 10 个字符(从 0 到 9),因此称为十进制。

· 十六进制:从 0 到 F(0-9,A,B,C,D,E 和 F,总共 16 个字符)。

通常,除非另有说明,当我们提及某一具体数字时都将其认作十六进制。 我们不使用将 数值从一种数制转换为其它数制的令人不太愉快的数学公式。当前,Cracker 们一般使用 Windows 自带的计算器,它将更加快捷和容易使用,以避免繁冗的工作。

打开计算器,准备工作。

image

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

image

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

八进制 Oct,二进制 Bin。

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

因此,将一个数字从一种数制系统转换到另一种数制系统,最简单的方法,先将计算器选择

到数字初始数制的位置,例如,你需要将数字 55 从十进制转换为十六进制,在计算器位于 十进制位置时输入 55。

image

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

image

这样,显然在十进制中的数字 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 在十进制中的值,只需在其前加问号,然后 回车。

image

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

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

image

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

image

右键点击选择 Modify

image

出现的窗口让我们修改 EAX 的值,这个窗口也可以完成不同的转换功能。第一栏填入我们

想转换的十六进制值,第二栏会出现相对应的十进制值。

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

image

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

image

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

ASCII 字符

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

这张表拷贝自(嘿嘿)«Теории ассемблера» (Caos Reptante),你可以看到十进制值,相应的十

六进制值和字符。例如,你想在 OllyDbg 中使用空格,你可以使用 20 (Hex) 或者 32 (Dec)。

image

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

image

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

字母 E 的十六进制值。

image

在 OllyDbg 的数据(Dump)窗口中有一列为 ASCII 字符,让我们看看在 CrackMe(译注 2)

中是否出现了其中的一些字符。

image

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

堆栈是什么?

它是内存的一块区域,用于短暂存储数据,这些数据稍后不久就要恢复取出。 就像在桌上放一叠信件或纸牌,最新的信件或纸牌都是放在最顶部,如果一张张地取走信件

或纸牌,总会从最上面的开始取。

image

这是堆栈的主要性质,放在顶部的信件总会被最先取走。 以后我们将学习 OllyDbg 的堆栈怎样工作。

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

译注 1

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

译注 2

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文