黑客防线,在攻与防的对立统一中寻求突破!2001年创刊的黑客技术专业刊物!
plant

设为首页
收藏本站
联系我们
网站导航

黑客文章 - 黑客工具免杀 - 浏览 - [原创]CCL打造杀毒软件免杀的超级黑器

[原创]CCL打造杀毒软件免杀的超级黑器

黑客 发布日期:2008-12-27 0:46:10 共有 4127 人次浏览
适合读者:入侵爱好者
前置知识:黑软基本使用方法
刘流:最近一段时间,网络上的很多攻击事件在大范围的扩散,很多服务器被入侵、控制,各种极品后门、木马被安装在了这些倒霉的服务器上。很多热心的读者朋友们提出了疑问:“为什么黑客用的是和我们同样的工具,那些
适合读者:入侵爱好者
前置知识:黑软基本使用方法
刘流:最近一段时间,网络上的很多攻击事件在大范围的扩散,很多服务器被入侵、控制,各种极品后门、木马被安装在了这些倒霉的服务器上。很多热心的读者朋友们提出了疑问:“为什么黑客用的是和我们同样的工具,那些服务器上的强大杀毒软件就没有反映呢?”,其实很简单。杀毒软件检测木马、后门等黑器时,最传统也是最有效的方法之一是特征码比较,也就是找到病毒(恶意程序)库里的各软件的特征码,一旦确定是符合的,就归咎为木马、后门,而且越是名气大的黑器越是被追杀的体无完肤,找不到特征码自然就不认为是后门、木马了。
有时候在入侵时,好不易突破了对方防火墙的堵截,想传个心爱的后门过去,可立足未稳就已经被对方的杀毒软件枪毙了。于是如何打造自己的不被各种杀毒软件查杀的黑客工具就成为先如今最热门的话题。CCL就是在这样的情势下冲出江湖的一个优秀工具,它根据黑防以往文章的原理,精心构造了各种适合黑客们使用的功能,让普通新手也能轻松的打造出自己的不被杀的黑软!WTF偶然在焦点上遇到该软件的作者,针对特征码讨论了半天,最后共同策划了本期专题,推出了3种流行黑软的克制杀毒软件的方法。同时为了照顾新手,特意在最后一种黑软上进行了详细的解说,并配合了最细致的录象供大家手把手学习,相信看了本文,你再也不会羡慕黑客们不被杀的后门木马了!
CCL打造杀毒软件免杀的超级黑器
/图 tankaiha
特别策划:黑防编辑部
现在的杀毒软件真是越来越牛,有时辛辛苦苦传到肉鸡上的后门还没有来得及运行就惨遭夭折,而且往往名气越大的后门就越容易成为各路杀毒软件封杀的对象。黑客们就束手无策了吗?不!黑防2004年第10期上有篇名为《杀毒软件能奈我何——网络神偷特征码修改实战》的文章,详细介绍了通过字节替换的原理来实现黑客工具不被杀的过程,总结起来就一句话:如果文件中的特征码被我们填入的数据(比如0)替换了,那杀毒软件就不会报警,以此确定特征码的位置。这个方法简单而有效,但是手动操作起来工作量太大。受作者冰狐浪子启发,我编写了个小程序来自动实现特征码定位的功能。程序的中文名叫特征码定位器,英文名叫CCL,日文名叫……(咦,哪儿来的鸡蛋)。下面,我们就来讲讲怎样在短时间内打造不被查杀的超级黑器!
 
打造免杀黑器之一:WinShell特征码的自动定位
CCL的原理是将原文件中部分字节替换为0,然后生成新文件,再根据杀毒软件来检测这些文件的结果判断特征码的位置。使用CCL之前应该先设置一下参数,包括操作方式是自动还是手动,生成文件的路径。
自动操作时,有一个参数很重要,就是每生成一个文件等待的秒数。因为我们要保证杀毒软件在这个几秒钟内对替换过的文件进行了检测,并能删除该文件(如果含特征码的话),然后CCL根据刚才的生成文件是否被删除来决定下面的操作。如果间隔时间过短,杀毒软件没有来得及检测,CCL就进入了下一轮操作。嘿嘿,轻者判断结果出错,重者系统很可能会崩溃的!建议先把时间设大一些,比如7到10秒。
 
