- 第一章 - OD 的各个窗口介绍
- 第二章 - 数值系统
- 第三章 - 寄存器
- 第四章 - 汇编指令
- 第五章 - 数学指令
- 第六章 - 比较和条件跳转
- 第七章 - call ret
- 第八章 - 循环 字符串指令和寻址方式
- 第九章 - 基本概念
- 第十章 - 断点
- 第十一章:硬件断点与条件断点
- 第十二章 - 消息断点
- 第十三章 - 硬编码序列号寻踪-Part1
- 第十四章 - 硬编码序列号寻踪-Part2
- 第十五章 - 硬编码序列号寻踪-Part3
- 第十六章 - 序列号生成算法分析-Part1
- 第十七章 - 序列号生成算法分析-Part2
- 第十八章 - 序列号生成算法分析-Part3
- 第十九章 - OllyDbg 反调试之 IsDebuggerPresent
- 第二十章 - OllyDbg 反调试之检测 OD 进程名
- 第二十一章 - OllyDbg 反调试之检测 OD 进程名,窗口类名,窗口标题名
- 第二十二章 - OllyDbg 反调试之 UnhandledExceptionFilter,ZwQueryInformationProcess
- 第二十三章 - OllyDbg 反调试之 ProcessHeap,NTGlobalFlag,OutputDebugStringA
- 第二十四章 - OllyDbg 反调试之综合 CrackMe
- 第二十五章 - 异常处理
- 第二十六章 - Visual Basic 程序的破解-Part1
- 第二十七章 - Visual Basic 程序的破解-Part2
- 第二十八章 - Visual Basic 程序的破解-Part3
- 第二十九章 - P-CODE-Part1
- 第三十章 - P-CODE-Part2
- 第三十一章 - 脱壳简介
- 第三十二章 - OEP 寻踪
- 第三十三章 - 神马是 IAT 如何修复
- 第三十四章 - 手脱 UPX,修复 IAT
- 第三十五章 - 手脱 ASPack V2.12
- 第三十六章 - IAT 重定向
- 第三十七章 - 论 IAT 重定向之修复
- 第三十八章 - 手脱 Yoda's Protector v1.3(Yoda's Crypter)
- 第三十九章 - 神马是 stolen bytes
- 第四十章 - OllyDbg 脚本的编写
- 第四十一章 - 神马是 AntiDump
- 第四十二章 - ACProtect V1.09 脱壳(寻找 OEP 绕过硬件断点的检测 修复 Stolen code)
- 第四十三章 - ACProtect V1.09 脱壳(编写脚本修复 IAT)
- 第四十四章 - ACProtect V1.09 脱壳(修复 AntiDump)
- 第四十五章补充章节-ReCrypt v0.80 脱壳(续)
- 第四十六章 - Patrick 的 CrackMe-Part1
- 第四十七章 - Patrick 的 CrackMe-Part2
- 第四十八章 - PeSpin V1.3.04 脱壳-Part1
- 第四十九章 - PeSpin V1.3.04 脱壳-Part2
- 第五十章 - 再谈 ReCrypt v.0.80 脱壳(调戏 OutputDebugString)
- 第五十一章 - ASProtect v2.3.04.26 脱壳-Part1
- 第五十二章 - ASProtect v2.3.04.26 脱壳-Part2
- 第五十三章 - TPPpack 脱壳
- 第五十四章 - EXECryptor v2.2.50.a 脱壳-Part1
- 第五十五章 - ExeCryptor v2.2.50.a-Part2
- 第五十六章 - EXECryptor v2.2.50.b 脱壳
- 第五十七章 - ExeCryptor v2.2.50.c/d/e/f/g 脱壳
- 第五十八章 - ExeCryptor v2.2.50
第二章 - 数值系统
当我们回顾了 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 对应的是大写字母 E,如果你在上表中间一列查询 45,会发现它确实就是大写
字母 E 的十六进制值。
在 OllyDbg 的数据(Dump)窗口中有一列为 ASCII 字符,让我们看看在 CrackMe(译注 2)
中是否出现了其中的一些字符。
在显示十六进制值那列的旁边,就是 ASCII 列,在那里,你可以看到由 ASCII 字符组成的文 本字串。
堆栈是什么?
它是内存的一块区域,用于短暂存储数据,这些数据稍后不久就要恢复取出。 就像在桌上放一叠信件或纸牌,最新的信件或纸牌都是放在最顶部,如果一张张地取走信件
或纸牌,总会从最上面的开始取。
这是堆栈的主要性质,放在顶部的信件总会被最先取走。 以后我们将学习 OllyDbg 的堆栈怎样工作。
好的,我认为这次的课程应该结束了。在第三章,我们将学习寄存器,标志以及它们的意义。
译注 1
CommandBar 插件只能显示到 7FFFFFFF 的值,输入 7FFFFFFF 之后的任意数值,它也只会显示 7FFFFFFF 的结果。
译注 2
本文使用第一章的 CrackMe,包含在随文附件中
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论