整个代码太大, 两段主要的代码分别如下(一个HOOK API的驱动之中):创建JOB的进程处理中:ZwCreateJobObject( OUT PHANDLE JobHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes ) { ... ... //Object: Pointer to a variable that receives a pointer to the object's body. re =ObReferenceObjectByHandle( *JobHandle, 0, NULL, KernelMode, (PVOID *)&pObj, NULL); if(STATUS_SUCCESS == re ) { DbgPrint("************ %x************ \n",pObj); } .... ... } notepad 进程处理中:ZwCreateFile( OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength ) { ... ... DbgPrint("PsGetCurrentProcess()->Job info is %x \n",(PsGetCurrentProcess()->Job); ... ... ... }
这个测试过,是40000, 只是奇怪的是每一个*pObj的数值都是40000. ULONG pObj;... ... //Object: Pointer to a variable that receives a pointer to the object's body. re =ObReferenceObjectByHandle( *JobHandle, 0, NULL, KernelMode, (PVOID *)&pObj, NULL); if(STATUS_SUCCESS == re ) { DbgPrint("************ %x************ \n",pObj); DbgPrint("*pObj is %x \n",*((ULONG*)pObj)); } .... ...
The PsGetCurrentProcess routine returns a pointer to the process of the current thread,
声明是:
PEPROCESS PsGetCurrentProcess( VOID );应该可以用的吧。
可惜我不是要进程所有Job对象,
而是进程所属的JOB对象。
----------------------
你这里的地址是进程虚存中的一个高位系统地址把一个notepad进程放进了该job里面,然后再notepad进程里面使用PsGetCurrentProcess()->Job
发现这个job地址是:e10b2270。
--------------------
这个是内核地址。你可以使用WinDbg一看就知晓了
为什么这两个地址不一样呢?
ObReferenceObjectByHandle()
得到的,
应该确定是object的地址。
两段主要的代码分别如下(一个HOOK API的驱动之中):创建JOB的进程处理中:ZwCreateJobObject(
OUT PHANDLE JobHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
)
{
...
...
//Object: Pointer to a variable that receives a pointer to the object's body.
re =ObReferenceObjectByHandle(
*JobHandle,
0,
NULL,
KernelMode,
(PVOID *)&pObj,
NULL);
if(STATUS_SUCCESS == re )
{
DbgPrint("************ %x************ \n",pObj);
}
....
...
}
notepad 进程处理中:ZwCreateFile(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PLARGE_INTEGER AllocationSize OPTIONAL,
IN ULONG FileAttributes,
IN ULONG ShareAccess,
IN ULONG CreateDisposition,
IN ULONG CreateOptions,
IN PVOID EaBuffer OPTIONAL,
IN ULONG EaLength
)
{
...
... DbgPrint("PsGetCurrentProcess()->Job info is %x \n",(PsGetCurrentProcess()->Job);
...
...
...
}
这个测试过,是40000,
只是奇怪的是每一个*pObj的数值都是40000.
ULONG pObj;...
...
//Object: Pointer to a variable that receives a pointer to the object's body.
re =ObReferenceObjectByHandle(
*JobHandle,
0,
NULL,
KernelMode,
(PVOID *)&pObj,
NULL);
if(STATUS_SUCCESS == re )
{
DbgPrint("************ %x************ \n",pObj);
DbgPrint("*pObj is %x \n",*((ULONG*)pObj));
} ....
...
{
KPROCESS Pcb;
EX_PUSH_LOCK ProcessLock;
LARGE_INTEGER CreateTime;
LARGE_INTEGER ExitTime;
EX_RUNDOWN_REF RundownProtect;
PVOID UniqueProcessId;
LIST_ENTRY ActiveProcessLinks;
UINT32 QuotaUsage[3];
UINT32 QuotaPeak[3];
UINT32 CommitCharge;
UINT32 PeakVirtualSize;
UINT32 VirtualSize;
LIST_ENTRY SessionProcessLinks;
PVOID DebugPort;
PVOID ExceptionPort;
PHANDLE_TABLE ObjectTable;
EX_FAST_REF Token;
FAST_MUTEX WorkingSetLock;
UINT32 WorkingSetPage;
FAST_MUTEX AddressCreationLock;
UINT32 HyperSpaceLock;
PETHREAD ForkInProgress;
UINT32 HardwareTrigger;
PVOID VadRoot;
PVOID VadHint;
PVOID CloneRoot;
UINT32 NumberOfPrivatePages;
UINT32 NumberOfLockedPages;
PVOID Win32Process;
PEJOB Job;
PVOID SectionObject;
PVOID SectionBaseAddress;
PEPROCESS_QUOTA_BLOCK QuotaBlock;
PPAGEFAULT_HISTORY WorkingSetWatch;
PVOID Win32WindowStation;
PVOID InheritedFromUniqueProcessId;
PVOID LdtInformation;
PVOID VadFreeHint;
PVOID VdmObjects;
PVOID DeviceMap;
LIST_ENTRY PhysicalVadList;
union
{
HARDWARE_PTE_X86 PageDirectoryPte;
UINT64 Filler;
};
PVOID Session;
UCHAR ImageFileName[16];
LIST_ENTRY JobLinks;
PVOID LockedPagesList;
LIST_ENTRY ThreadListHead;
PVOID SecurityPort;
PVOID PaeTop;
UINT32 ActiveThreads;
UINT32 GrantedAccess;
UINT32 DefaultHardErrorProcessing;
INT32 LastThreadExitStatus;
PPEB Peb;
EX_FAST_REF PrefetchTrace;
LARGE_INTEGER ReadOperationCount;
LARGE_INTEGER WriteOperationCount;
LARGE_INTEGER OtherOperationCount;
LARGE_INTEGER ReadTransferCount;
LARGE_INTEGER WriteTransferCount;
LARGE_INTEGER OtherTransferCount;
UINT32 CommitChargeLimit;
UINT32 CommitChargePeak;
PVOID AweInfo;
SE_AUDIT_PROCESS_CREATION_INFO SeAuditProcessCreationInfo;
MMSUPPORT Vm;
UINT32 LastFaultCount;
UINT32 ModifiedPageCount;
UINT32 NumberOfVads;
UINT32 JobStatus;
UINT32 Flags; // bit0 - CreateReported
// bit1 - NoDebugInherit
// bit2 - ProcessExiting
// bit3 - ProcessDelete
// bit4 - Wow64SplitPages
// bit5 - VmDeleted
// bit6 - OutswapEnabled
// bit7 - Outswapped
// bit8 - ForkFailed
// bit9 - HasPhysicalVad
// bit10-11 - AddressSpaceInitialized
// bit12 - SetTimerResolution
// bit13 - BreakOnTermination
// bit14 - SessionCreationUnderway
// bit15 - WriteWatch
// bit16 - ProcessInSession
// bit17 - OverrideAddressSpace
// bit18 - HasAddressSpace
// bit19 - LaunchPrefetched
// bit20 - InjectInpageErrors
// bit21 - VmTopDown
// bit22 - Unused3
// bit23 - Unused4
// bit24 - VdmAllowed
// bit25-29 - Unused
// bit30 - Unused1
// bit31 - Unused2
INT32 ExitStatus;
USHORT NextPageColor;
union
{
struct
{
UCHAR SubSystemMinorVersion;
UCHAR SubSystemMajorVersion;
};
USHORT SubSystemVersion;
};
UCHAR PriorityClass;
UCHAR WorkingSetAcquiredUnsafe;
UCHAR Unknow1;
UCHAR Unknow2;
UINT32 Cookie;
} EPROCESS, *PEPROCESS;
只能直接用偏移地址 +0x134 。OK,一个比较龌龊的方法。