首页
社区
课程
招聘
[原创]简单的随机生成垃圾代码示例(汇编)
发表于: 2013-2-24 17:47 5013

[原创]简单的随机生成垃圾代码示例(汇编)

2013-2-24 17:47
5013

主要由子程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而已,仅供交流

最后,在下新手,尚有诸多不足,也是我第一次发帖,请哥哥姐姐们多多指教


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 6
支持
分享
最新回复 (1)
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
汇编学习!!
2013-2-24 18:37
0
游客
登录 | 注册 方可回帖
返回
//