如何得到如何查看当前进程的idHANDLE

2004年9月 总版技术专家分月排行榜第二
2005年3月 总版技术专家分月排行榜第三2004年8月 总版技术专家分月排行榜第三2004年7月 总版技术专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。1112人阅读
在内核中,通过进程ID,得到进程名称,有多种方法。
我使用了两种方法,第一种是使用ZwOpeProcess得到句柄
然后ObReferenceObjectByHandle函数得到PEPROCESS结构,然后
char *ProcessName = (char*)EProcess + 0x174;
第二种方法是得到PEPROCESS结构之后,使用PsGetProcessImageFileName函数得到进程名。
具体代码如下:
#include&ntddk.h&&&#include&wdm.h&&&&&UCHAR*&PsGetProcessImageFileName(PEPROCESS&Process);&&&&NTSTATUS&Unload(IN&PDRIVER_OBJECT&&DriverObject)&&{&&&&&&DbgPrint(&驱动已经卸载/n&);&&&&&}&&&&&void&GetProcessName(ULONG&dwPid)&&{&&&&&&HANDLE&ProcessH&&&&&&NTSTATUS&&&&&&&OBJECT_ATTRIBUTES&&ObjectA&&&&&&CLIENT_ID&myC&&&&&&PEPROCESS&EP&&&&&&&&InitializeObjectAttributes(&ObjectAttributes,0,0,0,0);&&&&&&&&&myCid.UniqueProcess&=&(HANDLE)dwP&&&&&&myCid.UniqueThread&=&0;&&&&&&&&&&&&&&status&=&ZwOpenProcess&(&ProcessHandle,PROCESS_ALL_ACCESS,&ObjectAttributes,&myCid);&&&&&&if&(!NT_SUCCESS(status))&&&&&&{&&&&&&&&&&DbgPrint(&打开进程出错/n&);&&&&&&&&&&return;&&&&&&}&&&&&&&&&&&&&&&&&&status&=&ObReferenceObjectByHandle(ProcessHandle,FILE_READ_DATA,0,KernelMode,&EProcess,&0);&&&&&&if&(status&==&STATUS_SUCCESS)&&&&&&{&&&&&&&&&&char&*ProcessName&=&(char*)EProcess&+&0x174;&&&&&&&&&&char&*PsName&=&PsGetProcessImageFileName(EProcess);&&&&&&&&&&&&DbgPrint(&ProcessName&is&%s/n&,ProcessName);&&&&&&&&&&DbgPrint(&PsName&is&%s/n&,PsName);&&&&&&&&&&&&ZwClose(ProcessHandle);&&&&&&}&&&&&&else&&&&&&{&&&&&&&&&&DbgPrint(&Get&ProcessName&error&);&&&&&&}&&}&&&&NTSTATUS&&&&&DriverEntry(&&&&&&IN&PDRIVER_OBJECT&&DriverObject,&&&&&&IN&PUNICODE_STRING&&RegistryPath&&&&&&)&&{&&&&&&DbgPrint(&驱动已经加载了/n&);&&&&&&GetProcessName(2044);&&&&&&DriverObject-&DriverUnload&=&U&&&&&&&return&STATUS_SUCCESS;&&}&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1681272次
积分:16291
积分:16291
排名:第492名
原创:29篇
转载:762篇
评论:168条
(7)(22)(14)(2)(13)(17)(5)(12)(2)(3)(17)(41)(31)(11)(8)(14)(12)(12)(6)(18)(10)(8)(17)(5)(2)(7)(7)(7)(10)(15)(23)(25)(5)(19)(9)(3)(9)(7)(10)(18)(19)(25)(13)(14)(7)(15)(36)(7)(3)(8)(17)(12)(32)(14)(4)(14)(26)(7)(15)(11)(16)(5)1876人阅读
虚拟机/云计算/服务(22)
这也是开发当中经常遇到的一个问题,因为服务程序是用system身份运行的,所以如果直接使用getusername是不行的。但是如果用我上一篇文章中的思路,那么这个问题同样也可以迎刃而解了。方法就是可以通过取得shell的token,根据这个token来得到Sid,在根据Sid来得到当前登陆的用户名和domain。下面是示例代码:
//根据进程名称得到进程token
BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)
if(!lpName)
return FALSE;
hProcessSnap = NULL;
PROCESSENTRY32 pe32
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
return (FALSE);
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32))
if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
FALSE,pe32.th32ProcessID);
bRet = OpenProcessToken(hProcess, TOKEN_ALL_ACCESS,&hToken);
CloseHandle (hProcessSnap);
return (bRet);
while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
bRet = FALSE;
CloseHandle (hProcessSnap);
return (bRet);
BOOL GetCurrentUserName()
//得到shell的token
if(!GetTokenByName(hToken,&EXPLORER.EXE&))
return FALSE;
PTOKEN_USER
SID_NAME_USE
//取得所需空间大小
if (GetTokenInformation(hToken, TokenUser, NULL, 0, &cbti))
CloseHandle(hToken);
return FALSE;
//分配空间
ptiUser = (PTOKEN_USER) HeapAlloc(GetProcessHeap(), 0, cbti);
if(!ptiUser)
CloseHandle(hToken);
return FALSE;
//取得token信息
if (!GetTokenInformation(hToken, TokenUser, ptiUser, cbti, &cbti))
CloseHandle(hToken);
HeapFree(GetProcessHeap(), 0, ptiUser);
return FALSE;
char szUser[50];
char szDomain[50];
DWORD nUser = 50;
DWORD nDomain = 50;
//根据用户的sid得到用户名和domain
if (!LookupAccountSid(NULL, ptiUser-&User.Sid, szUser, &nUser,
szDomain, &nDomain, &snu))
CloseHandle(hToken);
HeapFree(GetProcessHeap(), 0, ptiUser);
return FALSE;
OutputDebugString(szUser);
OutputDebugString(&\r\n&);
OutputDebugString(szDomain);
OutputDebugString(&\r\n&);
CloseHandle(hToken);
HeapFree(GetProcessHeap(), 0, ptiUser);
return TRUE;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2008324次
积分:21581
积分:21581
排名:第265名
原创:243篇
转载:265篇
评论:449条
(1)(2)(5)(1)(1)(1)(2)(5)(4)(1)(1)(4)(3)(2)(6)(5)(14)(6)(4)(29)(20)(33)(25)(45)(49)(61)(55)(56)(69)本帖子已过去太久远了,不再提供回复功能。如何在驱动程序(SYS)中得到当前进程的完整路径和进程名?如何在驱动程序(SYS)中得到当前进程的完整路径和进程名?
&PsGetCurrentProcessIoGetCurrentProcess_EPROCESS_EPROCESStypedef struct _EPROCESS&&& {&&& KPROCESS&&&&&&&&&&&&&&&&&&&& P&&& NTSTATUS&&&&&&&&&&&&&&&&&&&& ExitS&&& KEVENT&&&&&&&&&&&&&&&&&&&&&& LockE&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& LockC&&& QWORD&&&&&&&&&&&&&&&&&&&&&&& CreateT&&& QWORD&&&&&&&&&&&&&&&&&&&&&&& ExitT&&& PVOID&&&&&&&&&&&&&&&&&&&&&&& LockO&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& UniqueProcessId;&&& QWORD&&&&&&&&&&&&&&&&&&&&&&& ActiveProcessL&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& QuotaPeakPoolUsage [2]; // NP, P&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& QuotaPoolUsage&&&& [2]; // NP, P&&& DWORD&&&&&&& &&&&&&&&&&&&&&&&PagefileU&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& CommitC&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& PeakPagefileU&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& PeakVirtualS&&& QWORD&&&&&&&&&&&&&&&&&&&&&&& VirtualS&&& DWORD&&&&&&&&&&&&&&&&&&&& &&&Vm [12];&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& LastProtoPteF&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& DebugP&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& ExceptionP&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& ObjectT&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& T&&& DWORD&&&& &&&&&&&&&&&&&&&&&&&WorkingSetLock [8];&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& WorkingSetP&&& BOOLEAN&&&&&&&&&&&&&&&&&&&&& ProcessOutswapE&&& BOOLEAN&&&&&&&&&&&&&&&&&&&&& ProcessO&&& BOOLEAN&&&&&&&&&&&&&&&&&&&&& AddressSpaceI& &&BOOLEAN&&&&&&&&&&&&&&&&&&&&& AddressSpaceD&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& AddressCreationLock [9];&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& ForkInP&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& VmO&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& VmOperationE&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& PageDirectoryP&&& QWORD&&&&&&&&&&&&&&&&&&&&&&& LastFaultC&&& PVOID&&&&&&&&&&&&&&&&&&&&&&& VadR&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& VadH&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& CloneR&&& DWORD&&&&&&&&&&&&&&&&&& &&&&&NumberOfPrivateP&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& NumberOfLockedP&&& WORD&&&&&&&&&&&&&&&&&&&&&&&& w184;&&& BOOLEAN&&&&&&&&&&&&&&&&&&&&& ExitProcessC&&& BOOLEAN&&&&&&&&&&&&&&&&&&&&& CreateProcessR&&& HANDLE&&&&&&&&&&&&&&&&& &&&&&SectionH&&& struct _PEB&&&&&&&&&&&&&&&& *P&&&&&&&&&&&& // offset 0x1B0&&& PVOID&&&&&&&&&&&&&&&&&&&&&&& SectionBaseA&&& PVOID&&&&&&&&&&&&&&&&&&&&&&& QuotaB&&& NTSTATUS&&&&&&&&&&&&&&&&&&&& LastThreadExitS&&& PROCESS_WS_WATCH_INFORMATION WorkingSetW&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& InheritedFromUniqueProcessId;&&& ACCESS_MASK&&&&&&&&&&&&&&&&& GrantedA&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& DefaultHardErrorP&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& LdtI&&& DWORD&&& &&&&&&&&&&&&&&&&&&&&VadFreeH&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& VdmO&&& KMUTANT&&&&&&&&&&&&&&&&&&&&& ProcessM&&& BYTE&&&&&&&&&&&&&&&&&&&&&&&& ImageFileName [16];&&&&&&&&&&&&& // offset 0x1FC&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& VmTrimFaultValue [2];&&& PVOID&&&&&&&&&&&&&&&&&&&&&&& Win32P&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& d1F8;&&& DWORD&&&&&&&&&&&&&&&&&&&&&&& d1FC;&&& }&&&&&&& EPROCESS,&&&& * PEPROCESS,**PPEPROCESS;ImageFileName_EPROCESS0x1FCchar *ProcessName = (char*)PsGetCurrentProcess() + 0x1FC;KdPrint((“Current Process Name: %s
”, ProcessName));_EPROCESS_PEBProcessParametersProcessParametersDDKWinDbg!peb_PEB&& !pebDebugger extension library [F:WINNTsystem32
tsdexts] loadedPEB at 7FFDF000&&& InheritedAddressSpace:&&& No&&& ReadImageFileExecOptions: No&&& BeingDebugged:&&&&&&&&&&& Yes&&& ImageBaseAddress:&&&&&&&& &&& Ldr.Initialized: Yes&&& Ldr.InInitializationOrderModuleList: 131f88 . 132998&&& Ldr.InLoadOrderModuleList: 131ee0 . 132988&&& Ldr.InMemoryOrderModuleList: 131ee8 . 132990&&&&&&&
D:NtSysInfo.exe&&&&&&& 77F80000 F:WINNTSystem32
tdll.dll&&&&&&& 77E60000 F:WINNTsystem32KERNEL32.dll&&&&&&& 77DF0000 F:WINNTsystem32USER32.dll&&&&&&& 77F40000 F:WINNTsystem32GDI32.DLL&&&&&&& 76AF0000 F:WINNTsystem32comdlg32.dll&&&&&&& 70BD0000 F:WINNTsystem32SHLWAPI.DLL&&&&&&& 77D90000 F:WINNTsystem32ADVAPI32.dll&&&&&&& 77D20000 F:WINNTsystem32RPCRT4.DLL&&&&&&&
F:WINNTsystem32COMCTL32.DLL&&&&&&&
F:WINNTsystem32SHELL32.DLL&& &&&&& F:WINNTsystem32MSVCRT.DLL&&&&&&& 777C0000 F:WINNTSystem32WINSPOOL.DRV&&& SubSystemData:&&&& 0&&& ProcessHeap:&&&&&& 130000&&& ProcessParameters: 20000&&&&&&& WindowTitle:& 'D:NtSysInfo.exe'&&&&&&& ImageFile:&&& 'D:NtSysInfo.exe'&&&&&&& CommandLine:& '"D:NtSysInfo.exe" '&&&&&&& DllPath:&&&&& 'D:;.;F:WINNTSystem32;F:WINNTF:WINNT;F:WINNTsystem32;F:WINNT;F:WINNTSystem32WJ:WINDOWS;J:WINDOWSCOMMAND;E:WINDOWSSYSTEMWBEM;J:WINDOWS;J:WINDOWSCOMMAND;E:WINDOWSSYSTEMWBEM;J:WINDOWS;J:WINDOWSCOMMAND'&&&&&&& Environment:& 0x10000&WinDbgPEBProcessParameters0x20000ImageFilePorcessParamters_PEB_PEB0x7ffdf000WinDbgdb 0x7ffdf000 0x7ffdf000ProcessParameters_PEB0x100x20000db 0x20000ProcessParameters0x3C0x3C0x20670db 0x20670UNICODE PCWSTR GetCurrentProcessFileName(){&&&&&& DWORD dwAddress = (DWORD)PsGetCurrentProcess();&&&&&& if(dwAddress == 0 || dwAddress == 0xFFFFFFFF)&&&&&& &&&&&& return NULL;&&&&&& dwAddress += 0x1B0;&&&&&& if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;&&&&&& dwAddress += 0x10;&&&&&& if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;&&&&&& dwAddress += 0x3C;&&&&&& if((dwAddress = *(DWORD*)dwAddress) == 0) return 0;&&&&&& KdPrint((“Current Process Full Path Name: %ws
”,& (PCWSTR)dwAddress));&&&&&& return (PCWSTR)dwA}&Windows NTWindows 2000_EPROCESSWindows NTWindows NT &

我要回帖

更多关于 如何查看当前进程的id 的文章

 

随机推荐