看流星社区

 找回密码
 注册账号
查看: 2080|回复: 0

驱动枚举所有进程所有模块,删除指定进程。

[复制链接]

该用户从未签到

发表于 2018-2-27 21:52:42 | 显示全部楼层 |阅读模式

环境:   VS2008中配置WDK7600驱动开发环境

包含文件   #include <ntifs.h>   #include <WinDef.h>  
需要在 #include <ntddk.h> 之前  那么就不会出错

程序大体流程:
PsGetCurrentProcess() 得到本进程EPROCESS
通过EPROCESS +0x174 得到进程名
通过EPROCESS +0x84  得到进程ID

     PsLookupProcessByProcessId 通过进程ID 得到 这个ID的 EPROCESS
     MmGetSystemRoutineAddress  得到 PsGetProcessPeb的函数地址
     PsGetProcessPeb 通过进程的 EPROCESS得到 进程的PEB 然后再得到PEB的LDR
     保存APC状态  (Asynchronous procedure call,异步程序调用)KeStackAttachProcess(EPROCESS , &KAPC);
     通过ldr 得到 内存加载链表InMemoryOrderModuleList 通过它循环遍历模块
     pListEntryStart = pListEntryEnd = pPebLdrData->InMemoryOrderModuleList.Flink
     pLdrDataEntry = (PLDR_DATA_TABLE_ENTRY)CONTAINING_RECORD(pListEntryStart,LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);   
     pLdrDataEntry 包含有模块的全路径 然后循环得到
     detach进程 KeUnstackDetachProcess
    另外就是 PsLookupProcessByProcessId  得到 EPROCESS会增加引用计数 这里减少即可
    ObDereferenceObject(EPROCESS),EPROCESS=null;

通过EPROCESS +0x88  得到下一个EPROCESS的ActiveProcessLinks
通过上面这个结构 - 0x88 就得到这个EPROCESS指针
然后循环进行遍历进程

  1. typedef PPEB (__stdcall *PFNPsGetProcessPeb)(PEPROCESS pEProcess);   
  2. typedef ULONG   PPS_POST_PROCESS_INIT_ROUTINE;      <div>
  3. typedef struct _PEB_LDR_DATA {   
  4.     BYTE       Reserved1[8];   
  5.     PVOID      Reserved2[3];   
  6.     LIST_ENTRY InMemoryOrderModuleList;   
  7. } PEB_LDR_DATA, *PPEB_LDR_DATA;    </div><div>
  8. typedef struct _RTL_USER_PROCESS_PARAMETERS {   
  9.     BYTE           Reserved1[16];   
  10.     PVOID          Reserved2[10];   
  11.     UNICODE_STRING ImagePathName;   
  12.     UNICODE_STRING CommandLine;   
  13. } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;   

  14. typedef struct _PEB {   
  15.     BYTE                          Reserved1[2];   
  16.     BYTE                          BeingDebugged;   
  17.     BYTE                          Reserved2[1];   
  18.     PVOID                         Reserved3[2];   
  19.     PPEB_LDR_DATA                 Ldr;   
  20.     PRTL_USER_PROCESS_PARAMETERS  ProcessParameters;   
  21.     BYTE                          Reserved4[104];   
  22.     PVOID                         Reserved5[52];   
  23.     PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;   
  24.     BYTE                          Reserved6[128];   
  25.     PVOID                         Reserved7[1];   
  26.     ULONG                         SessionId;   
  27. } PEB, *PPEB;   

  28. typedef struct _LDR_DATA_TABLE_ENTRY      
  29. {      
  30.     LIST_ENTRY InLoadOrderLinks;      
  31.     LIST_ENTRY InMemoryOrderLinks;      
  32.     LIST_ENTRY InInitializationOrderLinks;      
  33.     PVOID DllBase;      
  34.     PVOID EntryPoint;      
  35.     DWORD SizeOfImage;      
  36.     UNICODE_STRING FullDllName;      
  37.     UNICODE_STRING BaseDllName;      
  38.     DWORD Flags;      
  39.     WORD LoadCount;      
  40.     WORD TlsIndex;      
  41.     LIST_ENTRY HashLinks;      
  42.     PVOID SectionPointer;      
  43.     DWORD CheckSum;      
  44.     DWORD TimeDateStamp;      
  45.     PVOID LoadedImports;      
  46.     PVOID EntryPointActivationContext;      
  47.     PVOID PatchInformation;      
  48. }LDR_DATA_TABLE_ENTRY,*PLDR_DATA_TABLE_ENTRY;   </div>