小提示:这种检测对已加壳的文件是无效的,因为带壳文件被替换的字节不是原程序的真身,而是加壳后的数据,所以第一步已经记得是首先要脱壳。
 
铛铛铛!第一个目标是WinShell,谁能简单介绍一下WinShell的功能?伴随一声刺耳的驴叫,名叫卡巴斯基的男生站了出来:WinShell是一个非常小巧的Telnet后门程序,我父亲将它命名为Backdoor.Win32.WinShell.50,用VC编成,如图1所示。
图1
下面让我们利用自动替换功能来定位特征码。首先运行CCL,将参数设为自动,等待时间7秒,最小定位精度设为16个字节。然后关闭杀毒软件即时监测功能(后文均简称为监测),打开待检测文件。成功读入后会弹出PE文件段选择窗口(如图2所示)。
图2
这是让用户选择对文件的哪一个部分进行替换。我们双击.text段(这是可执行文件的代码段),然后用户输入区会显示相应数据。我们再点击“添加区段”,就成功地添加了一个待检测区段。当然,你也可以直接在“用户输入区”填入数据然后添加。双击已添加的区段,可以删除任务。
 
小提示:我们应该选择几个段进行检测呢?最简单的方法是一个都不选,程序会默认对整个文件进行检测。但有时候文件过大,或者你能确定特征码位于某个段中,为了避免替换时间过长,可以选择特定的范围进行检测。
 
“是否填充0”这个选项的功能是指为了预先排除某些部分的干扰,我们在生成文件中将该部分用0填充。举个例说明一下,文件有A、B两处特征码,为了更精确的定义A,我们可以将B所在的段预先填0,然后专门定位A所在的部分。关于填充0的时机,大家在使用过程中会慢慢总结出来的。好了,回到WinShell,这里我们选择“不填充0”,也就是正常替换。单击确定,弹出了操作窗口(如图3所示)。
图3
窗口里显示了各种信息,包括文件名、生成路径、操作方式和需要硬盘空间(手动的话)。这时,别忘了打开杀毒软件的监测,并且将该功能设为“遇到病毒时自动删除,不提醒用户”。然后打开“我的电脑”,进入生成文件的文件夹,让“我的电脑”窗口保持在前台。
 
小提示:为什么要这么做呢?因为有的杀毒软件只对前台窗口生成的文件进行即时监测,就算“我的电脑”窗口在前台也不一定对生成文件检测,这时可以不断的在文件图标上单击右键,来“刺激”一下杀毒软件。详细过程请看光盘录象。
 
回到CCL,确认窗口显示的信息无误后,单击GO,开始自动检测。这时,你会发现“我的电脑”文件夹里多了两个文件,名称形如“OUT_XXXXXXXX_YYYYYYYY”,其中8个X代表当前替换0的起始偏移,8个Y代表替换多少字节的0。几秒钟内,会有一个文件被杀毒软件自动删除(再强调一下,7秒钟是你设定的等待时间,要确保含特征码的文件在这7秒内被删除掉),7秒后会生成另外两个文件,这是CCL进行下一轮检测了。这样等啊等,期间不停的在生成文件图标上点鼠标右键(不知道除了卡巴斯基,其它的杀毒软件需不需要这样的刺激),过了2分多钟,结果出来了。
        -------------定位结果------------
      序号    起始偏移     大小     结束偏移
    0001    0000180C    00000014    00001820   
    0002    00002130    00000050    00002180   
    0003    00002810    00000028    00002838   
    0004    000028D8    00000014    000028EC   
       这个结果说明特征码可能在这四段中。定位成功了?呵呵,不要急,这才刚刚完成了一半,下面还要对文件进行修改,并最后确定特征码的位置与类型。小提示:四处结果不一定都需要改,如果只改动一处就成功,那是最好不过的。挑一处段大小最小的改吧,就第一项,从文件偏移0x180C开始的0x14个字节。我们用OllyDbg打开WinShell.exe,来到0x0040180C处。这里省略了文件偏移和内存偏移的转换,代码如下:
