龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 10236|回复: 0

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

[复制链接]

8

主题

1

回帖

15

积分

编程入门

Rank: 1

龙马币
56

环境:   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. }  
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表