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拦截技术
  • 代码实现如下:
  • dll代码
  • 注入代码
  • 我们先运行窗口小程序hello5319.exe,将dll注入之后即发现进程列表中hello5319.exe已经消失了