0040180E       83C0 C1           add eax,-3F                 
00401811              83F8 39            cmp eax,39
00401814       0F87 5C01000>     ja win.00401976
0040181A       33C9              xor ecx,ecx
0040181C       8A88 0C1A400>    mov cl,byte ptr ds:[eax+401A0C]
00401822       FF248D E4194>    jmp dword ptr ds:[ecx*4+4019E4]
       怎么改呢?这里讲两个通用的方法。特征码不可能只由某一句指令来确定,这样误报率会非常高,因此通常是多条指令的组合,我们只要将这个组合打乱既可。最简单的方法当然是两条指令调个顺序,我们把它叫做指令顺序调换法,它使用的范围仅限于互不干扰的两条指令。可有很多情况,指令的执行顺序是不能调的,比如上面的6条指令,这时就用第二种方法:通用跳转法则:在文件中寻找一个空隙(由于对齐的原因,PE文件中往往会有一些空隙处没有代码,全部为0),将原来的指令改成一个跳转,跳到这个空隙去执行,空隙处填入我们原来的指令,执行完毕再跳转回去。我们将OllyDbg的滚动条向下拉,Look,在0x00405D20处有空隙,如图4所示。
 

下面全部是空隙
代码尾部

图4
修改方法见下面(改之前别忘了先将原文件备份一下):
0040180E      /E9 0D450000       jmp WinShell.00405D20
00401813      |90                nop
00401814      |0F87 5C010000     ja WinShell.00401976
       为什么要改Add和Cmp两句?因为Jmp指令占了5个字节,而Add和Cmp均为3字节指令,只能两个一起改了。好,我们将0x0040180E处改为Jmp 00405D20,多出一个字节我们改为Nop。接着在空白处将原来的Add和Cmp两条指令补上,尾部再来个Jmp回去的代码。在Jmp回去时,可以回到Nop,也可以直接跳到Ja处,这里选择跳回Nop。
00405D20       83C0 C1           add eax,-3F
00405D23       83F8 39           cmp eax,39
00405D26     ^ E9 E8BAFFFF       jmp WinShell.00401813
       修改完毕,我们保存一下先。在OllyDbg窗口中单击右键选择“复制到可执行文件—>全部保存”,然后保存到WinShell.exe中。OK,在菜单中选择“重新运行”,回到0040180E处,确定刚才的修改已经保存了。关闭OllyDbg,找到WinShell.exe,用杀毒软件进行扫描。嘿嘿,卡巴斯基已经认不出它来了!如图5所示,收功!
图5
       你也许会问,不管什么杀毒软件都是这样修改吗?答案是:NO。各个杀毒软件对特征码的定义是不一样的,唯一的方法就是分别对每个平台进行检测,再有针对性的修改。修改方法一样:指令顺序调换法通用跳转法!对了,还有一点:尽量在代码段中找空,但有时候代码段中的空隙实在是不够,就把跳转的代码写在别的段中。由于这些段的默认属性里没有“可执行”这一项,你把代码移过去执行自然会报错,这时用PE修改工具将段属性加上可执行就可以了。
 
打造免杀黑器之二:手动与自动结合定位黑社会2.0的特征码
WinShell是VC编译的文件,那么对于别的语言编写的程序,比如汇编、VB等等,这种定位还有效吗?原则上来说,只要是编译成机器码的程序都可以定位。VB是一种解释语言,它的可执行文件的代码不单纯是机器码(汇编指令),不知道CCL对它的定位效果如何。黑社会2.0是一个VB编写的集远程管理与攻击为一体的黑器,下面来测试一下它的特征码定位。
黑社会的执行文件是AsPack加的壳,可以用AspackDie1.41自动脱去。这一次我们改变一下操作方法,由全自动改为手动与自动结合,先利用手动替换来大体确定特征码的范围。
首先运行CCL,设置参数为手动,按规定个数输出文件,输出个数为100。参数设置完后打开已脱壳的文件,在弹出的PE段选择对话框中直接点击“确定”按钮,也就是对整个文件进行替换。关闭监测,然后在操作窗口中单击“GO”,很快100个文件就生成了。
 
