CCL打造杀毒软件免杀的超级黑器
最近一段时间,网络上的很多攻击事件在大范围的扩散,很多服务器被入侵、控制,各种极品后门、安全被安装在了这些倒霉的服务器上。很多热心的读者朋友们提出了疑问:“为什么安全用的是和我们同样的工具,那些服务器上的强大杀毒软件就没有反映呢?”,其实很容易。杀毒软件检测安全、后门等黑器时,最传统也是最有效的方法之一是特征码比较,也就是找到病毒(恶意程序)库里的各软件的特征码,一旦确定是符合的,就归咎为安全、后门,而且越是名气大的黑器越是被追杀的体无完肤,找不到特征码自然就不认为是后门、安全了。有时候在入侵时,好不易突破了对方防火墙的堵截,想传个心爱的后门过去,可立足未稳就已经被对方的杀毒软件枪毙了。于是如何打造自己的不被各种杀毒软件查杀的安全工具就成为先如今最热门的话题。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,3900401814 0F87 5C01000> ja win.004019760040181A 33C9 xor ecx,ecx0040181C 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.00405D2000401813 |90 nop00401814 |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,-3F00405D23 83F8 39 cmp eax,3900405D26 ^ E9 E8BAFFFF jmp WinShell.00401813 修改完毕,我们保存一下先。在OllyDbg窗口中单击右键选择“复制到可执行文件—>全部保存”,然后保存到WinShell.exe中。OK,在菜单中选择“重新运行”,回到0040180E处,确定刚才的修改已经保存了。关闭OllyDbg,找到WinShell.exe,用杀毒软件进行扫描。嘿嘿,卡巴斯基已经认不出它来了!如图5所示,收功!

图5 你也许会问,不管什么杀毒软件都是这样修改吗?答案是:NO。各个杀毒软件对特征码的定义是不一样的,唯一的方法就是分别对每个平台进行检测,再有针对性的修改。修改方法一样:指令顺序调换法和通用跳转法!对了,还有一点:尽量在代码段中找空,但有时候代码段中的空隙实在是不够,就把跳转的代码写在别的段中。由于这些段的默认属性里没有“可执行”这一项,你把代码移过去执行自然会报错,这时用PE修改工具将段属性加上可执行就可以了。
#e# 打造免杀黑器之二:手动与自动结合定位黑社会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 BA004031D5 DA db DA004031D6 C9 db C9004031D7 E7 db E7004031D8 BB db BB004031D9 E1 db E1004031DA 00 db 00…… 不是汇编指令,那可不可能是字符串呢?我们在命令行里打“dd 004031d4”,既显示0x004031d4处的内容,然后将数据窗口的显示方式改为“文本àASCII(32)”,随即左下角小窗口中显示出“黑社会”三个字,而且有三处,如图7所示。原来“BADAC9E7BBE1”是这三个汉字的ASCII代码。难道杀毒软件就靠文件中的“黑社会”去识别黑社会?

图7为了证明我们的想法,我们用32位编辑工具UltraEdit打开原文件,搜索“黑社会”三个字,一共找到了7处。干脆,一不做二不休,我们将7处“黑社会”全部替换为“白晶晶”。 保存一下,再用杀毒软件检测,果然认不出来了!黑社会2.0的特征码就这样被我们搞定了,真是得来全不费工夫啊,竟然是直接用汉字作为特征码!运行一下修改过的文件,挺好使,就是“关于”窗口上的标题从“黑社会”变成“白晶晶”了,呵呵!如图8所示。

图8打造免杀黑器之三:菜鸟来玩免杀远程控制任我行相信很多菜鸟看到这里一定很头大,因为我们为有一定基础的朋友们考虑,忽略了前面基本的对EXE的脱壳这部分,于是,考虑到广大新手的利益,这里我举一个脱壳+特征码定位+修改+二次加壳+单机调试的完整的、详细的例子给大家,同时配合我光盘上提供的全程录象教学,希望新手们能通过不断的摸索掌握到这个霸道的技术!前面两个实战中,我们虽然定位出了多处特征码,但只修改其中一处就可以了,这种情况不一定适用于所有的程序。根据笔者经验,特征码可能有主副之分。主特征码被修改,则无论副特征码是否存在,文件均可以逃过追杀;但如果只修改副特征码,而不修改主特征码,则文件始终会被杀毒软件辩认出来,只不过识别出的版本有所差别。所以,我们修改的目标重点是文件中的主要特征码。 先来看看我们的试验对象:远程控制任我行。它能让你像控制自已的电脑一样控制别人的计算机,这种东东杀毒软件自然是杀它没商量了(如图9所示)。

图9 呵呵,让我们做一点小动作,来迷惑威力无穷的卡巴斯基大叔吧!
#e# 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 pushad004FE002 E8 03000000 call RUNDLLL.004FE00A004FE007 - E9 EB045D45 jmp 45ACE4F7004FE00C 55 push ebp004FE00D C3 retn004FE00E E8 01000000 call RUNDLLL.004FE014 记住第一条指令“pushad”,ASPack2.12的特点就是离出口处不远会有一条与之相对的“popad”指令,看到它我们就要注意,离出口不远了。如果你愿意,可以一路F7、F8跟踪(最好在虚拟机中调试,不然系统崩溃了可不要怪我没提醒你哦),但是我们已经知道了它的特点,就可以直接把断点下在“popad”处。于是我们向下拉滚动条,发现如下代码:004FE3AF 61 popad004FE3B0 75 08 jnz short RUNDLLL.004FE3BA004FE3B2 B8 01000000 mov eax,1004FE3B7 C2 0C00 retn 0C004FE3BA 68 00000000 push 0004FE3BF C3 retn 在Popad处双击下断点,然后F9让程序运行,很快程序就停在了断点处,这时倒数第二句已经改变了:004FE3AF 61 popad004FE3B0 75 08 jnz short RUNDLLL.004FE3BA004FE3B2 B8 01000000 mov eax,1004FE3B7 C2 0C00 retn 0C004FE3BA 68 BC4D4A00 push RUNDLLL.004A4DBC004FE3BF C3 retn 这时按F8单步跟踪,会执行Push,然后是Retn,其实就是跳到刚才Push的地址去。这里是脱壳里常说的Magic Jump(魔法跳),这一跳就是去程序的入口处了。你可能问了,我怎么知道什么样的跳转是Magic Jump呢?呵呵,Magic Jump的距离通常较远(这里是从004FE3BA到004A4DBC),而且入口处的代码通常很有规律,更重要的是:多脱几次壳的经验!跳转后入口处代码如下:004A4DBC 55 push ebp004A4DBD 8BEC mov ebp,esp004A4DBF 83C4 F0 add esp,-10这是各种编程语言的标准入口(不详细说了),我们停在第一句,程序这时已经脱完壳,我们开始Dump。选择“插件àOllyDumpà脱壳当前调试的进程”,然后点“脱壳”(如图12所示),保存为另一个文件。稍等片刻,文件就生成了。
- 最新评论
