自己创建了一个JOB, 内核对象的地址是:0x82A5CB58。把一个notepad进程放进了该job里面,然后再notepad进程里面使用PsGetCurrentProcess()->Job
发现这个job地址是:e10b2270。为什么这两个地址不一样呢?

解决方案 »

  1.   

    PsGetCurrentProcess()得到的是系统当前进程块信息,具体进程的地址,需要去找,而不能直接得到
      

  2.   

    啊,msdn上写:
    The PsGetCurrentProcess routine returns a pointer to the process of the current thread,
    声明是:
    PEPROCESS   PsGetCurrentProcess(    VOID    );应该可以用的吧。
      

  3.   

    兄台,你搞错了应该是EPROCESS里面的LIST_ENTRY JobLinks;这个是进程所有Job对象的双向链表
      

  4.   

    怎么遍历LIST_ENTRY不用我教吧?
      

  5.   

    谢谢三楼的,
    可惜我不是要进程所有Job对象,
    而是进程所属的JOB对象。
      

  6.   

    自己创建了一个JOB, 内核对象的地址是:0x82A5CB58。
    ----------------------
    你这里的地址是进程虚存中的一个高位系统地址把一个notepad进程放进了该job里面,然后再notepad进程里面使用PsGetCurrentProcess()->Job
    发现这个job地址是:e10b2270。
    --------------------
    这个是内核地址。你可以使用WinDbg一看就知晓了
    为什么这两个地址不一样呢?
      

  7.   

    0x82A5CB58是你打印的作业对象的句柄值吧?
      

  8.   

    0x82A5CB58是使用函数
    ObReferenceObjectByHandle()
    得到的,
    应该确定是object的地址。
      

  9.   

    整个代码太大,
    两段主要的代码分别如下(一个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);
    ...
    ...
    ...
    }
      

  10.   

    ObReferenceObjectByHandle把你提供的句柄转换成一个指向下层内核对象的指针。0x82A5CB58是指针的地址,所以在你的进程高位,但是它指向的是内核Object的e10b2270你DbgPrint *pObj看看
      

  11.   


    这个测试过,是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));
    } .... 
    ... 
      

  12.   

    莫非是个人的EPROCESS出了问题?我的系统是windows xp.使用了这个结构体:typedef struct _EPROCESS
    {
    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;
      

  13.   

    遍历LIST_ENTRY JobLinks试试看?
      

  14.   

    估计是版本不一致所致。
    只能直接用偏移地址 +0x134 。OK,一个比较龌龊的方法。