小提示:手动生成大量文件时,一定要将杀毒软件的监测功能关闭,不然杀毒软件要同时处理这成百上千个带毒文件,系统会崩溃的!
 
我们用杀毒软件对这100个文件进行扫描,在杀毒软件删除了所有含特征码的文件后,只剩下两个文件。我们在工具栏中选择“定位”按钮并打开刚才的生成文件夹,确定后主窗口上便显示出了定位信息。如图6所示。
图6
 
编号为1的结果显示是从偏移0000开始替换的,在我的机器上这个结果不用考虑,因为卡巴斯基软件对于没有PE头的文件是不进行特征码检测的,文件1中恰好是PE头被替换了,自然就不会被删除(据说别的杀毒软件,比如Norton,不管有没有PE文件头都会进行特征码检测,具体情况要具体分析),因此初步确定特征码在编号2的文件所表示的范围内,既0x2DC2到0x44A3之间的0x16E1个字节的范围内。
重新设置参数为自动,读入原文件,在“用户输入区”直接输入起始位置2DC2和检测大小16E1,不填充0,然后点击添加区段,确定后进入操作窗口。打开监测,单击GO,开始自动检测,操作方法和检测WinShell时一样。又经过一番对鼠标右键的折磨,终于得出了结果:
        -------------定位结果------------
      序号    起始偏移     大小     结束偏移
    0001    000031C6    00000016    000031DC   
    0002    00003A16    0000002C    00003A42   
    0003    00003A44    0000002C    00003A70   
    0004    00003A71    0000002C    00003A9D   
    0005    00003AA0    0000002C    00003ACC   
    0006    00003ACD    0000002C    00003AF9   
       哇,有6处!老规矩,柿子要挑软的捏,我们先来查看范围最小的0001项。OllyDbg打开原文件,找到0x004031C6处,看看是些什么。怎么回事?不是汇编指令啊!除了0就是几个毫无意义的数据。
004031C6          00                   db 00
……
004031D4       BA          db BA
004031D5       DA          db DA
004031D6       C9          db C9
004031D7       E7          db E7
004031D8       BB          db BB
004031D9       E1          db E1
004031DA       00          db 00
……
       不是汇编指令,那可不可能是字符串呢?我们在命令行里打“dd 004031d4,既显示0x004031d4处的内容,然后将数据窗口的显示方式改为“文本àASCII(32)”,随即左下角小窗口中显示出“黑社会”三个字,而且有三处,如图7所示。原来“BADAC9E7BBE1是这三个汉字的ASCII代码。难道杀毒软件就靠文件中的“黑社会”去识别黑社会?
图7
为了证明我们的想法,我们用32位编辑工具UltraEdit打开原文件,搜索“黑社会”三个字,一共找到了7处。干脆,一不做二不休,我们将7处“黑社会”全部替换为“白晶晶”。 保存一下,再用杀毒软件检测,果然认不出来了!黑社会2.0的特征码就这样被我们搞定了,真是得来全不费工夫啊,竟然是直接用汉字作为特征码!运行一下修改过的文件,挺好使,就是“关于”窗口上的标题从“黑社会”变成“白晶晶”了,呵呵!如图8所示。
 
图8
 
 
 
打造免杀黑器之三:菜鸟来玩免杀远程控制任我行
相信很多菜鸟看到这里一定很头大,因为我们为有一定基础的朋友们考虑,忽略了前面基本的对EXE的脱壳这部分,于是,考虑到广大新手的利益,这里我举一个脱壳+特征码定位+修改+二次加壳+单机调试的完整的、详细的例子给大家,同时配合我光盘上提供的全程录象教学,希望新手们能通过不断的摸索掌握到这个霸道的技术!
前面两个实战中,我们虽然定位出了多处特征码,但只修改其中一处就可以了,这种情况不一定适用于所有的程序。根据笔者经验,特征码可能有主副之分。主特征码被修改,则无论副特征码是否存在,文件均可以逃过追杀;但如果只修改副特征码,而不修改主特征码,则文件始终会被杀毒软件辩认出来,只不过识别出的版本有所差别。所以,我们修改的目标重点是文件中的主要特征码。
       先来看看我们的试验对象:远程控制任我行。它能让你像控制自已的电脑一样控制别人的计算机,这种东东杀毒软件自然是杀它没商量了(如图9所示)。
