欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

Ring3下WX方法结束微点2009

Ring3下WX方法结束微点2009

此法系Hovi.Delphic首发,某日看过之后甚感WS(某牛:“太挫了,太挫了”),于是把原作者的VB代码转成VC,以飨读者。
 
微点的主动防御没有拦截一些系统进程如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
 
这里提供一份更简短的代码,便于看清操作过程

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功