ecx 循环计数
eax 保存返回值、
EDX 乘数
esp 堆栈顶
ebp 栈底
ESI: 数据来源
EDI: 目的
EAX:通用寄存器。相对其他寄存器,在进行运算方面比较常用。在保护模式中,也可以作为内存偏移指针(此时,DS作为段寄存器或选择器)
EBX:通用寄存器。通常作为内存偏移指针使用(相对于EAX、ECX、EDX),DS是默认的段寄存器或选择器。在保护模式中,同样可以起这个作用。
ECX:通用寄存器。通常用于特定指令的计数。在保护模式中,也可以作为内存偏移指针(此时,DS作为寄存器或段选择器)。
EDX:通用寄存器。在某些运算中作为EAX的溢出寄存器(例如乘、除)。
同AX分为AH&AL一样,上述寄存器包括对应的16-bit分组和8-bit分组。
ESI:通常在内存操作指令中作为“源地址指针”使用。当然,ESI可以被装入任意的数值,但通常没有人
EDI:通常在内存操作指令中作为“目的地址指针”使用。当然,EDI也可以被装入任意的数值,但通常没有人把它当作通用寄存器来用。ES是默认段寄存器或选择器。
EBP和ESP:作为指针的寄存器,也可作为16位寄存器BP, SP使用,常用于椎栈操作。通常,它被高级语言编译器用以建造‘堆栈帧'来保存函数或过程的局部变量,不过,还是那句话,你可以在 其中保存你希望的任何数据。SS是它的默认段寄存器或选择器。
注意,这四个寄存器没有对应的8-bit分组。换言之,你可以通过SI、DI、BP、SP作为别名访问他们的低16位,却没有办法直接访问他们的低8位。
指令
移动
mov指令 进行数据的传递mov eax 1
mov 全部移动
movsx 16位像32为移动 高16位 F填充
movzx 16位像32为移动 高 16为0填充
栈 (先进后出)
push 压入
pop 弹出
pushad 不需要别的数据 pushad 全部压入(如果我想改掉一些程序 保证不会崩溃- )
popad 全部弹出
lea 取地址指令& int *i =&a;
call 调用API或者函数
算数
add eax,ebx eax+ebx 然后把值放入到 eax
sub -
mul *
div /
inc a++
dec a--
xor eax,ebx 异或 清零寄存器 俩个值按位进行比较,如果相同,吧目的数的当前位直0,如果不同,把目的数的当前位置1
or eax,ebx ||
and eax,ebx &&
not ~
shl <<
shr >>
//------------------------------------------------------------------------------第二课
硬盘 适合用于长时间大量存储数据 ,但是由于硬盘的速度较慢,在程序运行是就将硬盘中的数据加载内存
内存 速度比 cpu慢
所以在cpu设计了一个单元叫寄存器,主要负责在运算是保存数据
但是程序的数据都存储在内存中,为了能保证cpu的运算速度,就有在cpu中加入了高速缓存单元
主要负责将内存中的数据进行预读,如果cpu下次运算需要的数据正好在高速缓存中,叫做catch命中,否则为catch未命中,需要在高速缓存又去读取一次内存。
高速缓存对我来说是透明的,在一般工作是无需注意,但是如果我们需要对一个程序进行优化,catch未命中也是我们需要考虑的问题之一,反汇编的过程就是灌肠计算机运算的过程,所以
寄存器和
内存是特别需要注意的2个点
寄存器
在x86平台下,cpu中有10个寄存器
严格分类的话有4个数据寄存器EAX,EBX,ECX,EDX
每个数据寄存器为32位长,其中低16位又被称为某x寄存器,操作低位寄存器将不影响高位的值
这么设计主要是为了能兼容16位的程序
在查资料的时候经常会看到 说 eax是累加寄存器的说法,
希望理解的是根据编译器优化策略的不同,使用的寄存器也不相同
所以需要记住的是4个寄存器都为数据寄存器即可
可以认为它与数据寄存器的功能类似即可
指针寄存器会分别使用ESP保存当前栈底的地址,而EBP保存当前栈顶的地址
并非绝对,在寄存器不够是也可以拿着2个寄存器当成数据寄存器使用
永远无法当做数据寄存器
EIP 存储的是下一句的指令地址
EFlags 存储的是计算的结果的状态
这2个寄存器中存储的值都有其特殊的意义,修改后悔影响呈现的执行流程
vs 实战 逆向分析
逆向的模板是知道目标呈现做了些什么事情,所使用的手段是通过阅读程序反汇编后的汇编代码以理解程序的执行流程及作用
vs 中的有一些协助信息 练习需要屏蔽
右键显示源代码
_main代表当前函数的名词性,这也是反汇编引擎通过分析符号表给我们提示的信息之一
00D213DC rep stos dword ptr es:[edi]
在这个之后一直到rep stos这句指令,都是我们函数头部分,先不分析这部分作用
mov dword ptr[ebp-8],1
mov 是一个汇编指令,作用是将 以后的值赋值到,之前 相当于 c语言的 =号
dword 是一个单位代表了长度,一个dword为32位长
ptr 是指针的意思
[] 代表 去地址的值相当于c语言中的*
对于 ebp为一个栈顶所以我们能推断出他是一个局部变量的观点我们先不去理解,在之后学习了栈之后自然能理解