图9
       呵呵,让我们做一点小动作,来迷惑威力无穷的卡巴斯基大叔吧!
 
1.脱壳
我们的目标是找出并修改远程控制任我行被控制端文件的特征码,可万事开头难,我们必须它进行脱壳。很多人就是因为不会脱壳或者害怕脱壳,还没上路就被打败了。其实脱壳没有你想像中的那么难,跟着我的思路走,你会明白其实它不难的。
先把家伙准备好,查壳工具PEiD,调试工具OllyDbg,输入表修复工具Import REConstructor。先用PEiD打开被控制端文件,显示文件已被ASPack2.12加壳(如图10所示)。
图10
       第二步非常关键,就是在网上查找关于ASPack2.12的资料。在密界活跃着各路脱星(比如我的偶像Fly),各种脱壳的文章和每种壳的资料比比皆是,我们不妨先了解一下对手的特点,再对症下药,说不定还能找到脱壳机。呵呵,资料显示ASPack2.12是一种强度很小的壳,没有对输入表加密,没有Stolen Code,没有Anti功能,总之就是容易脱。这下心里有底了吧,下面开始动手。
       第一种方法是最简单的:用脱壳机。我用的是AspackDie1.41,成功地脱掉了被控制端的壳(如图11所示)。
图11
 
小提示:有的脱壳机脱的过程中要把目标程序运行一遍,所以推荐大家在虚拟机中脱,不然一旦运行,自己的系统就变成被自己控制的“肉鸡”了!
 
       第二种方法:手动脱壳。用OllyDbg打开被加壳程序,弹出“是否自动分析”的窗口时选NO,因为加壳代码花指令成堆,分析也没用。这时我们中断在文件的入口处:
004FE001 R> 60                  pushad
004FE002     E8 03000000         call RUNDLLL.004FE00A
004FE007   - E9 EB045D45         jmp 45ACE4F7
004FE00C     55                  push ebp
004FE00D     C3                  retn
004FE00E     E8 01000000         call RUNDLLL.004FE014
       记住第一条指令“pushad”,ASPack2.12的特点就是离出口处不远会有一条与之相对的“popad”指令,看到它我们就要注意,离出口不远了。如果你愿意,可以一路F7、F8跟踪(最好在虚拟机中调试,不然系统崩溃了可不要怪我没提醒你哦),但是我们已经知道了它的特点,就可以直接把断点下在“popad”处。于是我们向下拉滚动条,发现如下代码:
004FE3AF     61                  popad
004FE3B0     75 08               jnz short RUNDLLL.004FE3BA
004FE3B2     B8 01000000         mov eax,1
004FE3B7     C2 0C00             retn 0C
004FE3BA     68 00000000         push 0
004FE3BF     C3                  retn
       在Popad处双击下断点,然后F9让程序运行,很快程序就停在了断点处,这时倒数第二句已经改变了:
004FE3AF     61                  popad
004FE3B0     75 08               jnz short RUNDLLL.004FE3BA
004FE3B2     B8 01000000         mov eax,1
004FE3B7     C2 0C00             retn 0C
004FE3BA     68 BC4D4A00         push RUNDLLL.004A4DBC
004FE3BF     C3                  retn
       这时按F8单步跟踪,会执行Push,然后是Retn,其实就是跳到刚才Push的地址去。这里是脱壳里常说的Magic Jump(魔法跳),这一跳就是去程序的入口处了。你可能问了,我怎么知道什么样的跳转是Magic Jump呢?呵呵,Magic Jump的距离通常较远(这里是从004FE3BA到004A4DBC),而且入口处的代码通常很有规律,更重要的是:多脱几次壳的经验!跳转后入口处代码如下:
