网络神偷不愧是一个专业级的远程文件访问工具,其操作简单,功能“专而精”,但诚如作者所言“一直以来,我们都秉承着免费的精神,为大家提供各种软件,但唯一不足的是目前很多杀毒软件都对网络神偷进行追杀,被冠以病毒之名!”,既然这样我也只好自己动手丰衣足食,做个免杀版本的网络神偷,也免的麻烦蔬菜大哥劳神给我做个人版软件啦,呵呵^*^[但愿作者不会见怪]
废话少说,从作者主页http://www.greenstuffsoft.net下载到“网络神偷 5.8 版”,看了下“Server.bud”(这个就是服务端,作者改了扩展名而已),发现修改日期是2003年10月3日,看来作者认为服务端做的已经比较成熟,好久都没更新服务端程序啦噢!
脱UPX壳
用WinHex打开“Server.bud”[个人习惯,喜欢先用WinHex查看一下!],发现文件偏移000003DBh处的“1.08 UPX!”字样,还好作者没把紧接着版本后面的“0C 09 02 09”4个字节之后的24个字节修改掉,不然,如果不知道其正确的数值脱壳起来还真有点麻烦。首先我们把块名恢复,即把文件偏移000001F8h处的“text”改为“UPX0”,00000220h处的“data”改为“UPX1”,然后直接用“UPX -d Server.bud”命令脱壳[新手使用LoadPE修改块名更容易点],脱壳后文件大小为56KB。
去除校验
运行网络神偷客户端使用脱壳后的“Server.bud”生成服务端后,运行服务端并进行初步测试,奇怪?程序并没显示运行错误,但在任务管理器的进程列表里却没出现新的进程,系统目录下也没有看到产生新的文件,看来事情并没有想象中的如此简单,联想到自己刚才在“Server.bud”文件最后看到了多出来的16个未知作用的字节“19A4F940378B8F7EAA15D260BC2FE64B”,可能是文件的校验值(因为好象16位的MD5值哦!),看来作者大概在服务端程序中加入了一段文件的校验代码,使用Ollydbg打开生成后的服务端,跟踪运行分析后在00407828h处发现如下代码[我比较笨,对于MFC代码调用不了解,用了N久才找到~V~]:
00407828 B9 10000000 MOV ECX, 10 ;16个字节^*^0040782D 8D7424 58 LEA ESI, DWord PTR SS:[ESP+58]00407831 8D7D 38 LEA EDI, DWORD PTR SS:[EBP+38]00407834 33C0 XOR EAX, EAX00407836 F3:A6 REPE CMPS BYTE PTR ES:[EDI], BYTE PTR DS:[ESI];逐字节比较00407838 74 05 JE SHORT 网络神偷.0040783F;关键跳转语句1,改此处代码跳转到00407847h处也可以达到暴破的效果0040783A 1BC0 SBB EAX, EAX0040783C 83D8 FF SBB EAX, -10040783F 85C0 TEST EAX, EAX00407841 0F85 E4060000 JNZ 网络神偷.00407F2B ;关键跳转语句2,nop掉!00407847 8B7424 38 MOV ESI, DWORD PTR SS:[ESP+38]………………00407ECD 6A 00 PUSH 0 ;FailIfExists = FALSE00407ECF 50 PUSH EAX ;NewFileName00407ED0 51 PUSH ECX ;ExistingFileName00407ED1 FF15 74A04000 CALL DWORD PTR DS:[<&KERNEL32.CopyFileA>];CopyFileA00407ED7 8D4C24 2C LEA ECX, DWORD PTR SS:[ESP+2C]00407EDB E8 6C070000 CALL <JMP.&MFC42.#800>00407EE0 8D4C24 30 LEA ECX, DWORD PTR SS:[ESP+30]00407EE4 C68424 0403000 MOV BYTE PTR SS:[ESP+304], 600407EEC E8 5B070000 CALL <JMP.&MFC42.#800>00407EF1 8B5424 18 MOV EDX, DWORD PTR SS:[ESP+18]00407EF5 8B4424 3C MOV EAX, DWORD PTR SS:[ESP+3C]00407EF9 6A 01 PUSH 1 ;IsShown = 100407EFB 52 PUSH EDX ;DefDir00407EFC 6A 00 PUSH 0 ;Parameters = NULL00407EFE 50 PUSH EAX ;FileName00407EFF 6A 00 PUSH 0 ;Operation = NULL00407F01 6A 00 PUSH 0 ;hWnd = NULL00407F03 FF15 54A34000 CALL DWORD PTR DS:[<&SHELL32.ShellExecuteA>];ShellExecuteA00407F09 8D4C24 3C LEA ECX, DWORD PTR SS:[ESP+3C]00407F0D C68424 0403000 MOV BYTE PTR SS:[ESP+304], 500407F15 E8 32070000 CALL <JMP.&MFC42.#800>00407F1A 8D4C24 44 LEA ECX, DWORD PTR SS:[ESP+44]00407F1E C68424 0403000 MOV BYTE PTR SS:[ESP+304], 400407F26 E8 21070000 CALL <JMP.&MFC42.#800>;如果从00407841h处直接跳到此处就没戏啦噢,坚决反对,呵呵00407F2B 8D8C24 8800000 LEA ECX, DWORD PTR SS:[ESP+88]00407F32 C68424 0403000 MOV BYTE PTR SS:[ESP+304], 300407F3A E8 01E6FFFF CALL 网络神偷.00406540
[1] [2] [3] [4]
从上面代码可以看到如果在00407841h处跳转的话就会跳过CopyFileA[文件拷贝]和ShellExecuteA[运行程序]的API调用,从而导致服务端不复制自身到系统目录并运行,我把文件偏移7841h处的代码nop掉,即把“0F 85 E4 06 00 00”改为“90 90 90 90 90 90”,保存后运行测试成功!看来就这一处校验,庆幸中!
后来,我仔细分析了一下反汇编后的代码,发现服务端文件最后的那16个字节是文件的MD5值用“L*A}t~k”进行简单加密后的值,可以利用它的服务端来反向得到正确的值,不用暴破也可,方法如下: 首先用MD5软件得到删除最后多余16个字节后的“Server.bud”的MD5值,然后把得到的MD5值重新添加到“Server.bud”的结尾后,生成服务端,再用Ollydbg调试服务端,下断点在00407838h处,中断后用WinHex打开内存RAM中的服务端进程,在内存偏移00852758h处就是我们需要的加密后的md5值,用这个16位的md5值替换掉“Server.bud”的最后16字节则可以生成能正常运行的服务端,不好意思有点麻烦,有兴趣的读者可以自己写个校验值生成器^*^
获取特征码
到现在总算完整的把服务端的壳脱掉啦,即把服务端“Server.bud”脱壳后,用WinHex把“Server.bud”文件偏移7841h处的“0F 85 E4 06 00 00”改为“90 90 90 90 90 90”,得到暴破后的可以任意修改的“Server.bud”文件备用,接下来后面的特征码修改就是修改的这个文件。
我们开始进入正题获取网络神偷服务端的特征码,首先把各种各样的杀毒软件准备好,今天我主要准备了下面四种:瑞星杀毒软件2004版、金山毒霸6、江民KV2004、Symantec诺顿8.1企业版,把杀毒软件全部安装好,当然可能会有的软件相互之间提示冲突,不过反正仅仅为测试而用,还好安装完后都可以正常使用,把各种杀毒软件都关闭,不然还没修改就被OVER啦,并都设置为检查文件时发现病毒直接删除,为下面的特征码获取做好准备。[浪子天真的想:要是每个杀毒软件的特征码都一样该多好呀,你打我头干吗呀?]
因为杀毒软件为了保护自身利益及防止特征码被别的杀毒软件误报警,均对特征码进行了加密保护,要直接获取它们的特征码库比较困难[瑞星可以在内存中直接获取特征码库],今天我为大家带来的是一种比较低级的特征码获取方法:“逐字节替换法搜索特征码”,就是把要获取特征码的木马服务端或病毒[本人不推荐你改病毒来玩,小心被警察叔叔抓]程序从头到尾逐个字节的修改替换为00h或ffh(当然你用其他值替换也行)后,每替换一个字节保存为一个文件,替换下一字节时记得把上一字节的修改还原,生成后的文件保存为四份,使用每个杀毒软件对其进行杀毒,最后在每份中留下的没被删除的就是被修改了特征码的,把剩余的文件被修改的字节汇总起来,就得到了每个杀毒软件对这个木马或病毒所定义的“特征码”。
获取特征码的原理就是这样,相信也有不少人知道这个方法的,下面我主要说一下这个方法实际操作中需要注意的地方:
第一点:替换字节要从代码段开始替换,而不要从文件头开始替换,因为一般来说文件头中不会出现特征码,且即使特征码在文件头中,也不如代码段中的修改来的简单;代码段的开始偏移可以从文件开头偏移3Ch-3Fh处的四个字节中获取,如脱壳后的网络神偷服务端3Ch-3Fh的值为:00010000,因为保存时低字节在前高字节在后,翻过来就是:00001000,即代码段在文件中的偏移是00001000h;
第二点:有人反映说逐字节替换生成的文件太多,占用空间太大,而且杀起来慢的要死,确实这样,如果真的按照原理来生成文件,光一个大小仅为57,360 字节的网络神偷就需要57360*57360即3G左右的空间,57360个文件,这还仅仅是一份而已,像我的硬盘仅仅只有4G左右的空间,不就要死翘翘啦?其实不然,我们可以完全变通一下,采用分段法逐步缩小特征码所处的范围,也就是说开始先不要“逐个字节进行替换”,而是分成几个大段进行替换,比如可以以1000h(4K)为单位进行替换,把每1000h大小内的所有字节全改为FFh后生成一个文件,进行查杀,查杀后留下的文件让我们知道了特征码的范围,在以50h字节大小为单位对特征码所在范围(4K大小),进行替换并查杀,最后对50h范围的再使用逐字节替换找到准确的特征码,这样每次仅仅需要几M大小的空间就足够,且速度很快!
第三点:特征码通常会位于程序的入口点“Program Entry Point”下面的一段代码内,如网络神偷服务端脱壳后的入口点为00408A0Ah,位于文件偏移8A0Ah处;
第四点:手工进行替换会累死你的,你可别学我这个傻帽呀[我曾用了整一天的时间使用WinHex替换来获取特征码]!写个软件吧,不应该算是太难的吧!但你要若真要学我我也真的无话可说^*^
把修改后的服务端“Server.bud”使用上面所讲的方法进行分解,最后得到的各杀毒软件对于网络神偷的特征码定义如下:
瑞星杀毒软件2004版 这个软件的我还真没找到它对网络神偷定义的特征码,你用它检查一下脱壳后的服务端,没反应噢,难道他们不会脱壳?呵呵玩笑,大概因为网络神偷服务端不算太隐蔽,所以才没赶尽杀绝,要是大家都这样就好啦,多省劲呀):
[1] [2] [3] [4]
金山毒霸6特征码为:1、文件偏移8A12h至8A22h的:400068968B400064A10000000050648925 2、文件偏移C1A0h至C1C2h的:20474F544F204552524F520D0A64656C204E6574686965665F5365727665722E626174 既[ GOTO ERROR del Nethief_Server.bat] 第2段特征码好象不是必须的特征码,因为逐字节替换第二段会全被杀掉,但如果把第2段全部换掉却不被杀,纳闷中
江民KV2004 江民KV2004的特征码分段最多,也最大,这样做相信它的病毒误报警几率应该要小点,特征码范围如下:
文件偏移1A39h至1A78h、8A0Ah至8A31h、8B32h至8B33h、8B38h至8B3Fh、8B41h至8B43h、8BA2h至8BB2h及8BB7h
Symantec诺顿8.1企业版 文件偏移C20Ch至C228h处的4B45524E454C3332000000004E6574686965665F536572766572202D20即:“KERNEL32 Nethief_Server - ”为特征码,唯一的一个特征码不在代码段的,测试时好象诺顿的特征码经常不在代码段中噢,并且经常是字母!
修改特征码
上面忙活了半天,就为这点“修改特征码躲避杀毒软件”服务的,终于快看到成果啦!瑞星的没啥好说的,诺顿的特征码竟然是不在代码段内的字母,想来改变一下字母的大小写应该不会出错吧,把文件偏移C20Ch至C211h的“4B45524E454C”[KERNEL]改为“6B65726E656C”[kernel]后运行正常,并成功躲过诺顿;比较一下金山毒霸和江民KV2004的特征码,我们发现其中8A12h至8A22h的特征码二者重合,看来修改这段代码即可同时躲过这两种杀毒软件,其反汇编代码如下:
//******************** Program Entry Point ********:00408A0A 55 push ebp:00408A0B 8BEC mov ebp, esp:00408A0D 6AFF push FFFFFFFF:00408A0F 6848A64000 push 0040A648:00408A14 68968B4000 push 00408B96:00408A19 64A100000000 mov eax, dword ptr fs:[00000000]:00408A1F 50 push eax:00408A20 64892500000000 mov dword ptr fs:[00000000], esp:00408A27 83EC68 sub esp, 00000068:00408A2A 53 push ebx
分析下上面的代码,可以发现修改:00408A14 68968B4000 push 00408B96:00408A19 64A100000000 mov eax, dword ptr fs:[00000000]这两句代码的先后顺序,并不会影响堆栈内容的读取,同时也改变了特征码,即改为::00408A14 64A100000000 mov eax, dword ptr fs:[00000000]:00408A1A 68968B4000 push 00408B96
用WinHex打开“Server.bud”,把文件偏移8A14h至8A1Eh处的“68968B400064A100000000”改为“64A10000000068968B4000”后保存,生成网络神偷服务端程序后,测试运行正常,四种杀毒软件都没对其正确报警!网络神偷特征码修改实战顺利完成!
最后交待一下,如果你觉得脱壳后的服务端太大,可以重新加壳,当然不可以用UPX噢,否则瑞星老大绝对找你麻烦,建议采用ASPack加壳;另外说下,修改特征码代码时,改变代码的先后顺序是个不错的选择。
[1] [2] [3] [4]
(出处:http://www.sheup.com)