【3.A.S.T】网络安全爱好者's Archiver

黑客学习

柔肠寸断 发表于 2009-5-13 18:31

修改特征码打造免杀后门之WinShell篇

[align=center][align=center][size=3][b][font=宋体]修改特征码打造免杀后门之[/font][font=Times New Roman]WinShell[/font][/b][b][font=宋体]篇[/font][/b][/size][/align][/align][align=center][align=center][size=3][b][font=宋体]文[/font][font=Times New Roman]/[/font][/b][b][font=宋体]图[/font][font=Times New Roman] [/font][/b][font=Times New Roman]Tankaiha[NE365][FCG][b][/b][/font][/size][/align][/align][size=3][font=Times New Roman]       [/font][font=宋体]各位读者,新年好,又和大家见面了。上一期给大家介绍了使用特征码******和反汇编程序打造免杀的后门,大家感觉如何?这次给大家介绍另外一种修改方法。对于大多数没有源代码的程序来说,只能使用反汇编工具进行逆向工程,可如果你搞到了它的源代码,道路会宽广得多:在源代码级别修改再编译出的黑器,不仅没有特征码,而且运行也会非常稳定的![/font][/size]
[size=3][font=宋体]源代码级别的特征码修改有以下几个主要步骤:程序的特征码定位、特征码在源代码中的定位、源代码的修改。由于编程语言的多样性,特征码在源代码中的表现也不一样:汇编语言属于所见即所得的类型,特征码什么样儿,源代码中的指令就是什么样;而对于高级语言([/font][font=Times New Roman]C[/font][font=宋体]或[/font][font=Times New Roman]Delphi[/font][font=宋体]等)生成的文件,想找到特征码对应的语句还得花点功夫。这次我们就以[/font][font=Times New Roman]C[/font][font=宋体]语言编写的小型后门[/font][font=Times New Roman]WinShell5.0[/font][font=宋体]为例讲讲修改方法,抛砖引玉。[/font][/size]
[b][font=Times New Roman][size=3] [/size][/font][/b]
[b][size=3][font=宋体]特征码的定位[/font][/size][/b]
[size=3][font=宋体]这一步必须在样本的基础上进行,所以先将[/font][font=Times New Roman]WinShell[/font][font=宋体]的源代码在[/font][font=Times New Roman]VC6[/font][font=宋体]中编译成可执行文件。先用“司机”来检测一下,显示发现[/font][font=Times New Roman]Backdoor.Win32.WinShell.50[/font][font=宋体],如图[/font][font=Times New Roman]1[/font][font=宋体]所示。[/font][/size]

