阅读:2818回复:8
如何获取启动进程的程序目录??
大家好,有一个小问题请教一下:
在DRIVER中,知道了进程的ID及进程的名字,如: Oicq.exe 1072 我如何才能知道这个进程的详细路径?? 比如:D:\\Program Files\\Oicq\\Oicq.exe How can I do this? :P :P :P |
|
|
沙发#
发布于:2002-04-15 16:52
和Ring3通信,在Ring3用GetModuleFileNameEx得到。
|
|
板凳#
发布于:2002-04-15 17:09
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2002-04-15 17:50
这是前一阵子哪位大侠的贴子,我把它存了下来,仅作参考:
if ( Irp ) { pEthread = Irp->Tail.Overlay.Thread; }else { pEthread = PsGetCurrentThread(); } if (!pEthread)... //error pREProcess = pEthread->ThreadsProcess; if (!pREProcess ).... //error dwRProcessId = pREProcess->UniqueProcessId; InitializeObjectAttributes( &RObjectAttributes, 0, 0, 0, 0 ); RClientId.UniqueProcess = (HANDLE)dwRProcessId; RClientId.UniqueThread = 0; ntRStatus = ZwOpenProcess( &hRProcess, PROCESS_ALL_ACCESS,&RObjectAttributes, &RClientId ); if( !NT_SUCCESS(ntRStatus) ) .. //error ntRStatus = ZwReadVirtualMemory( hRProcess, pREProcess->Peb,&Peb, sizeof(Peb), &dwRReturnedBytes ); if( !NT_SUCCESS(ntRStatus) ) .. //error if(! Peb.ProcessParameters )... //error ntRStatus = ZwReadVirtualMemory( hRProcess, Peb.ProcessParameters, &PebParams, sizeof(PebParams), &dwRReturnedBytes ); if( !NT_SUCCESS(ntRStatus) ) .. //error pRCommandLine = PebParams.ApplicationName.Buffer; nRSize = PebParams.ApplicationName.Length; if( pRCommandLine && nRSize > 0 && nRSize < 2048 ) { pLocalCommandLine = ExAllocatePool( NonPagedPool, nRSize +2); RtlZeroMemory(pLocalCommandLine , nRSize +2); ntRStatus = ZwReadVirtualMemory( hRProcess, pRCommandLine, pLocalCommandLine, nRSize, &dwRReturnedBytes ); if( !NT_SUCCESS(ntRStatus)) ..//error RtlInitUnicodeString(&UCmdLine,pLocalCommandLine); AnsiStr.Buffer = NULL; RtlUnicodeStringToAnsiString (&AnsiStr, &UCmdLine, TRUE); strncpy(ProcessName, AnsiStr.Buffer, min (AnsiStr.Length, PROCNAMELEN -1)); RtlFreeAnsiString(&AnsiStr); |
|
|
地下室#
发布于:2002-04-18 01:06
这段代码可是有许多函数找不到原型呀,如ZwReadVirtualMemory,
ZwOpenProcess,等等。 哪位可以告诉我,如何让楼上的代码执行!! |
|
|
5楼#
发布于:2002-04-18 10:19
NTSYSAPI
NTSTATUS NTAPI ZwReadVirtualMemory( IN HANDLE hProcess, IN PVOID BaseAddress, OUT PVOID Buffer, IN ULONG BytesToRead, OUT PULONG BytesRead ); NTSYSAPI NTSTATUS NTAPI ZwOpenProcess( OUT PHANDLE phProcess, IN ACCESS_MASK AccessMask, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID pClientId ); 你要自己加原型,link时有ntoskrnl.lib就成 |
|
6楼#
发布于:2002-04-18 16:49
很想给分呀,兄弟干脆,把PEB, ETHREAD的结果也贴出来吧
因为我似乎调不出来 |
|
|
7楼#
发布于:2002-04-18 17:30
“结果”?是“结构”吗?
typedef struct _KTHREAD { DISPATCHER_HEADER Header; LIST_ENTRY MutantListHead; PVOID InitialStack; PVOID StackLimit; struct _TEB *Teb; PVOID TlsArray; PVOID KernelStack; BOOLEAN DebugActive; UCHAR State; USHORT Alerted; UCHAR Iopl; UCHAR NpxState; UCHAR Saturation; UCHAR Priority; KAPC_STATE ApcState; ULONG ContextSwitches; NTSTATUS WaitStatus; UCHAR WaitIrql; UCHAR WaitMode; UCHAR WaitNext; UCHAR WaitReason; PKWAIT_BLOCK WaitBlockList; LIST_ENTRY WaitListEntry; ULONG WaitTime; UCHAR BasePriority; UCHAR DecrementCount; UCHAR PriorityDecrement; UCHAR Quantum; KWAIT_BLOCK WaitBlock[4]; ULONG LegoData; ULONG KernelApcDisable; ULONG UserAffinity; BOOLEAN SystemAffinityActive; #if (_WIN32_WINNT < 0x0500) UCHAR Pad[3]; #else // (_WIN32_WINNT >= 0x0500) UCHAR PowerState; UCHAR NpxIrql; UCHAR Pad[1]; #endif // (_WIN32_WINNT >= 0x0500) PSERVICE_DESCRIPTOR_TABLE ServiceDescriptorTable; PKQUEUE Queue; KSPIN_LOCK ApcQueueLock; KTIMER Timer; LIST_ENTRY QueueListEntry; ULONG Affinity; BOOLEAN Preempted; BOOLEAN ProcessReadyQueue; BOOLEAN KernelStackResident; UCHAR NextProcessor; PVOID CallbackStack; PVOID Win32Thread; PKTRAP_FRAME TrapFrame; PKAPC_STATE ApcStatePointer[2]; #if (_WIN32_WINNT >= 0x0500) UCHAR PreviousMode; #endif // (_WIN32_WINNT >= 0x0500) BOOLEAN EnableStackSwap; BOOLEAN LargeStack; UCHAR ResourceIndex; #if (_WIN32_WINNT < 0x0500) UCHAR PreviousMode; #endif // (_WIN32_WINNT < 0x0500) ULONG KernelTime; ULONG UserTime; KAPC_STATE SavedApcState; BOOLEAN Alertable; UCHAR ApcStateIndex; BOOLEAN ApcQueueable; BOOLEAN AutoAlignment; PVOID StackBase; KAPC SuspendApc; KSEMAPHORE SuspendSemaphore; LIST_ENTRY ThreadListEntry; UCHAR FreezeCount; UCHAR SuspendCount; UCHAR IdealProcessor; BOOLEAN DisableBoost; } KTHREAD, *PKTHREAD; typedef struct _ETHREAD { KTHREAD Tcb; LARGE_INTEGER CreateTime; union { LARGE_INTEGER ExitTime; LIST_ENTRY LpcReplyChain; }; union { NTSTATUS ExitStatus; PVOID OfsChain; }; LIST_ENTRY PostBlockList; LIST_ENTRY TerminationPortList; KSPIN_LOCK ActiveTimerListLock; LIST_ENTRY ActiveTimerListHead; CLIENT_ID Cid; KSEMAPHORE LpcReplySemaphore; PLPC_MESSAGE LpcReplyMessage; ULONG LpcReplyMessageId; ULONG PerformanceCountLow; PPS_IMPERSONATION_INFORMATION ImpersonationInfo; LIST_ENTRY IrpList; PVOID TopLevelIrp; PDEVICE_OBJECT DeviceToVerify; ULONG ReadClusterSize; BOOLEAN ForwardClusterOnly; BOOLEAN DisablePageFaultClustering; BOOLEAN DeadThread; #if (_WIN32_WINNT >= 0x0500) BOOLEAN HideFromDebugger; #endif // (_WIN32_WINNT >= 0x0500) #if (_WIN32_WINNT < 0x0500) BOOLEAN HasTerminated; #else // (_WIN32_WINNT >= 0x0500) ULONG HasTerminated; #endif // (_WIN32_WINNT >= 0x0500) #if (_WIN32_WINNT < 0x0500) PKEVENT_PAIR EventPair; #endif // (_WIN32_WINNT < 0x0500) ACCESS_MASK GrantedAccess; PEPROCESS ThreadsProcess; PKSTART_ROUTINE StartAddress; union { PVOID Win32StartAddress; ULONG LpcReceivedMessageId; }; BOOLEAN LpcExitThreadCalled; BOOLEAN HardErrorsAreDisabled; BOOLEAN LpcReceivedMsgIdValid; BOOLEAN ActiveImpersonationInfo; ULONG PerformanceCountHigh; #if (_WIN32_WINNT >= 0x0500) LIST_ENTRY ThreadListEntry; #endif // (_WIN32_WINNT >= 0x0500) } ETHREAD, *PETHREAD; typedef struct _TEB { NT_TIB Tib; PVOID EnvironmentPointer; CLIENT_ID ClientId; HANDLE RpcHandle; PVOID *ThreadLocalStorage; PVOID Peb; ULONG LastErrorValue; } TEB, *PTEB; |
|
8楼#
发布于:2002-04-18 21:55
强烈表示对pjf的敬意。
我这么就找不到呢?唉,我笨 |
|
|