转移指令,call,ret
一. 转移指令:可以修改IP,或同时修改CS和IP的指令,分为
1. 段内转移:只修改IP,jmp的目标代表相对于当前IP的偏移,而不是地址。如
jmp offset8 ;机器码EB XX
jmp offset16 ;机器码E9 XXXX
jmp ax
jmp word ptr[XXXX]
段内转移又分为
(1) 短转移:跳转范围为-128 ~ 127
(2) 近转移:跳转范围为-32768 ~ 32767
2. 段间转移(远转移):同时修改CS和IP,如
jmp 1234:5678
jmp far [0010] ;高地址是目标段地址,低地址是目标偏移地址。
花指令:通过跳转调到一条指令的中间,导致反汇编引擎解析时错误识别,后续的机器码会恢复正常,可以在后面加更多的花指令。花指令不影响实际执行效果。应对方式是将实际无效的指令替换为nop。
二. 条件转移指令
JZ/JE ;CF=1则跳转,判断结果是否相等
JNZ/JNE ;CF=0则跳转
JS ;SF=1则跳转,判断结果是否为负数
JNS ;SF=0则跳转
JO ;SF=1则跳转,判断结果是否为溢出
JNO ;SF=0则跳转
JP/JPE ;PF=1则跳转,判断结果是否有偶数个1,Parity Even
JNP/JPO ;PF=0则跳转,Parity Odd
JC/JB/JNAE ;CF=1则跳转,判断结果是否进位或借位
JNC/JNB/JAE;CF=0则跳转
Above和Below用于无符号数比较高低
Greater和Less用于有符号数比较大小
jcxz 23 ;if(cx == 0) jmp short 23
loop 23 ;if(--cx) jmp short 23
loopz 23 ;if(--cx && ZF) jmp short 23
loopnz 23 ;if(--cx && !ZF) jmp short 23
三. CALL和RET
call offset ;push IP, jmp near offset
Call seg:offset ;push CS, pushIP jmp far seg:offset
call reg ;push IP, jmp reg
Call word ptr[addr] ;push IP, jmp [addr]
Call dword ptr[addr] ;push CS, push IP, jmp [addr]
Ret ;pop IP
Fetf ;pop IP, pop CS
Ret 8 ;pop IP, add sp,8
变形、混淆、膨胀代码的一种做法:稳定可靠低把一条指令变成多条,例如:
Jmp XXX => push XXX, ret
Call XXX => push IP, jmp XXX
Ret => Pop XXX, jmp XXX
Push XXX => sub sp,2, mov [sp], XXX
Pop XXX => mov XXX,[sp], add sp,2
反复用以上方法转换,使指令越来越多。还可以一套对应多个方案,随机选则。