新手过程中学习破解的常见指令整理
自己新手学习过程中遇到的一些指令意思不懂,分享一下,自己整理的一些常见汇编指令 注:来之互联网整理各位可以补充下或者说错地方请指教。
新手学习破解可以看看@yyhd大神的帖子——《玩玩破解,写给新人看》:
https://www.52pojie.cn/thread-1358649-1-1.html
还有@Sound版主的——《零基础新手破解学习导航帖》
https://www.52pojie.cn/thread-582852-1-1.html
A 、 add :加法指令,第一个是目标操作数,第二个是源操作数,格式为:目标操作数 = 目标操作数 + 源操作数。
B 、 sub :减法指令,格式同 add 。
C 、 call :调用函数,一般函数的参数放在寄存器中。
D 、 ret : 跳转会调用函数的地方。对应于 call ,返回到对应的 call 调用的下一条指令,若有返回值,则放入 eax中。
E 、 push :把一个 32 位的操作数压入堆栈中,这个操作在 32 位机中会使得 esp 被减 4 (字节), esp 通常是指向栈顶的(这里要指出的是:学过单片机的同学请注意单片机种的堆栈与 Windows 下的堆栈是不同的,请参考相应资料),这里顶部是地址小的区域,那么,压入堆栈的数据越多, esp 也就越来越小。
F 、 pop :与 push 相反, esp 每次加 4 (字节),一个数据出栈。 pop 的参数一般是一个寄存器,栈顶的数据被弹出到这个寄存器中。一般不会把 sub 、 add 这样的算术指令,以及 call 、 ret 这样的跳转指令归入堆栈相关指令中。但是实际上在函数参数传递过程中, sub 和 add 最常用来操作堆栈; call 和 ret 对堆栈也有影响。
G 、 mov :数据传送。第一个参数是目的操作数,第二个参数是源操作数,就是把源操作数拷贝到目的一份。
H 、 xor :异或指令,这本身是一个逻辑运算指令,但在汇编指令中通常会见到它被用来实现清零功能。用 xor eax,eax 这种操作来实现 mov eax,0 ,可以使速度更快,占用字节数更少。
I 、 lea : load effect address. 取得第二个参数的有效地址(也就是去偏移地址)后放入到前面的寄存器(第一个参数)中。然而 lea 也同样可以实现 mov 的操作,例如:lea edi,方括号表示存储单元,也就是提取方括号中的数据所指向的内容,然而 lea 提取内容的地址,这样就实现了把(ebx-0ch )放入到了 edi 中,但是 mov 指令是不支持第二个操作数是一个寄存器减去一个数值的。
J 、 stos :串行存储指令,它实现把 eax 中的数据放入到 edi 所指的地址中,同时 edi 后移 4 个字节,这里的stos 实际上对应的是 stosd ,其他的还有 stosb,stosw 分别对应 1 , 2 个字节。
注意:(1) stosb: 中一个字节送入 AL(2) stosw: 中一个字送入 AX(3) stosd: 中一个双字送入 EAX
K 、jmp :无条件跳转指令,对应于大量的条件跳转指令。
L 、jg :条件跳转,大于时成立,进行跳转,通常条件跳转之前会有一条比较指令(用于设置标志位)。
M 、 jl :小于时跳转。
N 、 jge :大于等于时跳转。
O 、 cmp :比较大小指令,结果用来设置标志位。
P 、 rep :重复执行后面的指令rep stos dword ptr 是将 edi 指向的区域初始化为 例如:0CCCCCCCCh 可以理解为一个函数,传来的某个参数为指针,然后将这个指针指向的区域初始化。
Q、 short:小跳转
R、JE :等于跳转
S、JNE :不等于则跳转
T、JZ :为 0 则跳转
U、JNZ : 不为 0 则跳转
注:Jump Equal : 相等时跳转
Jump No Equal :非相等时跳转
Jump Zero :值 0 时跳转
Jump No Zero :值非0时跳转
Jump(跳转) Equal(相等) No(非,不) Zero(零)
页:
[1]