[size=3][/size]
[size=3][font=宋体][img]http://www.hacker.com.cn/upload/article/20090401092320u.jpg[/img][/font][/size]
[size=3][font=宋体]图[/font][font=Times New Roman]1[/font][/size]
[font=Times New Roman][size=3] [/size][/font]
[size=3][font=宋体]由于[/font][font=Times New Roman]2005[/font][font=宋体]年第[/font][font=Times New Roman]1[/font][font=宋体]期黑防已经说细地讲过了使用[/font][font=Times New Roman]CCL[/font][font=宋体]进行特征码定位的过程,所以这里不再详细叙述,简单讲一下过程:打开[/font][font=Times New Roman]CCL[/font][font=宋体],设为手动定位,生成[/font][font=Times New Roman]30[/font][font=宋体]个文件,然后打开[/font][font=Times New Roman]WinShell.exe[/font][font=宋体],发现文件有[/font][font=Times New Roman]3[/font][font=宋体]个段,我们选择[/font][font=Times New Roman].text[/font][font=宋体]即代码段,点击生成后用卡巴斯基查杀目标文件夹,剩下没有被删除的[/font][font=Times New Roman]3[/font][font=宋体]个文件,即特征码范围如下:[/font][/size]
[size=3][font=Times New Roman]
[color=blue]-------------[/color][/font][color=blue][font=宋体]定位结果[/font][/color][color=blue][font=Times New Roman]------------[/font][/color][/size]
[size=3][color=blue][font=Times New Roman]      [/font][/color][color=blue][font=宋体]序号[/font][/color][color=blue][font=Times New Roman]    [/font][/color][color=blue][font=宋体]起始偏移[/font][/color][color=blue][font=Times New Roman]     [/font][/color][color=blue][font=宋体]大小[/font][/color][color=blue][font=Times New Roman]     [/font][/color][color=blue][font=宋体]结束偏移[/font][/color][color=blue][/color][/size]
[color=blue][size=3][font=Times New Roman]
0001
000017D0
000002AA
00001A7A
[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
0002
00001FA0
000002AA
0000224A
[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
0003
00002770
000002AA
00002A1A
[/font][/size][/color]
[size=3][font=宋体]手动检测只是定位大致范围,下面用自动功能来精确定位。重新设置[/font][font=Times New Roman]CCL[/font][font=宋体]为自动检测,等待时间设置为[/font][font=Times New Roman]7[/font][font=宋体]秒(我的机器比较慢)。范围我们就选择序号[/font][font=Times New Roman]0001[/font][font=宋体],起始偏移[/font][font=Times New Roman]17D0[/font][font=宋体],大小[/font][font=Times New Roman]2AA[/font][font=宋体]个字节的区段。自动定位结果如下:[/font][/size]
[size=3][font=Times New Roman]
[color=blue]-------------[/color][/font][color=blue][font=宋体]定位结果[/font][/color][color=blue][font=Times New Roman]------------[/font][/color][/size]
[size=3][color=blue][font=Times New Roman]      [/font][/color][color=blue][font=宋体]序号[/font][/color][color=blue][font=Times New Roman]    [/font][/color][color=blue][font=宋体]起始偏移[/font][/color][color=blue][font=Times New Roman]     [/font][/color][color=blue][font=宋体]大小[/font][/color][color=blue][font=Times New Roman]     [/font][/color][color=blue][font=宋体]结束偏移[/font][/color][color=blue][/color][/size]
[color=blue][size=3][font=Times New Roman]
0001
0000180F

0000000A
00001819[/font][/size][/color]
[size=3][font=宋体]只有一个地址,而且大小才[/font][font=Times New Roman]0A[/font][font=宋体]个字节,天助我也。下面就是寻找它在源代码中的位置了([/font][font=Times New Roman]CCL[/font][font=宋体]在我的主页上提供最新版,修正了一些[/font][font=Times New Roman]BUG[/font][font=宋体],欢迎指点)。[/font][/size]
[b][font=Times New Roman][size=3] [/size][/font][/b]
[b][size=3][font=宋体]特征码在源代码中的定位[/font][/size][/b]
[size=3][font=宋体]这里还是先请出反汇编界的老大[/font][font=Times New Roman]IDA[/font][font=宋体],在[/font][font=Times New Roman]IDA[/font][font=宋体]中打开[/font][font=Times New Roman]WinShell.exe[/font][font=宋体],来看看[/font][font=Times New Roman]180F[/font][font=宋体]处到底是什么:[/font][color=blue][/color][/size]
[color=blue][size=3][font=Times New Roman].text:00401809
movsx
eax, [esp+270h+var_204][/font][/size][/color]
[color=blue][size=3][font=Times New Roman].text:0040180E
add
eax, 0FFFFFFC1h[/font][/size][/color]
[color=blue][size=3][font=Times New Roman].text:00401811
cmp
eax, 39h[/font][/size][/color]
[color=blue][size=3][font=Times New Roman].text:00401814
ja
loc_401976[/font][/size][/color]
[color=blue][size=3][font=Times New Roman].text:0040181A
xor
ecx, ecx[/font][/size][/color]
[color=blue][size=3][font=Times New Roman].text:0040181C
mov
cl, ds:byte_401A0C[eax][/font][/size][/color]
[color=blue][size=3][font=Times New Roman].text:00401822

jmp
ds:off_4019E4[ecx*4][/font][/size][/color]
[size=3][font=宋体]哇!已经面目全非了,这让人怎么找对应的源代码啊?如果你熟悉[/font][font=Times New Roman]VC[/font][font=宋体]编译程序的特点,很快会发现这里是一个[/font][font=Times New Roman]Switch/case[/font][font=宋体]结构。可我们是菜鸟啊,怎么可能看得出来?这里给大家说个小技巧:尽量在上下文中寻找明显的提示。就好比我们经常寻找某个地点时,都是先找出周围的标志性建筑一样。[/font][/size]
[size=3][font=宋体]我们在[/font][font=Times New Roman]IDA[/font][font=宋体]中从[/font][font=Times New Roman].text:00401809[/font][font=宋体]这一句向上看,发现隔了没多少行有这几条指令:[/font][/size]
[color=blue][size=3][font=Times New Roman].text:004017B8
push
offset aHttp
; char *[/font][/size][/color]
[color=blue][size=3][font=Times New Roman].text:004017BD
push
ecx
; char *[/font][/size][/color]
[color=blue][size=3][font=Times New Roman].text:004017BE
call
_strstr[/font][/size][/color]
[size=3][font=宋体]这是调用[/font][font=Times New Roman]Strstr[/font][font=宋体]函数,将鼠标移到“[/font][font=Times New Roman]aHttp[/font][font=宋体]”上,会弹出提示窗口显示:[/font][/size]
[color=blue][size=3][font=Times New Roman]char aHttp[][/font][/size][/color]
[size=3][color=blue][font=Times New Roman]aHttp
db
‘http://’,0
;
DATA XREF:StartAddress + 1C8 [/font][/color][color=blue][font=宋体]↑[/font][/color][color=blue][font=Times New Roman]o[/font][/color][/size]
[size=3][font=宋体]这行提示信息的告诉了我们[/font][font=Times New Roman]Strstr[/font][font=宋体]的第二个参数[/font][font=Times New Roman]aHttp[/font][font=宋体]指向了字符串“[/font][font=Times New Roman]http://[/font][font=宋体]”。这行调用算是挺特别的,而且离特征码不远,就用它作为标志吧。打开[/font][font=Times New Roman]WinShell[/font][font=宋体]的源代码,搜索“[/font][font=Times New Roman]http://[/font][font=宋体]”,果然找到了调用它的语句:[/font][/size]
[size=3][font=Times New Roman]
[color=blue]if(strstr(cmd,"http://")) {[/color][/font][/size]
[color=blue][size=3][font=Times New Roman]
send(wsh,msg_ws_down,strlen(msg_ws_down),0);[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
if(DownloadFile(cmd,wsh))[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
send(wsh,msg_ws_err,strlen(msg_ws_err),0);[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
else[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
send(wsh,msg_ws_ok,strlen(msg_ws_ok),0);[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
}[/font][/size][/color]
[size=3][font=宋体]该句后面的代码经过三次调用[/font][font=Times New Roman]Send[/font][font=宋体],紧接着就是一个[/font][font=Times New Roman]Switch/case[/font][font=宋体]结构:[/font][/size]
[size=3][font=Times New Roman]

[color=blue]
switch(cmd[0]) {[/color][/font][/size]
[color=blue][size=3][font=Times New Roman]
// help[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
case '?': {[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]



send(wsh,msg_ws_cmd,strlen(msg_ws_cmd),0);[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
break;[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
}[/font][/size][/color]
[font=Times New Roman][size=3] [/size][/font]
[size=3][font=宋体]初步断定这就是我们的目标。如果你想更确定的话,可以在源代码中[/font][font=Times New Roman]Switch[/font][font=宋体]前插入几条特殊的汇编指令,编译后再定位,看看那几句汇编指令是不是出现在了[/font][font=Times New Roman]00401809[/font][font=宋体]的指令之前。如果是,说明我们判断是正确的,特征码就是这条[/font][font=Times New Roman]Switch[/font][font=宋体]语句。呵呵,还觉得麻烦?好吧,还有个简便的方法:用[/font][font=Times New Roman]Ollydbg[/font][font=宋体]打开[/font][font=Times New Roman]WinShell.exe[/font][font=宋体],会直接分析出这里是选择[/font][font=Times New Roman]/[/font][font=宋体]分支结构。如图[/font][font=Times New Roman]2[/font][font=宋体]所示。[/font][/size]
[font=Times New Roman][size=3] [/size][/font]
[font=Times New Roman][size=3][/size][/font][table=98%][tr][td][size=3][font=Times New Roman]Ollydbg[/font][font=宋体]已经自动判断出来了[/font][/size]

[/td][/tr][/table][size=3][/size]




[img]http://www.hacker.com.cn/upload/article/20090401092416u.jpg[/img]
[size=3][font=宋体]图[/font][font=Times New Roman]2[/font][/size]
[size=3][font=Times New Roman]       [/font][font=宋体]括号里的[/font][font=Times New Roman](cases 3F .. 78)[/font][font=宋体]表示了该选择[/font][font=Times New Roman]/[/font][font=宋体]分支结构的具体数据。第一个[/font][font=Times New Roman]3F[/font][font=宋体]是“[/font][font=Times New Roman]?[/font][font=宋体]”的[/font][font=Times New Roman]ASC[/font][font=宋体]码,这不正对应源代码中的第一句“[/font][font=Times New Roman]case ‘?’ [/font][font=宋体]”吗![/font][/size]
[font=Times New Roman][size=3] [/size][/font]
[b][size=3][font=宋体]源程序的修改[/font][/size][/b]
[size=3][font=宋体]位置已经确定,剩下的就是修改源代码了。可我们是菜鸟啊,哪里会编程呢?更不用说修改那么复杂的后门了。其实不用担心,我们需要做的只是将原程序的特征码改变,而并不需要多么高升的编程功底,这种改变有时只需要一个字节就够了。看看我是怎么做的。在源代码中的[/font][font=Times New Roman]Switch[/font][font=宋体]前加上一句最最简单的汇编指令[/font][font=Times New Roman]NOP[/font][font=宋体]。源代码变成:[/font][/size]
[color=blue][font=Times New Roman][size=3]
_asm nop;
//[/size][/font][/color][size=3][color=blue][font=宋体]这里是我们添加的[/font][/color][color=blue][/color][/size]
[color=blue][size=3][font=Times New Roman]


switch(cmd[0]) {[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
// help[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
case '?': {[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]



send(wsh,msg_ws_cmd,strlen(msg_ws_cmd),0);[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
break;[/font][/size][/color]
[color=blue][size=3][font=Times New Roman]
}[/font][/size][/color]
[size=3][font=宋体]再用[/font][font=Times New Roman]VC6[/font][font=宋体]编译源代码,用卡巴斯基检查[/font][font=Times New Roman]WinShell.exe[/font][font=宋体]。呵呵,奇迹发生了,司机大叔不再报警了!一个免杀的[/font][font=Times New Roman]WinShell[/font][font=宋体]只用了几分钟就在我们的手中诞生![/font][/size]
[size=3][font=宋体]当然,你也可以将[/font][font=Times New Roman]NOP[/font][font=宋体]插在别的地方,比如[/font][font=Times New Roman]Send[/font][font=宋体]和[/font][font=Times New Roman]Break[/font][font=宋体]之间,也可以不选择[/font][font=Times New Roman]NOP[/font][font=宋体]而替换为别的汇编指令,原则就是一个:不能改变原程序的关键寄存器值和执行顺序。[/font][/size]
[b][font=Times New Roman][size=3] [/size][/font][/b]
[size=3]
[/size]
[font=宋体][size=3][/size][/font]
[font=Times New Roman][size=3] [/size][/font]

冷酷鲨鱼 发表于 2010-4-17 21:00

谢谢了。{:Yem60:Y}学习了。

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.