zoukankan      html  css  js  c++  java
  • 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已经消失了

  • 相关阅读:
    python 5 条件判断
    python 4学习 list 和 tuple
    python 3 学习字符串和编码
    python 1 学习廖雪峰博客
    c++11 thread的学习
    C++ 11 Lambda表达式!!!!!!!!!!!
    c++11 右值的学习
    TreeMap
    二分查找
    solr in action 第三章
  • 原文地址:https://www.cnblogs.com/20145319zk/p/7044019.html
Copyright © 2011-2022 走看看