主要由子程MixCode实现混淆,三个输入参数依次为起始内存地址、大小和JMP数量
混淆后,从指定的起始内存开始,在指定的内存大小内乱跳,JMP数量由第三个参数指定
没跳到的地方被随机填充,干扰视线= =
在下新手,尚有诸多不足,也是我第一次发帖,请哥哥姐姐们多多指教
.686p
.model flat,stdcall
option casemap:none
include windows.inc
include ntdll.inc
includelib ntdll.lib
include User32.inc
includelib User32.lib
include Strings.mac
.data
;供子程DelayExec使用
align 4
@Sl_Syn1 dd ?
@Sl_Syn2 dd -1
.code
;子程DelayExec,只是比Sleep效率高
DelayExec Proc uses eax Time
mov eax,Time
mov ecx,2710h
mul ecx
neg eax
mov @Sl_Syn1,eax
invoke NtDelayExecution,0,offset @Sl_Syn1
ret
DelayExec endp
;子程MixCode,实现垃圾代码生成
;三个参数依次为起始内存地址、大小和JMP数量
MixCode Proc pAddr,dwSize,MixVal
mov edi,pAddr
xor ecx,ecx
L01: ;循环用随机数填充内存
push ecx
rdtsc
.IF al < 10h
ror eax,1
invoke DelayExec,1
.ELSEIF al < 20h
ror eax,3
invoke DelayExec,2
.ELSEIF al < 30h
ror eax,5
invoke DelayExec,3
.ELSEIF al < 40h
ror eax,7
invoke DelayExec,4
.ELSEIF al < 50h
rol eax,1
invoke DelayExec,5
.ELSEIF al < 60h
rol eax,3
invoke DelayExec,6
.ELSEIF al < 70h
rol eax,5
invoke DelayExec,7
.ELSEIF al < 80h
rol eax,7
invoke DelayExec,8
.ELSEIF al < 90h
rcr eax,1
invoke DelayExec,9
.ELSEIF al < 0A0h
rcr eax,3
invoke DelayExec,10
.ELSEIF al < 0B0h
rcr eax,5
invoke DelayExec,11
.ELSEIF al < 0C0h
rcr eax,7
invoke DelayExec,12
.ELSEIF al < 0D0h
rcl eax,1
invoke DelayExec,13
.ELSEIF al < 0E0h
rcl eax,3
invoke DelayExec,14
.ELSEIF al < 0F0h
rcl eax,5
invoke DelayExec,15
.ELSE
rcl eax,7
invoke DelayExec,16
.EndIF
pop ecx
mov byte ptr [edi+ecx],al
inc ecx
cmp ecx,dwSize
jne L01
xor ebx,ebx
dec cl
L02: ;写入跳转指令
mov byte ptr [edi+ebx],0EBh
.IF MixVal == 0
sub cl,bl
dec cl
mov byte ptr [edi+ebx+1],cl
.ELSE
L03:
rdtsc
cmp cl,al
jbe L03 ;不能跳出指定的内存区域
movzx edx,al
cmp byte ptr [edi+edx-1],0EBh ;而且附近不能有跳,不然会覆盖掉原有的跳
je L03
cmp byte ptr [edi+edx],0EBh
je L03
cmp byte ptr [edi+edx+1],0EBh
je L03
sub dl,bl
mov byte ptr [edi+ebx+1],dl
sub byte ptr [edi+ebx+1],2
add bl,dl
dec MixVal
jmp L02
.EndIF
ret
MixCode endp
Code:
db 81 dup (?)
;垃圾代码若成功无误的执行,就能跳出'Code Mix Successfully'的对话框了
invoke MessageBoxTimeoutW,0,$CTW0('Code Mix Successfully'),0,MB_ICONINFORMATION,0,-1
invoke NtTerminateProcess,-1,0
Start:
invoke MixCode,offset Code,81,16 ;随机产生垃圾代码
jmp Code ;跳到垃圾代码处运行垃圾代码
end Start
运行程序出现'Code Mix Successfully'后可以用调试器附加进来看垃圾代码的效果~
对与MixCode的输入参数是有要求的,因为函数内部没有对输入的参数进行检查。
由于短跳的原因,dwSize要小于0FFh。如果dwSize太大,倒数第二个跳离内存区域尾部很远,最后一个跳是跳不出垃圾代码区域的还有,JMP数量要小于dwSize的三分之一,不然就有可能没达到指定的JMP数量,内存区域内就已经找不到空余的位子给剩下的JMP了
因为是用JMP做垃圾代码,不会产生什么影响,但也正是因此,起到的混淆作用并不大,不过是一堆JMP而已,仅供交流
最后,在下新手,尚有诸多不足,也是我第一次发帖,请哥哥姐姐们多多指教
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!