杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3080|回复: 0

OllyDBG 入门系列(一)-认识调试器

[复制链接]
发表于 2015-1-23 15:12:51 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x

由于修改字体要分析exe文件的反汇编代码,所以必须用到调试器或者反汇编工具,以前,修改字体用的工具主要有两类:TRW2000,SoftICE等为代表的调试器与W32Dasm、IDA pro(idag)等为代表的反汇编工具,前者动态分析,功能强大,修改灵活方便,但由于是命令行式的工具并且需要使用者有较高的汇编语言能力与调试能力,一般的汉化人又不精通这些。所以大部分教程都是用w32dasm为例来讲解字体的修正。W32dasm也有其缺点,就是生成的反汇编代码较乱,并且不具备动态调试能力(虽然有这个功能,但很难用)对于像“野蛮改法”这样的“套公式”的改法,还可以,要想比较完美的修改,静态就有些力不从心了。情况在Ollydbg出现后有所改观,这个工具是一个反汇编工具与调试器的合体,拥有着比W32DASM更强大的反汇编功能与强大的调试能力,虽然调试能力没有TRW等强大,但对付一般的字体完全没有问题,并且由于其标准的windows界面,强大的分析引擎,使得分析代码变得非常容易,适合不太懂汇编的朋友使用。所以我吐血推荐作为修改字体的首选工具。下边我就介绍一下他的使用方法。


打开ollydbg,其主界面如下

image002.jpg

反汇编代码区:这是主区,反汇编后的代码就显示在这里。没什么好说的,其他都是辅助区,也就是辅助我们分析反汇编代码的,当然其他区在调试的时候才会真正有用。尤其是寄存器区与堆栈区。

寄存器区:是在调试时现实当前的寄存器内容的区域,它显示了当前被调试的程序某一时刻CPU的寄存器的值,如果不懂CPU的结构,可以认为寄存器是CPU为了执行操作所需要的一些暂时存储一些数据的存储器,每个存储器4个字节(32位)。

内存编辑区:显示内存中的内容,并可以按需要更改其中的内容,值得注意的是:若不是在调试状态,这里边的数据并不一定有效,因为数据节(程序存放数据的区域)在运行时是可以修改的。

堆栈区:显示堆栈的内容,所谓堆栈,其实也就是一片内存区域,只不过其遵循先进先出的存放规则,就像一个杯子(如下图):

image004.jpg

DATA1最先放入堆栈中,所以在最里边,如果想把他取出,就要先把上边的DATA4, DATA3,DATA2,依次取出,这就是堆栈的访问规则,对堆栈的标准访问手段有两种:压栈和出栈,压栈就是把一个数据存入对栈,出栈就是把一个数据从堆栈取出,与堆栈有关的还有一个就是栈中数据的地址,这个是程序用来用非标准手段访问堆栈用的,比如我要在不取出上边的数据就想访问DATA1,就要用到DATA1的地址。(特别指出:堆栈跟一般的内存没啥区别,用访问内存的指令可以像访问一般的可读写内存一样访问堆栈。)

我在介绍一下可执行文件在内存中的简单结构

image006.jpg

当然,一个可执行文件的结构不可能这么简单。我只是把与我们有关的数据区简单的画了出来,帮助大家理解。代码节就是存放代码的地方,反汇编也就是反汇编这一节不过由于这一节是只读的,默认并不能写,所以程序还有数据节用来存放一些数据,数据节是可读写的。其他节就是资源节,输入表节,重定位节等等,与反汇编关系不大,所以不作介绍。堆栈区这不是EXE中的,而是系统为程序自动分配的一个内存区域(大小可认为识无穷大(实际当然不是,但与我们无关))。这个区也是用来存数据的,可能你会问:为啥有了数据节了还要来个堆栈区呢?是这样的,由于程序运行时需要用到大量的暂存数据,并且大部分只用很短时间,并且大小也可能未知,这样便不方便放入数据节,数据节适合放一些使用时间较长的数据,举个例子,现代的语言都是结构化的,分成一个个的函数,函数就是一些可以重复使用的功能块。要使它可以重复使用,与外界的联系就一定要少,所以其内部的数据以及传入的参数在函数运行完后就要丢掉,这些数据如果放在数据节就容易被其他函数使用,就很难保证独立性。所以很适合放在堆栈中,而函数传给其调用者函数的数据就要在函数执行后还要存在,所以就不适合放在堆栈中,而是放在数据节里边了。所以数据节可以认为是静态空间,堆栈区可以认为是动态空间。

话说多了(不过上便可不是废话)。继续介绍OLLYDBG.用OD载入一个程序后界面如下:

image008.jpg

这个程序是我特别写的一个程序,为了更原汁原味的体现“编译器”风格,我没有用汇编写,而是用的Visual C++ 7.1写的,基本上能体现软件实际的代码,当然后边的拆解教程我会先用汇编写例子,因为汇编有个好处就是可以按照我的要求生成代码,容易达到我要的代码效果,如果你没有学过汇编,或者没有做过windows程序设计,可能你会对上边的反汇编区里边的东西头大,不过没有关系,这些头大的东西与我们无关,我们只需要掌握与我们有关的指令、函数即可.这些我在后续的文章会一一作详细讲解(以免一次说太多大家看晕了)。由于我们分析程序是以反汇编代码区为主的,所以我再详细的说一下其中的内容:

image010.jpg

如上图,反汇编代码区大体分4个区。代码地址区是程序装入内存后代码节中的指令的实际地址,也就是对应着点晴偏移变量转换器中的“虚偏移”,Lord PE中的“VA”。(还有就是改代码时推荐直接用OllyDbg改,或者用LordPE集成的HexEditer改,用这些小工具+UE太容易搞错了,方法我也会介绍。)十六进制区对应的是代码节里的内容,也就是反汇编之前的代码。反汇编区就是十六进制区里边的内容反汇编后的代码了,跟十六进制区是一一对应的。反汇编注释区,这是反汇编区的结果经Ollydbg分析后的结果。上图是一个程序里的一个CreateFont函数的调用,由上图可以看到,Ollydbg自动给我们列出了CreateFontA这个函数的所有参数以及参数值,不但更为直观,也省去了我们去数PUSH,光凭这一点我们在反汇编工具的选择上就有足够的理由毫不犹豫的扔掉W32DASM,转投Ollydbg的怀抱了。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-4-28 19:44 , Processed in 0.130832 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表