代码保护和混淆

抵御静态分析

对于二进制程序分析,工具都要先进行反汇编,所以要进行抵御,可以对汇编进行特殊处理来干扰工具的分析

花指令

函数头处增加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虚拟机保护

反调试

posted @ 2024-01-24 17:55  WA-HAHA  阅读(75)  评论(0)    收藏  举报