必要性

  • 纯汇编语言开发
  • 高级语言内联汇编
  • Windows内核编程
  • 逆向分析

汇编语言种类

  • x86汇编语言
  • x64汇编语言
  • 伪指令
  • 高级数据表示
  • win32汇编入门
  • 内联汇编

环境配置

VC->win32应用程序向导(选择空项目)->属性->高级->入口点(main)->生成依赖项(选择masm)->添加汇编程(asm后缀)

扩展:asmdude

代码基本套路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
.586  ;指令集
.MODEL flat,stdcall ;内存模式、语言模式、其他模式
includelib user32.lib ;调用静态库
includelib kernel32.lib
ExitProcess PROTO,dwExitCode:DWORD ;伪指令
MessageBoxA PROTO hWnd:DWORD,lpText:BYTE,lpCaption:BYTE,uType:DWORD
;option
;option casemap:none,是否对大小写敏感
.data
;.data:数据,定义初始值
;.data?:未初始化数据段
;.const:常量数据段
;.code:代码段
;.stack:堆栈段,现在不需要,系统会自动调用
Number DWORD 0
text db "shellcode",0
.code
main proc
mov eax,5
mov ebx,6
add eax,Number
push 0
push offset text
push offset text
push 0
call MessageBoxA
add esp,16
call ExitProcess
main ENDP
END main.586 ;指令集
.MODEL flat,stdcall ;内存模式、语言模式、其他模式
includelib user32.lib ;调用静态库
includelib kernel32.lib
ExitProcess PROTO,dwExitCode:DWORD ;伪指令
MessageBoxA PROTO hWnd:DWORD,lpText:BYTE,lpCaption:BYTE,uType:DWORD
;option
;option casemap:none,是否对大小写敏感
.data
;.data:数据,定义初始值
;.data?:未初始化数据段
;.const:常量数据段
;.code:代码段
;.stack:堆栈段,现在不需要,系统会自动调用
Number DWORD 0
text db "shellcode",0
.code
main proc
mov eax,5
mov ebx,6
add eax,Number
push 0
push offset text
push offset text
push 0
call MessageBoxA
add esp,16
call ExitProcess
main ENDP
END main

汇编使用:注释

汇编函数没有main,需要指定主函数

相关基础知识

度量单位

基本数据度量单位:
1BYTE=8BIT
WORD=2BYTE=16BIT
DWORD=4BYPE=32BIT
QWORD=8BYPE=64BIT

数据存储度量单位
1KB=1024BYPE=8192BIT
1MB=1024KB
1GB=1024MB
1TB=1024GB

取值范围
BYPE=有符号:-128至127|无符号:0至255
WORD=有符号:-32768至32767|无符号:0至65535
DWORD=有符号:-2147483648至2147483647|无符号:0-4294967295
QWORD=有符号:-9223372036854775808至9223372036854775808

X86处理架构基本概念

基本微机设计

1d12bf9c76e3429e957c04113e948ce6.png

时钟周期

v2-464417834617a4920095c2ec93e5533d_1440w.jpg
时钟周期是处理器执行动作的最小时间单位。处理器的主频越高,其时钟周期就越短,执行操作的速度就越快。但是主频的提高也会带来其它问题,比如功耗和散热,因此现代CPU会权衡性能和功耗这两方面的影响;同时主频也做不到无限提高,因为电流的传输也是需要点时间的。

在计算机中,时钟周期提供了一个统一的时间基准,使得不同的硬件组件和指令能够按照同样的时间节奏进行操作。各个组件和指令可以根据时钟信号的跳变来确定何时开始和结束各自的操作,从而实现同步和协调。

加载执行程序

  1. 磁盘寻找文件
  2. 访问文件信息
  3. 加载程序至内存
  4. 执行指令,分配Process ID
  5. 进程自动运行
  6. 结束后从内存移除

操作模式

保护模式

保护模式是Intel 80286及后续x86系列处理器的核心运行模式,随80286处理器首次引入。该模式通过段级保护与特权级检查机制实现内存保护功能,支持分页系统和硬件虚拟内存管理,被Linux、FreeBSD及Windows 2.0之后版本等操作系统采用。处理器启动时默认进入实模式,需通过程序切换至保护模式

虚拟8086模式

8086 CPU 中寄存器总共为 14 个,且均为 16 位 。即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES 共 14 个。而这 14 个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器。

实地址模式

实模式:(即实地址访问模式)它是Intel公司80286及以后的x86(80386,80486和80586等)兼容处理器(CPU)的一种操作模式。实模式被特殊定义为20位地址内存可访问空间上,这就意味着它的容量是2的20次幂(1M)的可访问内存空间(物理内存和BIOS-ROM),软件可通过这些地址直接访问BIOS程序和外围硬件。实模式下处理器没有硬件级的内存保护概念和多道任务的工作模式。但是为了向下兼容,所以80286及以后的x86系列兼容处理器仍然是开机启动时工作在实模式下。80186和早期的处理器仅有一种操作模式,就是后来我们所定义的实模式。实模式虽然能访问到1M的地址空间,但是由于BIOS的映射作用(即BIOS占用了部分空间地址资源),所以真正能使用的物理内存空间(内存条),也就是在640k到924k之间。1M地址空间组成是由16位的段地址和16位的段内偏移地址组成的。用公式表示为:物理地址=左移4位的段地址+偏移地址。

实模式寻址采用和8086相同的16位段和偏移量,最大寻址空间1MB,最大分段64KB。可以使用32位指令。32位的x86 CPU用做高速的8086。

系统管理模式

系统管理模式(SMM)是Intel处理器架构中的一种特殊模式,用于执行系统底层功能,如电源管理和安全防护。