不用GetModuleFileNameEx获取所有进程全路径的方法
我想获取所有的进程路径,我已经掌握了OpenProcess,GetModuleFileNameEx那种方法,但是现在不允许调用GetModuleFileNameEx这个函数,请问还有没有别的方法获取所有进程的全路径?
[解决办法]
完全可以,甚至可以不用任何API.
在驱动程序入口获得PsActiveProcess链(这个可以用PsGetCurrentProcess或者ntoskrnl的导出变量)
然后遍沥这条链表,获得每个进程的EPROCESS,在这个结构体里保存着PEB,而在PEB里保存了ProcessParameters的地址。ProcessParameters保存着进程的完整路径。当然PEB里保存了镜像加载列表,还可以顺便把程序加载的DLL一起列出来.
[解决办法]
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
void ShowModule(DWORD PID,char *strExePath)
{
HANDLE hSnapShot;
BOOL fOk;
hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,PID);
MODULEENTRY32 me={sizeof(me)};
for(fOk=Module32First(hSnapShot,&me);fOk;fOk=Module32Next(hSnapShot,&me))
{
if (strstr(me.szExePath,strExePath) != NULL)
{
printf( "%s\n ",me.szExePath);
}
}
}
void ShowProcess()
{
HANDLE hSnapshot;
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
for(BOOL bOk=Process32First(hSnapshot,&pe);bOk;bOk=Process32Next(hSnapshot,&pe))
{
ShowModule(pe.th32ProcessID,pe.szExeFile);
}
}
int main(int argc, char* argv[])
{
ShowProcess();
return 0;
}
以上是全部代码。
[解决办法]
用 NtQueryInformationProcess, 第二个参数用 ProcessImageFileName 就可以了,返回的Buffer是UNICODE_STRING。
为什么不允许用 GetModuleFileNameEx?
[解决办法]
用GetCommandLine,然后解析也可以,但要用代码注入到各个进程中,反而不如GetModuleHandle好用。