软件逆向原理与实践 复习

一、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注入的区别

 

posted @ 2022-03-06 22:19  Xmasker^_^  阅读(212)  评论(0编辑  收藏  举报