一.通用寄存器及其作用简介
通用寄存器包括了8个16/32位的寄存器,分别为AX/EAX, BX/EBX,CX/ECX, DX/EDX, SP/ESP(利用esp定律脱壳就是看这个的,如果只有这个寄存器的值是高亮的,那么就可以用),BP/EBP, DI/EDI, SI/ESI。
其中AX/EAX,BX/EBX,CX/ECX,DX/EDX这四个寄存器一般作为通用的数据寄存器,用来暂时存放计算过程中用到的操作数,结果或其他信息。
AE/EAX:作为累加器用,是算数运算的主要寄存器。还有所有的I/O指令都使用其与外部设备传送信息
BX/EBX:是基址寄存器,在内存寻址时存放基地址。
CX/ECX:常用来保存计数值,如在移位指令,循环指令中用作隐含的计数器。
SP/ESP,BP/EBP,SI/ESI,DI.EDI:通常是在寻址器寻址时,提供偏移地址,所以也叫作指针或变址寄存器
SP/ESP:称为堆栈指针寄存器,用来指出栈顶的偏移地址
BP/EBP:称为基址指针寄存器,esp始终指向栈顶,EBP是在堆栈中寻址用的
二.数据传送指令(只写了一些常用的)
1.传送指令 MOV Reg/Mem,Reg/Mem/Imm
意思是把后面的值赋给前面(Reg--寄存器,Mem--存储器,Imm--立即数)
2.交换指令 XCHG Reg/Mem,Reg/Mem
将两个寄存器/存储器的内容交换,要注意的是两个操作数的数据类型要一致
3.堆栈操作指令
堆栈具有先进先出的特点,通常用来保存程序的返回地址,有进栈/出栈操作
作用:保护数据用,先将寄存器中的数据保存在堆栈中,这就是入栈。然后,可以对他们进行操作而不影响原来的数据,需要用到原数据时,再出栈。
进栈:PUSH Reg/Mem
出栈:Pop Reg/Mem
4.转移指令(重点)
转移指令包括条件转移指令和无条件转移指令两大类
无条件转移指令:JMP 不用多说,就是程序运行到这里的时候必定跳转,在OD中这行代码的左侧有一条红色的线,表示将要跳转,如果不想让他跳可以将其设置为nop,这就是常用的nop法破解。
有条件转移指令:JZ/JE,在OD中只表示为JE,在OD中看运行到这一行时会不会具体的跳,可以在此处设置断点,然后F9运行,左侧的线是灰色的表示不跳,红色的表示将要跳转。需要注意的是,JE跳与不跳还与OD右侧中显示的Z标志位有关,若为1则跳,为0不跳,破解测试时可以直接更改标志位,但要注意这样修改无法保存,若想要保存跳,可以直接修改代码为JMP即无条件跳转。
5.子程序的调用和返回指令
调用指令(CALL 子程序名/Reg/Mem)在OD中单步走到call指令时,可以按F7进入到子程序中
返回指令(RETN Imm)
--------------------------------------------------------------------------------------------------------------------------------
我的第一篇博客到这就写完了,自己刚学习破解没多久,对内容的理解还不是很深,如果有哪位发现了文章中的错误,还希望各位能够不吝赐教!