转移指令,call,ret

一. 转移指令:可以修改IP,或同时修改CSIP的指令,分为

1. 段内转移:只修改IPjmp的目标代表相对于当前IP的偏移,而不是地址。如

jmp offset8 ;机器码EB XX

jmp offset16 ;机器码E9 XXXX

 

 

 

 

 

jmp ax

 

 

 

 

 

jmp word ptr[XXXX]

 

 

 

 

 

段内转移又分为

(1) 短转移:跳转范围为-128 ~ 127

(2) 近转移:跳转范围为-32768 ~ 32767

 

2. 段间转移(远转移):同时修改CSIP,如

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则跳转,判断结果是否有偶数个1Parity Even

JNP/JPO ;PF=0则跳转,Parity Odd

 

JC/JB/JNAE ;CF=1则跳转,判断结果是否进位或借位

JNC/JNB/JAE;CF=0则跳转

 

AboveBelow用于无符号数比较高低

GreaterLess用于有符号数比较大小

 

 

 

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

 

 

 

三. CALLRET

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

反复用以上方法转换,使指令越来越多。还可以一套对应多个方案,随机选则。

 

 

 

 

 

posted @ 2020-09-29 07:00  八转达人  阅读(639)  评论(0编辑  收藏  举报