花指令的原理是堆栈平衡,不管花指令代码是什么样的,要达到目的都是加花后,堆栈与未加之前一样。
例如:
push ebp
mov ebp,esp
add esp -0c
add esp 0c
mov eax,原入口
push eax
retn
在上面的代码中,push ebp是将寄存器ebp压入堆栈,mov ebp,esp是将寄存器esp的值送给寄存器ebp。“add esp,-0c”和“add esp,0c”这两句代码执行后的效果就是什么也没做,达到堆栈平衡。
最后三句代码的功能是实现跳转到入口点。其中,“mov eax,原入口”指令将入口点送入寄存器eax;“push eax”将寄存器eax压入堆栈;retn从堆栈取得返回地址并跳到该地址执行。
可以用5种方法对上面代码进行修改:
1、替换法
替换法就是简单地替换代码中的数值,同样是本着堆栈平衡原理进行的。
push ebp
mov ebp,esp
add esp -3
add esp 3
mov eax,原入口
push eax
retn
2、移位法
所谓移位法,就是简单地将花指令中的堆栈平衡代码调整位置。
push ebp
mov ebp,esp
add esp 3
add esp -3
mov eax,原入口
push eax
retn
3、添加法
所谓添加法,是指在现有的花指令代码中添加几句堆栈平衡的代码,从而生成新的花指令代码。
push ebp
mov ebp,esp
push edx
pop edx
add esp -0c
add esp 0c
mov eax,原入口
push eax
retn
4、去除法
去除法是指在现有的花指令代码中,删除几句完整的堆栈平衡代码
push ebp
mov ebp,esp
push edx
pop edx
mov eax,原入口
push eax
retn
5、跳转法
所谓跳转法,是在花指令中加入一些跳转指令,跳转到另外的花指令代码处,执行后再返回原来的花指令代码中
004035DA 55 PUSH EBP
004035DB 8BEC MOV EBP,ESP
004035DD EB 08 JMP SHORT 004035E7
004035DF B8 A2124000 MOV EAX,004012A2
004035E4 50 PUSH EAX
004035E5 90 NOP
004035E6 90 NOP
004035E7 83C4 F4 ADD ESP,-0C
004035EA 83C4 0C ADD ESP,0C
004035ED ^EB F0 JMP SHORT 004035DF
小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)
GMT+8, 2024-5-1 01:33
Powered by Discuz! X3.4
© 2001-2023 Discuz! Team.