代码保护和混淆
抵御静态分析
对于二进制程序分析,工具都要先进行反汇编,所以要进行抵御,可以对汇编进行特殊处理来干扰工具的分析
花指令
函数头处增加pushfd,popfd和nop指令
;常规的函数头
push ebp
mov ebp,esp
sub esp,0x100
;加上花指令后
push ebp
pushfd
add esp,0xd
nop
sub esp 0xd
popfd
mov ebp,esp
sub esp,0x100
;pushfd和popfd等指令会混淆逆向工具的栈指针解析
插入脏字节并设置跳转
push ebp
jmp addr1 ;跳转到下面以保持正常的运行
db 0xe8 ;脏字节,并且这个0xe8是call指令的起始字节,会让反汇编器认为这里是一条call指令
addr1:
mov ebp,esp
sub esp,0x100
条件跳转来干扰递归下降反汇编器
递归下降反汇编器虽然部分模拟了程序执行的控制流过程,但是并不是真正的运行,不能获取所有的信息,
利用这点插入条件跳转来让其反汇编所有的分支,这样就会导致0xe8被解析为指令,导致错误
push ebp
jz addr1
jnz addr1 ;实际上是成为了无条件跳转
db 0xe8
addr1:
mov ebp,esp
sub esp,0x100
例题见逆向做题总结
同时将代码打乱顺序
push ebp
jz addr3
jnz addr3 ;实际上是成为了无条件跳转
db 0xe8
addr3:
sub esp,0x100
...
addr2:
mov ebp,esp
jmp addr3
指令替换
将一些指令替换为另一组相同或相似效果的指令来混淆,虽然程序效果没有变化,但是特殊的指令会让反汇编器出现错误
例如call,ret指令会让反汇编器解析出的函数地址范围和调用关系出现错误
;call指令
call addr
;可替换为
push addr
ret
;ret 进一步替换为(前提是ecx没有在使用)
push ecx
mov ecx,[esp+4]
add esp,8
jmp ecx
代码自修改(SMC)
SMC技术会对程序特定部分在运行时进行特定的处理,并被使用函数指针来作为代码直接调用
常见于壳类程序中,静态分析时IDA等工具会将处理前的部分解析为数据,导致错误
加密
加密壳程序分为数据加密,代码加密,算法加密
数据加密一般是在合适的时机对程序中已有的数据进行即时的解密
代码加密同理,例如SMC技术
算法加密偏重算法的混淆,模糊与隐藏,例如VM虚拟机保护

浙公网安备 33010602011771号