004A4DBC     55                  push ebp
004A4DBD     8BEC                mov ebp,esp
004A4DBF     83C4 F0             add esp,-10
这是各种编程语言的标准入口(不详细说了),我们停在第一句,程序这时已经脱完壳,我们开始Dump。选择“插件àOllyDumpà脱壳当前调试的进程”,然后点“脱壳”(如图12所示),保存为另一个文件。稍等片刻,文件就生成了。
图12
这时还没有完,需要修复输入表。打开RecImport,在进程中选取被控制端文件的进程,在OEP处输入A4DBC(004A4DBC-00400000),然后点“自动搜索IAT”,程序提示“可能发现原始IAT”。再点击“获取输入表”,这是原程序的输入表,因为没有加密,所以可以直接获取。然后程序自动搜索到了输入表信息,点击“显示无效函数”,显示全部指针有效,这时我们就可以用它来修复刚才抓取的文件了(如图所示13)。
图13
 
 
小知识:输入表相当于一扇门,程序通过它调用Windows提供的功能。这里讲得很简单,因为这个壳难度不大,其实输入表修复是脱壳中很复杂的一个过程,留给大家自己修炼吧!
 
到此为止,整个脱壳就算完成了。用PEiD再检测一下,原来是Delphi写的程序。卡巴斯基检查,仍旧报警。下面让我们来定位它的特征码。
 
 
2.自动定位特征码
黑防前几期已经有些文章介绍了定位某个文件的特征码,但那是手动的方法,不仅烦琐而且费时,会耽误大家泡MM的时间,所以我写了个小软件CCL来造福诸位,免得MM们有意见,呵呵!
基本原理简单提一下:如果文件中的特征码被我们填入的0替换掉,则可以躲过杀毒软件。CCL提供了手动和自动两种操作方式,我们就结合起来使用,用手动替换定位大的范围,用自动替换进行精确定位。
 
小提示:由于CCL使用时要求和杀毒软件配合,所以强烈建议大家先详细看看说明再使用,光盘里的CCL是最新版本。
 
首先,关闭杀毒软件的即时监测功能(以下均简称监测)。打开CCL,将参数设为“手动”+“生成规定个数的文件”,然后文件个数设为10,意思是整个文件分成10部分分别替换为0。然后打开修复过的文件,弹出了PE文件段选择窗口,这是让你选择替换范围。因为我们是替换整个文件,所以什么都不选直接确定,进入了操作窗口。注意窗口中显示的信息,确认无误后点击GO。进度条走完后打开我的电脑,进入刚才设定的生成路径,让卡巴斯基大叔查毒。好家伙,10个文件杀了大半,还剩3个。在主窗口中选择“定位”,然后选取目标文件夹,显示出特征码所在位置如下:
        -------------定位结果------------
      序号    起始偏移     大小     结束偏移
    0001    00000000    0001A333    0001A333   
    0002    0004E999    0001A333    00068CCC   
    0003    0009D332    0001A333    000B7665  
第1项我们不考虑,因为“司机”大叔对于PE文件头被替换的文件是不进行检测的(别的杀毒软件可能有所不同),目标初定为2、3两项。下面轮到精确自动定位了。
将参数调整为“自动”,“间隔秒数”设为7秒,“最小字节数”设为16个字节,然后打开待检测文件。这时,我们已经确定了特征码所在的大体范围,不需要对整个文件进行定位,因此,分别在用户输入区输入两个区段,即起始偏移0004E999和0009D332,大小均为1A333,并添加进任务栏里。填充0相当于排除该段干扰,在这里都为否,也就是正常检测(如图14所示)。
图14
这时可以打开监测功能了,因为CCL的“自动功能”是通过判断生成文件是否被杀毒软件删除来决定下一步的操作。打开“我的电脑”并进入目标文件夹,让它保持在前台,然后单击GO开始自动检测。你会发现文件夹中多了两个文件,随即会有一个被“司机”叔删除,因为它含有特征码,没有被删除的自然是特征码被0替换掉了。
注意这里,司机大叔的反应比较迟钝,所以在生成文件时不会自动检测,我们必须在文件图标上单击右键,来刺激大叔一下。别的杀毒软件几乎不需要(如图15所示)。
 
