20145319 《网络渗透》免考—进程隐藏

20145319 《网络渗透》免考—进程隐藏

概述

  • 实验的主要目的是通过ap ihook技术对系统回调函数进行hook,拦截系统任务管理器对进程信息的获取,并做出相应修改,从而实现目标进程在任务管理器的列表中“隐藏”
  • 主要知识如下:
    • 注入技术
    • api hook相关技术

实验内容

概念

  • 之前,我们了解了如何做到让一个程序实现任务栏隐藏来做到在用户眼中“隐身”,但如果用户打开任务管理器就能发现后台有一个未知程序正在运行,因此我们需要进一步处理,实现进程隐藏
  • 进程隐藏,分为真隐藏和伪隐藏
    • 真隐藏:顾名思义就是真的让一个程序不以一个进程的方式运行,来实现真正意义上进程隐藏,
    • 伪隐藏:则是一种障眼法,我们今天要做的,就是将任务管理器的列表中抹去目标程序的名字的戏法

伪隐藏(混淆隐藏)

  • 通过读取系统中的关键进程路径,将恶意代码重命名为类似名称(例如kernel32.dll和kerne123.dll),并复制到同一路径下
  • 此方法比较简单,原理容易理解,因此不做过多说明,重点讲述如何修改任务管理器进程列表来实现进程隐藏

伪隐藏(API HOOK)

  • 在windows中,任务管理器也是通过遍历系统中的进程信息结构体链表来,枚举进程信息来实现进程管理的,因此,我们要做的就是通过API拦截技术来拦截该信息,提前将目标进程在待显示进程列表中删除,即可实现进程隐藏

  • 首先是进程的遍历,无论在之前进程注入中获得相应Pid,还是现在进程列表,都是需要使用到进程遍历技术,进程遍历的方法有好几种,最常用的一种就是通过ToolHelp Service提供的API函数来创建系统快照,从快照中获取进程信息,核心函数为CreateToolhelp32Snapshot函数Process32First函数Process32Next函数

  • 以下为函数原型

      HANDLE WINAPI CreateToolhelp32Snapshot(   
      	DWORD dwFlags,          //系统快照要查看的信息类型   
      	DWORD th32ProcessID      //值0表示当前进程   
      ); 
    
      BOOL WINAPI Process32First(   
      	HANDLE hSnapshot,        //CreateToolhelp32Snapshot函数创建的快照句柄   
      	LPPROCESSENTRY32 lppe  //进程结构体入口  
      );   
      BOOL WINAPI Process32Next(   
      	HANDLE hSnapshot,        //同上   
      	LPPROCESSENTRY32 lppe  //同上   
      );  
    
  • 首先我们通过CreateToolhelp32Snapshot函数创建系统快照句柄,Process32First函数从名字上看我们就知道,这个函数能获取系统快照中的第一个进程信息,Process32Next则是能获得下一个进程的句柄

  • 通过这个简单的逻辑我们就可以遍历整个进程列表,代码如下

      hshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);   
      flag=Process32First(hshot,pinfo);
      while(flag){
      	    
      	report=Process32Next(hProcess, pinfo);
      }  
    
  • 第二种,就是通过psapi.dll提供的EnumProcesses函数EnumProcessModules函数实现

  • 函数原型如下

      BOOL EnumProcesses(
         		DWORD* pProcessIds,
         		DWORD cb,
         		DWORD* pBytesReturned
      );
    
      BOOL EnumProcessModules(
         		HANDLE hProcess,
         		HMODULE* lphModule,
         		DWORD cb, 
         		LPDWORD lpcbNeeded
      );
    
  • 遍历函数如下

      HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS , FALSE, processID);     
    
      if(NULL != hProcess)
      {
       	HMODULE hMod;
       	DWORD cbNeeded;
       	if( EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded) )         
       	{              
             	GetModuleBaseName(hProcess, hMod, szProcessName,sizeof(szProcessName) / sizeof(TCHAR));                        
       	}
      }
    
  • 在第二种方法里,涉及到OpenProcess操作,进行提权操作,提权代码在博客API拦截(博客链接)中有展示

  • 最后就是通过ZwQuerySystemInformation()函数SystemHandleInformation标记实现遍历,仍然有许多进程遍历的方法,不过大多数都只能在某些局限性环境下实现,在此就不一一演示了

  • 其实上述所有的进程遍历的方法在根本上都与ZwQuerySystemInformation()函数有关,因此该函数也是我们hook的目标,我们仍旧采用inline hook的手法实现与我们自定义的MyZwQuerySystemInformation()函数地址替换,具体原理参见API拦截技术

  • 代码实现如下:

  • 我们先运行窗口小程序hello5319.exe,将dll注入之后即发现进程列表中hello5319.exe已经消失了

原文地址:https://www.cnblogs.com/20145319zk/p/7044019.html