复制代码


主要功能代码:

  1. NTSTATUS ScanModulebypid(ULONG ulProcessId)   
  2. {   
  3.     //获取进程的EPROCESS结构指针   
  4.     NTSTATUS nStatus;   
  5.     PEPROCESS  pEProcess = NULL;   
  6.     nStatus = PsLookupProcessByProcessId((HANDLE)ulProcessId, &pEProcess);   
  7.     if (!NT_SUCCESS(nStatus))   
  8.     {   
  9.         return STATUS_UNSUCCESSFUL;   
  10.     }   
  11.   
  12.     //查找函数地址        
  13.     UNICODE_STRING uniFunctionName;   
  14.     RtlInitUnicodeString(&uniFunctionName, L"PsGetProcessPeb");   
  15.   
  16.     //函数指针   
  17.     PFNPsGetProcessPeb  PsGetProcessPeb = NULL;   
  18.   
  19.     PsGetProcessPeb = (PFNPsGetProcessPeb)MmGetSystemRoutineAddress(&uniFunctionName);   
  20.     if (PsGetProcessPeb == NULL)   
  21.     {   
  22.         KdPrint(("Get PsGetProcessPeb Failed~!\n"));   
  23.         return STATUS_UNSUCCESSFUL;   
  24.     }   
  25.   
  26.     //获取PEB指针      
  27.     PPEB pPEB = NULL;   
  28.     pPEB = PsGetProcessPeb(pEProcess);   
  29.   
  30.     if (pPEB == NULL)   
  31.     {   
  32.         KdPrint(("Get pPEB Failed~!\n"));   
  33.         return STATUS_UNSUCCESSFUL;   
  34.     }   
  35.   
  36.     //保存APC状态  APC,即Asynchronous procedure call,异步程序调用  
  37.     KAPC_STATE KAPC ={0};   
  38.     //附加到进程   
  39.     KeStackAttachProcess(pEProcess, &KAPC);   
  40.   
  41.     //是否已经附加到进程   
  42.     BOOLEAN bIsAttached = FALSE;   
  43.   
  44.     bIsAttached = TRUE;   
  45.   
  46.     //指向LDR   
  47.     //LDR数据结构   
  48.     PPEB_LDR_DATA pPebLdrData = NULL;     
  49.     pPebLdrData = pPEB->Ldr;   
  50.   
  51.     //链表头节点、尾节点   
  52.     PLIST_ENTRY pListEntryStart = NULL;   
  53.     PLIST_ENTRY pListEntryEnd = NULL;   
  54.     //头节点、尾节点   
  55.     pListEntryStart = pListEntryEnd = pPebLdrData->InMemoryOrderModuleList.Flink;   
  56.   
  57.   
  58.     //开始遍历_LDR_DATA_TABLE_ENTRY   
  59.     //LDR链表入口   
  60.     PLDR_DATA_TABLE_ENTRY pLdrDataEntry = NULL;     
  61.     do      
  62.     {      
  63.         //通过_LIST_ENTRY的Flink成员获取_LDR_DATA_TABLE_ENTRY结构     
  64.   
  65.         pLdrDataEntry = (PLDR_DATA_TABLE_ENTRY)CONTAINING_RECORD(pListEntryStart,LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);      
  66.   
  67.         //输出DLL全路径   
  68.         KdPrint(("%wZ \n", &pLdrDataEntry->FullDllName));   
  69.   
  70.         pListEntryStart = pListEntryStart->Flink;      
  71.   
  72.     }while(pListEntryStart != pListEntryEnd);      
  73.   
  74.     KdPrint(("\n\n"));  
  75.     //Detach进程   
  76.     if (bIsAttached != FALSE)   
  77.     {   
  78.         KeUnstackDetachProcess(&KAPC);   
  79.     }   
  80.   
  81.     //减少引用计数   
  82.     if (pEProcess != NULL)   
  83.     {   
  84.         ObDereferenceObject(pEProcess);   
  85.         pEProcess = NULL;   
  86.     }   
  87.   
  88.     return STATUS_SUCCESS;   
  89. }   
  90.   
  91. NTSTATUS ScanProcessModule()  
  92. {  
  93.     PEPROCESS eprocess,Firsteprocess;  
  94.     ULONG ulProcessName;  
  95.     ULONG ulProcessID;  
  96.   
  97.     KdPrint(("start ScanProcessModile\n"));  
  98.     //__asm int 3;  
  99.     eprocess = PsGetCurrentProcess();  
  100.   
  101.     Firsteprocess = eprocess;  
  102.     if (eprocess == 0)  
  103.     {  
  104.         KdPrint(("PsGetCurrentProcess error"));  
  105.         return STATUS_SUCCESS;  
  106.     }  
  107.     while (eprocess != NULL)  
  108.     {  
  109.         ulProcessName = (ULONG)eprocess + 0x174;        //   +0x174 ImageFileName    : [16] UChar  
  110.         ulProcessID = *(ULONG*)((ULONG)eprocess + 0x84);//   +0x084 UniqueProcessId  : Ptr32 Void  
  111.         KdPrint(("processname = %s,processid = %d \r \n",ulProcessName,ulProcessID));  
  112.         //if (!strcmp( (char*)(ULONG*)ulProcessName ,"notepad.exe"))  
  113.         //{  
  114.             ScanModulebypid(ulProcessID);  
  115.         //}  
  116.          
  117.                                                         //   +0x088 ActiveProcessLinks : _LIST_ENTRY  
  118.         eprocess = (PEPROCESS)(*(ULONG*)((ULONG)eprocess + 0x88) - 0x88);//-0x88是得到 eprocess结构  
  119.   
  120.         if (eprocess == Firsteprocess || (*(LONG*)( (LONG)eprocess + 0x84) ) <0)//如果链表搜索完毕或者进程PID小于0则结束  
  121.         {  
  122.             break;  
  123.         }  
  124.     }  
  125.     return STATUS_SUCCESS;  
  126. }  
