进程线程这块都被人玩滥了......都是些过时了的东西,做为新手,我还是拿来耍耍。
#include <Ntifs.h>
#include <ntddk.h>
//结构体是根据windbg查看得出来的。
typedef struct _HANDLE_TABLE
{
ULONG_PTR TableCode;
PEPROCESS QuotaProcess;
PVOID UniqueProcessId;
EX_PUSH_LOCK HandleTableLock[4];
ULONG HandleTableList[2];
EX_PUSH_LOCK HandleContentionEvent;
ULONG DebugInfo;
LONG ExtraInfoPages;
ULONG FirstFree;
ULONG LastFree;
ULONG NextHandleNeedingPool;
LONG HandleCount;
union
{
ULONG Flags;
UCHAR StrictFIFO:1;
};
} HANDLE_TABLE, *PHANDLE_TABLE;
void Handle_EnumProcess()
{
//_asm int 3
PHANDLE_TABLE HandleTable;
ULONG HandleTableListHead = 0x805636c8;//我的环境是xp sp3 我就用了一个固定值。没用通过特征码的方法去定位。。。人懒,没办法。。。
ULONG Count = 1;
HandleTable = (PHANDLE_TABLE)((*(ULONG*)HandleTableListHead)-0x1c);
while((ULONG)(HandleTable->HandleTableList[0]) != 0x805636c8)
{
DbgPrint("%d:%x\n",Count,HandleTable->QuotaProcess);
HandleTable = (PHANDLE_TABLE)((HandleTable->HandleTableList[0])-0x1c);
}
}
VOID DriverUnLoad(PDRIVER_OBJECT Driver)
{
KdPrint(("Driver UnLoaded!\n"));
}
extern "C"
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING Reg)
{
Handle_EnumProcess();
pDriverObject->DriverUnload=DriverUnLoad;
return STATUS_SUCCESS;
}
特征码定位 HandleTableListHead 的方法网上也用到的很多,不光这里。比如定位swapcontex...很多时候都会用到。我们看下通地IDA分析内核文件看对
HandleTableListHead 的引用。
大家可以自行发挥哦。。。