第一章 Windows PE
基本工具
1.1开发语言MASM32
1.1.1设置开发环境
这个不细说了,我在整理Intel汇编的时候详细的说了环境搭建以及细节。地址是:http://blog.csdn.net/u013761036/article/details/52186683
1.1.2 开发第一个源程序HelloWorld.
这个也不多解释,我直接写了个简单例子:
;-------------------------------------
;功能:测试OD用的Hello
World程序
;作者:Act-Code
;日期:2016.9.1
;-------------------------------------
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
includelib user32.lib
includelib kernel32.lib
.data
szText db "HelloWorld" ,0
.code
main proc
invoke MessageBox ,NULL ,addr szText ,addr szText ,MB_OK
invoke ExitProcess ,0
main endp
end main
运行结果:
1.2 调试软件OllyDBG
OD是破解常用软件之一,我们可以通过它来调试了解开发该程序的基本思路,调试是逆向工程必须掌握的一门技术。
下面调试上面的那个HelloWorld.exe来简单介绍下OD.
主界面(各种DIY版本比较多,我用的这个是小伙伴给的 吾爱破解上的)
一:
(1)指令及指令解释区;
该区域位于整个界面的左上角,共包含四列。分别为指令所在的内存地址、指令字节码、反汇编后的指令语句,以及指令相关的注释。OD的强大之处在于,它将许多难懂的指令字节码反解释成了汇编指令,并附以形象的说明。
(2)寄存器及运行状态区;
该区域位于整个界面的右上角,包含了所有的32位寄存器,如eax、ebx、ecx、esi、edi、esp、edp等。大家要特别关注以下几个寄存器:
ebp(栈基地址指针)
esp(栈顶指针)
eip(指向下一条指令的地址指针)
除了寄存器的值外,该区还显示所有段寄存器的值及标识的位置,如FS段,这个段在后面降到异常时会用到。
(3)代码和数据区;
该区域位于整个界面的左下角,它包含了指定内存范围的字节码,我们可以通过菜单命令随时查看当前内存中的数据。
(4)栈区;
该区域位于整个界面的右下角,它反映了当前栈的分配情况及栈在程序运行过程中的变化情况。
二:简单介绍下其他载入
F7 :单步步入
F8:单步步过
F2:下断点
F9:跳到断点
还有,看到那个00401000了吗,这个应该很熟悉,固定基址,比如如果我们是用vs2012开发c++程序,这个东西在这设置:
如果选择的是否,其他的什么也不填写,那么默认就是0x00400000,上面看到的那个0x0001000多出来的那个1000就是代码段的开始,对照下面这个结构。
汇编语言编译链接的程序的可执行代码被装入操纵系统后,代码的执行入口点被设置在进程地址空间的0x00401000处,大小为1000h;紧跟着是输入表,也占1000h字节;最后是数据段,大小为1000h。以下是exe文件被加载到内存后的部分结构:
1.2.2 修改EXE文件字节码
OD不仅可以让我们对exe文件进行反汇编和单步执行调试,还可以对目标exe文件进行修改,比我我们对上面的那个Helloworld进行修改,直接修改显示的字符串。我们可以直接在(3)右键保存exe文件,然后就会跳出来一个框,直接在上面找到helloworld进行修改,记得如果后面不是00的不要修改,可能会导致崩溃。
效果:
当然如果是光要实现这个目的,方法很多,这里只是简单介绍OD,完全可以直接二进制进行编辑,比如直接用十六进制编辑软件FlexHex进行修改等:
1.3 初识PE文件
PE(Portable Executeable File Format,可移植的执行文本格式),使用该格式的目标是使链接生成的EXE文件能在不同的CPU工作指令下工作。
可执行文件的格式是操作系统工作方式的真是写照。Windows操作系统中可执行的程序有好多种,比如COM、PIF、SCR、EXE等,这些文件的格式大部分都继承自PE。其中exe是最常见的PE,动态链接库(大部分以DLL为扩展名的文件)也是PE文件,本书只涉及这两种类型的PE文件。
PE格式中,每一个大的部分的对齐方式就是按照200h大小对齐的。