感染之后的TestLoad.exe的结构如图2所示:
图2
可以看出感染之后的TestLoad.exe的引入表多了一个Hkdoordll.dll引入库。细心观察感染之后的TestLoad.exe的引入表地址(ImportTableAddressITA)已经被改变,原来的ITA为0x000043FC,感染之后为0x0000477E。为了进一步看清除感染前后的文件的变化,这里使用LordPE.exe比较感染前后的TestLoad.exe的引入表函数,比较结果如图3所示:
图3小提示:使用LordPE.exe查看exe文件的引入表函数方法是:点击PEEdito打开相应的文件,接着点击Directories,弹出对话框后点击ImportTable右边的三个点,这样就可以查看一个可执行文件的引入表了。
可以看出,只是在引入表链表中添加了一个相应的Hkdoordll.dll,这样当被感染的程序再次运行时,由系统的程序装载器搜索Hkdoordll.dll,并将其引用到被感染程序的地址空间,后门就运行起来了。黑客之门的这种子启动方式值得学习,比较灵巧。
搞明白了黑客之门的启动方式后,我们就可以手动清除它了,这里切不可将Hkdoordll.dll直接删除,这样可能直接导致系统崩溃。因为系统在加载被感染的程序(假如为Services.exe)时发现没有找到Hkdoordll.dll,Services.exe将不能被装载,如果被感染的是系统关键进程的话,那么系统将不能正确的启动。清除的时候我们可以去别的机器上(相同系统与补丁)找一个Services.exe,将被感染的程序命名为Services2.exe,将Services.exe拷贝到System32文件夹下,重启电脑,删除Hkdoordll.dll就清除黑客之门了。运行时感染
上面说的是黑客之门的自启动方式,下面看看黑客之门是怎么感染正在运行的系统文件的,这一点让我晕了很久,最后发现是用了一个很灵活的小技巧。我们知道在Windows系统下,正在运行的程序文件一般是不能修改或者删除的,正是由于这一点,才出现了各种程序运行时的自删除大法,程序自删除不是我们这次的重点。但是,细心的用户可能已经发现,在Windows2000或WndowsXP系统下,我们可以对正在运行的EXE文件进行重命名或者移动。再拿刚才的TestLoad.exe做测试,运行:
C:\>rundll32hkdoordll,DllRegisterServerTestLoad.exe2可以发现TestLoad.exe所在的文件夹内多出了一个文件TestLoad.exe.bak,咋一看还以为“黑客之门”做好事,自动帮你备份一下系统文件,其实这可是黑客之门的狐狸尾巴啊!是它不得已而为之的。不要关闭TestLoad.exe,然后试着删除TestLoad.exe和TestLoad.exe.bak,是不是发现奇迹了?竟然把TestLoad.exe删掉了,而TestLoad.exe.bak竟然不让删,是不是和我刚才说的话矛盾?非也!非也!刚好证明了刚才的话:黑客之门先把TestLoad.exe改名为TestLoad.exe.bak,然后生成一个被感染的TestLoad.exe,这样,下次运行TestLoad.exe实际上是被替换过的程序,原来的程序则放在一边。用IDAPro反汇编Hkdoordll.dll可以发现以下函数的调用:
文件重命名:
.data:1000C618leaecx,[esp+438h+FileName].data:1000C61Fleaedx,[esp+438h+var_324].data:1000C626pushecx.data:1000C627pushedx.data:1000C628callrename
拷贝文件:
.data:1000C66Fleaedx,[esp+440h+var_32C].data:1000C676push0;bFailIfExists.data:1000C678leaeax,[esp+444h+var_228].data:1000C67Fpushedx;lpNewFileName.data:1000C680pusheax;lpExistingFileName.data:1000C681callCopyFileA
移动文件:
.data:1000C795moveax,[ebp+8].data:1000C798testeax,eax.data:1000C79Ajnzshortloc_1000C7FE.data:1000C79Cleaecx,[esp+448h+var_334].data:1000C7A3push5;dwFlags.data:1000C7A5leaedx,[esp+44Ch+var_230].data:1000C7ACpushecx;lpNewFileName.data:1000C7ADpushedx;lpExistingFileName.data:1000C7AEcallMoveFileExA上面的语句实际上可以理解为:MoveFileEx(“TestLoad.exe”,”TestLoad.exe.bak”,MOVEFILE_DELAY_UNTIL_REBOOT|MOVEFILE_REPLACE_EXISTING);
小知识:MSDN中对MoveFileEx()函数的解释为:BOOLMoveFileEx(LPCTSTRlpExistingFileName,//pointertothenameoftheexistingfileLPCTSTRlpNewFileName,//pointertothenewnameforthefileDWORDdwFlags//flagthatspecifieshowtomovefile);
这样进程TestLoad.exe的文件映象实际上为TestLoad.exe.bak,接着Hkdoordll.dll生成被感染的TestLoad.exe,并且保存在原来的文件路径上即可。
灭掉系统文件保护
一旦系统启动了,Windows系统就开始加载已经被感染的系统程序,但是由于“黑客之门”是通过感染系统程序实现自启动的,这下子又遇到了另外一个问题。
大家都知道,在Windows2000和WindowsXP中有系统文件保护功能,一旦被保护的系统文件被修改了,就会弹出需要插入系统安装盘CD的对话框。这样就导致了一个问题,TestLoad.exe只是一个普通的EXE文件,而不是受系统文件保护系统保护的系统进程,那为什么黑客之门修改系统进程时,操作系统的文件的文件保护系统不会提醒呢?这一点,还是采用反汇编黑客之门的方法,观察它是怎样关闭系统文件保护功能的。
发现如下的代码:
.data:1000BBB0LoadSFCDLLprocnear;CODEXREF:sub_1000BC70+B7.data:1000BBB0pushesi.data:1000BBB1xoresi,esi.data:1000BBB3callGetVersion;GetcurrentversionnumberofWindows.data:1000BBB3;andinformationabouttheoperatingsystemplatform.data:1000BBB9cmpal,5.data:1000BBBBjnzshortloc_1000BBDF.data:1000BBBDxorecx,ecx;此时为Windows2000系统.data:1000BBBFmovcl,ah.data:1000BBC1testcl,cl.data:1000BBC3jnzshortloc_1000BBD2.data:1000BBC5pushoffsetaSfc_dll;lpLibFileName.data:1000BBCAcallLoadLibraryA;此时为WindowsXP系统.data:1000BBD0popesi.data:1000BBD1retn.data:1000BBD2loc_1000BBD2:;CODEXREF:LoadSFCDLL+13j.data:1000BBD2pushoffsetaSfc_os_dll;lpLibFileName.data:1000BBD7callLoadLibraryA.data:1000BBDDpopesi.data:1000BBDEretn
上面的代码可以看出,Hkdoordll.dll根据操作系统的版本调用了Sfc.dll或者Sfc_os.dll,如果是Windows2000(WindowsNT5.0)的话,装载Sfc.dll;如果是WindowsXP(WindowsNT5.1)的话,装载Sfc_os.dll。再看下面的一段反汇编代码: