- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
在上一个帖子中,我把我保护的那个进程 From1.exe DebugPort调试端口值 清零了,OD调试器接受不到调试信息了,所以OD废了。在上图,我们也发现DebugPort 值全为0 ,这正常的,因为我没用OD调试 里面的任何进程。如果OD调试某进程的话,那么某进程的 DebugPort 值 就会变为 一个具体的数值,好像是一个 很小很小的负数。
-------------------------------
说完 DebugPort 值 ,继续。我们接下来的 连载。。。。,说得很少,很多不懂得知识点,可以直接回帖,或者百度。
-------------------------------
菜鸟驱动连载.内核实现遍历进程PID和进程名和DebugPort值,是依据进程链来遍历的,也就是依据进程的结构体的基址 来遍的。
------------------------------
这种遍历方法其实可以吧 隐藏的进程也可以 遍历出来的,因为我们是在内核里面遍历进程。。。xuetr的遍历就是采用驱动的。
本次遍历我们主要是进程名和进程PID 值。这2个东东在内核编程中有很大的用处,很多做内核 HOOK的技术都会用到这2东西。
-----------------------------
#include <ntddk.h>
PETHREAD pThreadObj = NULL;
BOOLEAN bTerminated = FALSE;
UCHAR szProcessName[10] = "Form1.exe";
extern POBJECT_TYPE *PsProcessType;
extern POBJECT_TYPE *PsThreadType;
VOID DriverUnload(PDRIVER_OBJECT pDriverObject);
VOID AntiDbgThread(PVOID pContext);
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath)
{
OBJECT_ATTRIBUTES ObjAddr = {0};
HANDLE ThreadHandle = 0;
NTSTATUS NtStatus = STATUS_SUCCESS;
KdPrint(("Driver Entry"));
pDriverObject->DriverUnload = DriverUnload;
InitializeObjectAttributes(&ObjAddr,NULL,OBJ_KERNEL_HANDLE,0,NULL);
NtStatus = PsCreateSystemThread(&ThreadHandle,THREAD_ALL_ACCESS,&ObjAddr,NULL,NULL,AntiDbgThread,NULL);
if(NT_SUCCESS(NtStatus))
{
KdPrint(("Thread Created"));
NtStatus = ObReferenceObjectByHandle(ThreadHandle,THREAD_ALL_ACCESS,*PsThreadType,KernelMode,&pThreadObj,NULL);
ZwClose(ThreadHandle);
if(!NT_SUCCESS(NtStatus))
{
bTerminated = TRUE;
}
}
return NtStatus;
}
VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
bTerminated = TRUE;
KeWaitForSingleObject(pThreadObj,Executive,KernelMode,FALSE,NULL);
ObDereferenceObject(pThreadObj);
}
VOID AntiDbgThread(PVOID pContext)
{
PEPROCESS pCurrentProcess = NULL;
PEPROCESS pFirstProcess = NULL;
LARGE_INTEGER inteval;
char *ProcessName;//进程名
ULONG PID;//进程pid
ULONG DebugPort;//调试端口
inteval.QuadPart = -20000000;
KeSetPriorityThread(KeGetCurrentThread(),LOW_REALTIME_PRIORITY);
pCurrentProcess = IoGetCurrentProcess();
pFirstProcess = pCurrentProcess;
// 操作系统win7 32位 版 进程结构偏移 如下:
// +0x16c ImageFileName //进程名 偏移
// +0x0b8 ActiveProcessLinks //进程链,下一个 进程结构 偏移
// +0x0ec DebugPort //传说中的调试端口 偏移
//操作系统xp sp3 版的进程结构偏移 如下
// +0x174 ImageFileName //进程名 偏移
// +0x088 ActiveProcessLinks //进程链,下一个 进程结构 偏移
// +0x0bc DebugPort //传说中的调试端口 偏移
while(1) //当前进程名
{
pCurrentProcess= (PEPROCESS)(*(PULONG)((ULONG)pCurrentProcess + 0xb8) - 0xb8);//至于这个,大家自己想,这个是+b8是进程链 ActiveProcessLinks 节点,这个节点减去 +b8 其实就是下一个进程的 进程结构基址,神奇的东东。。
ProcessName = (char*)((ULONG)pCurrentProcess+ 0x16C);//进程名
PID=PsGetProcessId(pCurrentProcess);//进程PID
DebugPort=*(PULONG)((ULONG)pCurrentProcess + 0xec);//进程端口
KdPrint(("DebugPort调试端口值%d 进程名: %s 进程PID:%d \n",DebugPort, ProcessName,PID));
if(pCurrentProcess == pFirstProcess)
{
// KdPrint(("进程链表遍历结束,退出进程链表遍历"));
goto END;
}
}
END:
KeDelayExecutionThread(KernelMode,FALSE,&inteval);
}
以上代码,注意是win7 32 位系统,才能通过的,如果你是xp系统推荐 把偏移修改下即可,绿色那部分就是,我注释了的。
如果你是 win7 64 位系统, OK你还是洗洗睡吧,或者换个win7 32 位系统,再或者 你向 微软 去 购买驱动签名。
|
|