Windows PE权威指南总结(一)
截止2020年2月2日一共耗时5天半学习《Windows PE权威指南》,以下内容知识点在书表现为前三章(至104页)。要强调的是本系列不适合当学习教材,只是我学习过程的总结,能当复习资料。
学习环境:XP虚拟机 + MASM32(汇编到exe) + OllyDebug(动态调试) + 010Editor(配合exe模板查看PE文件结构)
0x00 前置知识点:
- stdcall与cdecl调用约定差异,17年写过一篇文章: 汇编与C/C++的故事
- C语言基本功:指针,数据类型
- 常用Windows API:
CreateFile,CloseHandle,MessageBox,ExitProcess
- 汇编基础(特别重要):内存寻址方式,段寄存器,栈寄存器。
0x01 第一个masm程序(注意是masm)
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data
szText db 'HelloWorld',0
.code
start:
invoke MessageBox,NULL,offset szText,NULL,MB_OK
invoke ExitProcess,NULL
end start
编译: ml -c -coff main.c
链接: link -subsystem:windows main.obj
将生成 main.exe可以直接运行
0x02 OD的基本使用
![](https://img.haomeiwen.com/i12288686/1d12204b2d0426a0.png)
USB监控程序为例: exe下载
当点击注册按钮时将弹出一个网页以及注册码提示框。
- 点击注册按钮时阻止网页的弹出。
- 找到正确注册码(这样无需修改程序)。
- 修改判断指令,输入任意注册码均成功。
- 保存以上修改,转储为新的exe文件。
0x03 debug.exe的基本使用(简化版的OD)
文章几乎没有花篇幅介绍debug.exe的使用,只是一带而过。但我发现这是一个宝,所以单独提出来做一个知识点,以下是debug.exe能完成的功能。
- R指令查看当前寄存器值 以及IP指向的指令
-R
AX=0000 BX=0000 CX=0800 DX=0000 SP=00B8 BP=0000 SI=0000 DI=0000
DS=0B40 ES=0B40 SS=0B50 CS=0B50 IP=0000 NV UP EI PL NZ NA PO NC
0B50:0000 B001 MOV AL,01
- U指令将机器码转成汇编指令
-U
0B50:0000 0E PUSH CS
0B50:0001 1F POP DS
0B50:0002 BA0E00 MOV DX,000E
0B50:0005 B409 MOV AH,09
0B50:0007 CD21 INT 21
0B50:0009 B8014C MOV AX,4C01
0B50:000C CD21 INT 21
- D指令查看指定内存的值
-D 0B50:0000
0B50:0000 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 ........!..L.!Th
0B50:0010 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F is program canno
0B50:0020 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 t be run in DOS
0B50:0030 6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 mode....$.......
0B50:0040 DD 38 55 DE 99 59 3B 8D 99 59 3B 8D 99 59 3B 8D .8U..Y;..Y;..Y;.
0B50:0050 17 46 28 8D 9F 59 3B 8D 65 79 29 8D 98 59 3B 8D .F(..Y;.ey)..Y;.
0B50:0060 52 69 63 68 99 59 3B 8D 00 00 00 00 00 00 00 00 Rich.Y;.........
0B50:0070 50 45 00 00 4C 01 03 00 76 57 36 5E 00 00 00 00 PE..L...vW6^....
- A指令编写汇编代码(配合D指令查看机器码)
-A 0B50:0000
0B50:0000 mov AX,1
0B50:0003 mov BX,2
0B50:0006 add AX,BX
0B50:0008 ^C
-D 0B50:0000 7
0B50:0000 B8 01 00 BB 02 00 01 D8 ........
- T指令单步运行(我没用过,一直在用OD)
0x04 PE文件数据结构之Dos Header和Dos Stub
-
文件起始就是Dos Header结构体。Dos Header占用0x40个字节,前两个字节是
4D 5A
, 3C偏移处是4个字节的addressOfNewExeHeader。 为了向16位应用程序兼容,设计了Dos Header结构,并通过末尾4个字节指向真正的exe头部。
Dos Header
-
介于Dos Header和addressOfNewExeHeader之间的称为Dos Stub。其逆向代码如上面debug.exe的U指令所示,其主要功能是调用9号中断,在屏幕上输出This program cannot be run in DOS mode。不太重要就不截图了。
0x05 PE文件数据结构之ExeHeader
通过Dos Header中addressOfNewExeHeader值可以跳转到新的头部所在位置。具体数据结构见下图,重要字段用红色标出。需要完全理解红色标出字段的含义,特别是最后一个字段是DataDirArray,涉及到相对虚拟地址(RVA),虚拟地址(VA)和文件内偏移(FOA)的互相转换。
![](https://img.haomeiwen.com/i12288686/663363505145b88b.png)
以上是前三章内容,以基本功为主。
第二篇(导入表): https://www.jianshu.com/p/741c926ba705