跳转指令

0x01 JMP指令
JMP ——-> 修改EIP
mov jmp,寄存器/立即数 简写为 jmp 寄存器/立即数

0x02 CALl指令(调用)
push 下一行地址 修改eip
pop eip
call 指令 —–> 将下条指令地址压入栈中(esp - 4),修改eip
ret 指令——> pop eip(esp + 4)

0x03 DEBUG中快捷键
F2 —– 下断点
F3 —– 载入程序
F7 —–
F8 —– 单步执行

堆栈平衡 :函数调用前后,栈顶指针 与栈底指针相同
外平栈 :谁调用谁平衡

0x04 CMP 指令
指令格式:CMP R/M ,R/M/IMM
用来比较两个数,实际上相当于sub指令,但是相减的结构并不保存到第一个操作数中。
只是根据相减的结果来改变零标志,当两个操作数相等时,零标志位置1

  mov eax,100
  mov ecx,100
  cmp eax,ecx

  cmp ax,word ptr ds:[edx]

0x05 TEST 指令
两个数值进行与操作,结果不保存,但是会改变相应标志位
用于确定某寄存器是否为零

 1、JE /JZ         结果为零则跳转(相等时跳转)   ZF = 1

0x06 函数
计算机的函数,是一个固定的一个程序段, 或称为一个子程序。它可以实现固定功能同时,有一个入口和一个出口,所谓入后,就是所带的各个参数,通过入口,将函数的参数代入子程序,供计算机处理,所谓出口,就是指函数的计算结果,也称返回值,在计算机求得之后,由此口待会给调用它的程序。

PUSH EBP                提升堆栈,为函数执行提供空间
MOV EBP,ESP             
SUB ESP,40              
PUSH EBP                保留现场:函数执行时会用到一些寄存器但这些寄存器中的值可能会被程序用到,所以先存储到内存中
PUSH ESI                
PUSH EDI                
LEA EDI,DWORD PTR SS:[EBP-40]               向分配的空间填充数据
MOV ECX,10              
MOV EAX,CCCCCCCC                
REP STOS DWORD PTR SS:[EDI]             
MOV EAX,DWORD PTR SS:[EBP+8]                函数的功能
MOV EAX,DWORD PTR SS:[EBP+C]                
POP EDI             恢复现场:将之前保留的寄存器的值恢复
POP ESI             
POP EBX             
MOV ESP,EBP             降低堆栈
POP EBP             恢复栈底
RETN                函数执行完毕,返回到调用出

你可能感兴趣的:(逆向学习)