软件逆向原理与实践 复习
一、IA-32的内存模型和内存管理
区分三个概念:物理地址、线性地址和逻辑地址
物理地址:CPU地址总线传来的地址。
线性地址:空间是连续的,从0到FFFFFFFFH,虚拟地址不是被直接送到内存地址总线上,而是送到存储器管理单元MMU,把虚拟地址映射为物理地址。
逻辑地址:在有地址变换功能的计算机中,访内指令给出的地址 (操作数) 叫逻辑地址,也叫相对地址,也就是是机器语言指令中,用来指定一个操作数或是一条指令的地址。由段选择器(Segment)和偏移(Offset)计算得到
1.实模式
段选择器(Segment)和偏移(Offset)都是16位
2.保护模式
保护模式中,处理器需要经过两步完成到物理地址空间的转换:逻辑地址转换和线性地址空间分页。
(1)段模式
段选择器里有13位是全局段描述符表索引或局部段描述符表索引,来找到那一项段描述符-->段描述符共64位(还包括长度上限、访问权限等),里有32位是段基地址。段基地址和偏移地址加和得到线性地址。
(2)段页式
就是段模式加上分页
之前段模式加和的得到直接就是线性地址,读取里面的内容即可。
这次得到线性地址中存的是页目录索引(10位)、页表索引(10位)和物理页内偏移(12位).通过页目录索引,查找页目录,找到那一页页表的基址。加上页表索引(在页表内的偏移),得到页表项。页表项里存的是物理页基址,加上物理页内偏移,从而找到物理地址。
二、IA-32指令集
1.一些汇编指令
(ECX是8,复制8次,每次双字即4个字节,所以一共32字节)
JZ(Jump if Zero)是此前的运算结果为0时跳转。若此前运算结果不为0,则不跳转,执行JZ指令后面的下一条指令。判断结果是否为零,靠的是ZF标志位状态。所以,JZ指令是在ZF=1时跳转,ZF=0时不跳转。
汇编程序设计中JL是一个条件跳转指令,全名jump less,意为小于跳转
2.函数调用相关栈操作和指令集
有n个参数ESP就要加n
来一个一段代码作为例子
1 //ESP 为 NN 2 push p2 //ESP=NN-4 3 push p1 //ESP=NN-8 4 call test //ESP=NN-0C 5 { //进入函数内 6 push ebp //ESP=NN-10 7 mov ebp, esp //EBP 指向 栈顶 EBP==当前ESP 8 mov eax, dword ptr [ebp+0ch] //eax = 参数2 9 mov ebx, dword ptr [ebp+08h] //ebx = 参数1 10 sub esp, 8 //ESP == NN-18 11 ... 12 add esp, 8 //ESP== NN-10 13 pop ebp //ESP==NN - C 14 ret 8 //ESP==NN + 4 +8 15 } 16 //ESP = NN
需要人工调整参数带来的ESP变化,来平栈
3.x64特性
传参顺序与x86不同,更多的用寄存器
栈是从右向左传参,寄存器是从左向右传参
三、反汇编算法
1.线性扫描
2.递归遍历
四、混淆技术
REG32的意思是32位寄存器
MOV DWORD PTR [ESP],EAX:意思是把EAX寄存器中的内容放入地址是ESP所指内容、大小为双字的内存空间
五、DLL注入
1.常见Windows核心API
2.三种注入方法
3.代码注入和DLL注入的区别