Windows PE权威指南总结(一)

截止2020年2月2日一共耗时5天半学习《Windows PE权威指南》,以下内容知识点在书表现为前三章(至104页)。要强调的是本系列不适合当学习教材,只是我学习过程的总结,能当复习资料。
学习环境:XP虚拟机 + MASM32(汇编到exe) + OllyDebug(动态调试) + 010Editor(配合exe模板查看PE文件结构)

0x00 前置知识点:

  1. stdcall与cdecl调用约定差异,17年写过一篇文章: 汇编与C/C++的故事
  2. C语言基本功:指针,数据类型
  3. 常用Windows API: CreateFile,CloseHandle,MessageBox,ExitProcess
  4. 汇编基础(特别重要):内存寻址方式,段寄存器,栈寄存器。

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的基本使用


USB监控程序为例: exe下载
当点击注册按钮时将弹出一个网页以及注册码提示框。

  1. 点击注册按钮时阻止网页的弹出。
  2. 找到正确注册码(这样无需修改程序)。
  3. 修改判断指令,输入任意注册码均成功。
  4. 保存以上修改,转储为新的exe文件。

0x03 debug.exe的基本使用(简化版的OD)

文章几乎没有花篇幅介绍debug.exe的使用,只是一带而过。但我发现这是一个宝,所以单独提出来做一个知识点,以下是debug.exe能完成的功能。

  1. 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
  1. 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
  1. 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^....
  1. 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                           ........
  1. T指令单步运行(我没用过,一直在用OD)

0x04 PE文件数据结构之Dos Header和Dos Stub

  1. 文件起始就是Dos Header结构体。Dos Header占用0x40个字节,前两个字节是4D 5A, 3C偏移处是4个字节的addressOfNewExeHeader。 为了向16位应用程序兼容,设计了Dos Header结构,并通过末尾4个字节指向真正的exe头部。

    Dos Header

  2. 介于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)的互相转换。


Image File Header

以上是前三章内容,以基本功为主。
第二篇(导入表): https://www.jianshu.com/p/741c926ba705

你可能感兴趣的:(Windows PE权威指南总结(一))