图15
还记得刚才设置的“等待秒数”吗?一定要保证你机上的杀毒软件能在7秒内把含特征码的文件给删除掉,不然结果可是不准的!
大约4分钟以后,自动检测完成,定位节果显示如下:
        -------------定位结果------------
      序号    起始偏移     大小     结束偏移
    0001    0005E6FD    0000001A    0005E717   
    0002    000A4DB0    0000004E    000A4DFE 
呵呵,已经完成一半了,特征码就在这2个段中,下面就是修改了,可2处都要改吗?我们随便修改一处即可,如果还能查出来,再修改另一处。柿子当然挑软的捏,我们找大小较小的第1段进行修改。
 
3.特征码修改
铛铛铛,无敌的OllyDbg再次上场,它可是修改特征码的主力军!打开文件,来到0045E6FD处,让我们看看这里到底有些什么猫腻,代码如下:
0045E700    . /EB 16             jmp short 111_.0045E718
0045E702    .^|E9 5158FAFF       jmp 111_.00403F58
0045E707    . |8B45 FC           mov eax,dword ptr ss:[ebp-4]
0045E70A    . |33D2              xor edx,edx
0045E70C    . |8910              mov dword ptr ds:[eax],edx
0045E70E    . |E8 595BFAFF       call 111_.0040426C
0045E713    . |E8 A85BFAFF       call 111_.004042C0
原来是汇编指令,我们看看什么指令能改。Jmp和Call这种存在跳转的指令最好别碰,就选Mov和Xor那两句吧。还是用上面的两种修改方法:指令顺序变换法和跳转法
顺序变换法很简单,如果两条指令互不干扰,就可以将它们的顺序调换。0045E707和0045E70A正可以使用这种方法(我已试过,调换顺序后司机大叔愣是没查出来)。可更多的情况下是不能调换顺序的,这时就要用跳转法了,意思就是将原指令改为一个Jmp,跳到我们寻找的空隙处,在空隙处补上原指令,执行完以后再跳转回去。修改如下:
0045E702    .^|E9 5158FAFF       jmp 111.00403F58
0045E707    . |E9 14670400       jmp 111.004A4E20
0045E70C    > |8910              mov dword ptr ds:[eax],edx
0045E70E    . |E8 595BFAFF       call 111.0040426C
0045E713    . |E8 A85BFAFF       call 111.004042C0
一个跳转指令需要5字节,而Mov和Xor加起来正好是5 个字节,爽!Jmp 111.004A4E20是我们修改过的指令(111是文件名),其中004A4E20就是我们寻找的空隙。空隙怎么找?呵呵,PE文件的代码段中存在很多空隙,你在OllyDbg的窗口中将滚动条向下拉到底就可以找到,至于存在空隙的原因就留给大家自已补课了。下面是空隙处的代码:
004A4E02    . E8 3D99FBFF       call 111.0045E744
004A4E07    . E8 E8F8F5FF       call 111.004046F4
004A4E0C    . 0000              add byte ptr ds:[eax],al
004A4E0E    . 0000              add byte ptr ds:[eax],al
……
004A4E1E    . 0000              add byte ptr ds:[eax],al
004A4E20    > 8B45 FC           mov eax,dword ptr ss:[ebp-4]
004A4E23    . 33D2              xor edx,edx
004A4E25    .^ E9 E298FBFF       jmp 111.0045E70C
004A4E2A       00                db 00
开始的两句Call就是原文件的最后两句代码了,下面都是00。我们随便挑了一处004A4E20,在这里把刚才的Mov和Xor补上,再加一句跳转回去的Jmp。OK,已经修改完了。在OllyDbg中单击右键,选“复制到可执行文件à全部复制”,然后在弹出的D(dump)窗口中按右键选择“保存”,修改结果就被保存到原文件中了(如图16所示)。
图16
我们再让司机大叔查一下,一向严格把关的司机大叔这次却无话可说了,免杀的目标终于达到了。可是不要高兴得太早,脱壳过的文件怎么这么大呀!原来只有511KB,脱了就变成1.02MB,足足胖了一倍!那我们就来替它减减肥,来个二次加壳。
 