复制代码

删除指定进程:
方法1    卸载掉  指定进程的NTDLL.dll 模块   (这里以 notepad.exe 为例子)
  1. extern "C"  
  2. NTSTATUS   
  3. MmUnmapViewOfSection(   
  4.                      IN PEPROCESS Process,   
  5.                      IN ULONG BaseAddress   
  6.                      );   
  7. NTSTATUS ScanProcessModule()  
  8. {  
  9.     PEPROCESS eprocess,Firsteprocess;  
  10.     ULONG ulProcessName;  
  11.     ULONG ulProcessID;  
  12.   
  13.     KdPrint(("start ScanProcessModile\n"));  
  14.     //__asm int 3;  
  15.     eprocess = PsGetCurrentProcess();  
  16.   
  17.     Firsteprocess = eprocess;  
  18.     if (eprocess == 0)  
  19.     {  
  20.         KdPrint(("PsGetCurrentProcess error"));  
  21.         return STATUS_SUCCESS;  
  22.     }  
  23.             PEPROCESS eprocess2;  
  24.   
  25.     while (eprocess != NULL)  
  26.     {  
  27.         ulProcessName = (ULONG)eprocess + 0x174;        //   +0x174 ImageFileName    : [16] UChar  
  28.         ulProcessID = *(ULONG*)((ULONG)eprocess + 0x84);//   +0x084 UniqueProcessId  : Ptr32 Void  
  29.         KdPrint(("processname = %s,processid = %d \r \n",ulProcessName,ulProcessID));  
  30.          
  31.   
  32.         if (!strcmp( (char*)(ULONG*)ulProcessName ,"notepad.exe"))  
  33.         {  
  34.             PsLookupProcessByProcessId((HANDLE)ulProcessID,&eprocess2);  
  35.             UNICODE_STRING uniPsGetProcessPeb;  
  36.             RtlInitUnicodeString(&uniPsGetProcessPeb,L"PsGetProcessPeb");  
  37.   
  38.             PFNPsGetProcessPeb PsGetProcessPebAddr = (PFNPsGetProcessPeb)MmGetSystemRoutineAddress(&uniPsGetProcessPeb);  
  39.             if (PsGetProcessPebAddr == NULL)      
  40.             {      
  41.                 KdPrint(("Get PsGetProcessPeb Failed~!\n"));      
  42.                 return STATUS_UNSUCCESSFUL;      
  43.             }      
  44.             PPEB pPEB = NULL;      
  45.             pPEB = PsGetProcessPebAddr(eprocess2);   
  46.             if (pPEB == NULL)      
  47.             {      
  48.                 KdPrint(("Get pPEB Failed~!\n"));      
  49.                 return STATUS_UNSUCCESSFUL;      
  50.             }     
  51.             //保存APC状态  APC,即Asynchronous procedure call,异步程序调用   
  52.             KAPC_STATE KAPC ={0};      
  53.             //附加到进程      
  54.             KeStackAttachProcess(eprocess2, &KAPC);      
  55.   
  56.             //是否已经附加到进程      
  57.             BOOLEAN bIsAttached = FALSE;      
  58.   
  59.             bIsAttached = TRUE;      
  60.   
  61.             //指向LDR      
  62.             //LDR数据结构      
  63.             PPEB_LDR_DATA pPebLdrData = NULL;      
  64.             pPebLdrData = pPEB->Ldr;      
  65.   
  66.             //链表头节点、尾节点      
  67.             PLIST_ENTRY pListEntryStart = NULL;      
  68.             PLIST_ENTRY pListEntryEnd = NULL;      
  69.             //头节点、尾节点      
  70.             pListEntryStart = pListEntryEnd = pPebLdrData->InMemoryOrderModuleList.Flink;      
  71.   
  72.   
  73.             //开始遍历_LDR_DATA_TABLE_ENTRY      
  74.             //LDR链表入口      
  75.             PLDR_DATA_TABLE_ENTRY pLdrDataEntry = NULL;      
  76.             do        
  77.             {        
  78.                 //通过_LIST_ENTRY的Flink成员获取_LDR_DATA_TABLE_ENTRY结构      
  79.   
  80.                 pLdrDataEntry = (PLDR_DATA_TABLE_ENTRY)CONTAINING_RECORD(pListEntryStart,LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);        
  81.   
  82.                 //输出DLL全路径      
  83.                 KdPrint(("%wZ \n", &pLdrDataEntry->FullDllName));      
  84.                 UNICODE_STRING uniNtdll;  
  85.                 RtlInitUnicodeString(&uniNtdll,L"ntdll.dll");  
  86.   
  87.                 if (RtlEqualUnicodeString(&pLdrDataEntry->BaseDllName,&uniNtdll,TRUE))  
  88.                 {  
  89.                     MmUnmapViewOfSection(eprocess2,(ULONG)(pLdrDataEntry->DllBase));  
  90.                     KdPrint(("卸载 ntdll.dll 完成"));   
  91.                 }  
  92.                 pListEntryStart = pListEntryStart->Flink;        
  93.   
  94.             }while(pListEntryStart != pListEntryEnd);        
  95.   
  96.             //Detach进程      
  97.             if (bIsAttached != FALSE)      
  98.             {      
  99.                 KeUnstackDetachProcess(&KAPC);      
  100.             }      
  101.   
  102.             //减少引用计数      
  103.             if (eprocess2 != NULL)      
  104.             {      
  105.                 ObDereferenceObject(eprocess2);      
  106.                 eprocess2 = NULL;      
  107.             }      
  108.    
  109.         }  
  110.          
  111.         //   +0x088 ActiveProcessLinks : _LIST_ENTRY  
  112.         eprocess = (PEPROCESS)(*(ULONG*)((ULONG)eprocess + 0x88) - 0x88);//-0x88是得到 eprocess结构  
  113.   
  114.         if (eprocess == Firsteprocess || (*(LONG*)( (LONG)eprocess + 0x84) ) <0)//如果链表搜索完毕或者进程PID小于0则结束  
  115.         {  
  116.             break;  
  117.         }  
  118.     }  
  119.     return STATUS_SUCCESS;  
  120. }  
复制代码


点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-26 07:22

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表