4.二次加壳
用Notepad.exe(记事本)作一下实验可以发现,ASPack加壳过的程序会多出“.aspack”和“.adata”两个段,那是不是二次加壳前先把原脱壳文件中这两个段删除呢?我也是这样想的,可删除了以后文件大小并没有减多少,反而出现了错误,因此我们直接对脱壳文件进行二次加壳。用什么壳?呵呵,以其人之道还治其人之身,就用ASPack2.12。打开文件时提示“已经被ASPack压缩过了”,不管它,我们继续。完成以后大小减了一半,和没脱壳时差不多(如图17所示)。
图17
       好了,完成了大部分工作,可是在传到肉鸡之前,我们先得测试一下能不能用。怎么测试呢?这可是后门程序呀!没关系,我们用虚拟机来进行单机测试。
 
刘流:什么是虚拟机?其实就是虚拟出一套环境,而在里面运行的程序就像是在真实的电脑中运行一样。流行的虚拟机程序有两个,微软的Virtual PCVMware,个人感觉前者资源占用少一点,因此就用VPC吧!VPC了方便的地方是可以硬盘恢复,无论你在里面做了什么,甚至系统崩溃,只要你选择回复过去的硬盘状态,一切都像新的一样。呵呵,这次不用怕脱壳时一不小心程序跑飞了!
 
5.用虚拟机实现单机调试后门程序
在VPC中新建计算机,安装一个系统(我装了Windows2000)。要想让VPC和我们的本机通过网卡互通,关键是IP的设置,要将两者都设为同一工作组(比如默认的WORKGROUP),IP地址设在同一段(我设的为本机26.28.248.100,虚拟机26.28.248.99)。相信各位大多数是在家上网吧?ADSL的猫自然人手一个(HUB也行),打开ADSL猫的电源(不用连上Iinter网),这时你会发现虚拟机里的2000已经显示接通网络了。我们在本机Ping一下,结果显示本机和虚拟机的网络已经连通,搞定!如图18所示。

Ping正常
虚拟机的
网络已接通

图18
我们把压缩过的文件传到虚拟机里去,可以通过网络邻居共享或者菜单里设置共享文件夹,然后运行。只是一闪,被控制端文件就从桌面消失了。在本机运行控制端,连接26.28.248.99,显示连接成功。呵呵,我们来试试查看远程电脑的屏幕。点击后,屏幕中出现了虚拟机的屏幕!如图19所示。
 
图19
我没有继续试验别的功能了,因为本本的CPU忙不过来,如果你的机子够劲,你可以在虚拟机里装WindowsXP+SP2,再测试一下远程操作的功能!
 
结语
用CCL定位特征码时,手动替换和自动替换应该互补使用,没有一个方法是全能的。通常为用手动确定大范围,用自动精确定位小范围。定位成功后,看特征码的类型。如果是汇编指令,用“指令顺序调换法”或“万能跳转法”进行修改;如果是字符串等,在不影响原程序运行的情况下,替换掉既可。
操作方法也很重要,操作过程中注意和杀毒软件的配合,多试几次,掌握不同杀毒软件的特点,合理设置等待时间和最小定位精度等参数。更重要的是,确保自动检测过程中,杀毒软件对生成文件进行了检测,适当加上点“刺激”(比如我的鼠标右键刺激大法)。
说了这么多,再菜的鸟儿也知道怎么飞了吧?提醒你一句,各个杀毒软件的特征码定义是不同的,最好每一种都装上检测一下。什么?太危险?没让你在自已机上装啊,我有虚拟机我怕谁呀!
行文仓促,如有BUG或建议,请在http://tankaiha.nease.net留言告之。
(文中涉及到的程序和全程录象已经收录在杂志配套光盘“杂志相关”栏目,按文章名查找即可)
所属分类: 黑客工具免杀     网摘收藏: Google 雅虎 百度 POCO 365key 和讯 天极