首页
社区
课程
招聘
[求助]获取EProcess中的Peb结构出错
发表于: 2010-11-7 13:16 9453

[求助]获取EProcess中的Peb结构出错

2010-11-7 13:16
9453
如题。这是代码:
	ulPeb = (ULONG)peProcess+0x1b0;
	ulPeb = *(PULONG)ulPeb;//获取到的Peb地址为0x7ffdc000


                ulParameters = ulPeb+0x010;
	ulParameters = *(PULONG)ulParameters;//这里就直接BSOD了。。。。


偏移量应该是没问题的啊,WinDbg:
dt _EPROCESS
ntdll!_EPROCESS
  ..............
   +0x1ac LastThreadExitStatus : Int4B
   +0x1b0 Peb              : Ptr32 _PEB
   +0x1b4 PrefetchTrace    : _EX_FAST_REF
   .............

dt _PEB
ntdll!_PEB
   ...........
   +0x00c Ldr              : Ptr32 _PEB_LDR_DATA
   +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS
   +0x014 SubSystemData    : Ptr32 Void
   ............

我调试的是Windows XP SP3,实在看不出什么问题了。各位大牛帮帮忙吧。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 306
活跃值: (85)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
ulParameters = (ULONG)((ULONG)*ulPeb+0x010);

不太懂,试试这个..
2010-11-7 13:31
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3
peb属于用户空间,故而要 _try
2010-11-7 13:39
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
4
_try
{
   ulPeb = *(DWORD*)((DWORD)peProcess+0x1b0);
   if(!ulPeb)
   {
     _leave;  
   }
   if(!MmIsAddressValid((PVOID)ulPeb))
   {
      _leave;
   }
   ulParameters = (PRTL_USER_PROCESS_PARAMETERS)*(DWORD *)((DWORD)ulPeb+0x010);
   ....
   ....
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
    DbgPrint("peb errorr\r\n");
}
2010-11-7 13:54
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
呃。。小弟不才,_leave是什么意思啊?是不是__asm leave?用了貌似也没效果啊。。。。
2010-11-7 14:18
0
雪    币: 1103
活跃值: (496)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我是新手,遇到过这样的问题,找了资料,也不知道对不对:
peb属于用户空间,system进程无法访问win32k.sys空间 所以attach别的进程
KeAttachProcess(EProc);
//取得Peb结构代码
...
KeDetachProcess();
2010-11-7 14:30
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
试了下楼上的代码 好像还是不行
2010-11-7 14:48
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
8
片段代码肯定没问题,问题在于全幅,,,方便就把代码丢上来吧。。

还有就是,刚才我说了peb是用户空间,如果要操作,确实需要挂靠到该进程上。
2010-11-7 14:52
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好的 这是全部代码

我挂靠到进程上依然有问题额。。。。
	PEPROCESS peProcess;
	ULONG ulTeb;
	ULONG ulPeb;
	ULONG ulParameters;
	KAPC_STATE pProcessApc;

	__try
	{
	peProcess = *(PEPROCESS*)((ULONG)peThread+0x220);
	ulPeb = *(DWORD*)((DWORD)peProcess+0x1b0);
	
	KeStackAttachProcess(peProcess,&pProcessApc);

	if(!ulPeb)
	{
		return -1;
	}
	
               if(!MmIsAddressValid((PVOID)ulPeb))
	{

		return -1;
	 }
	ulParameters = *(PULONG)((ULONG)ulPeb+0x010);

	ptInfo->dwProcessID = *(PULONG)((ULONG)peProcess+0x084);
	ptInfo->uFilePathLength = *(PUSHORT)(ulParameters+0x038);
	ptInfo->uCommandLineLength = *(PUSHORT)(ulParameters+0x040);

	RtlCopyMemory(&ptInfo->wFilePath,
		(void *)((ULONG)(*(PULONG)(ulParameters+0x038))+0x004),
		ptInfo->uFilePathLength*);
	RtlCopyMemory(&ptInfo->wCommandLine,
		(void *)((ULONG)(*(PULONG)(ulParameters+0x040))+0x004),
		ptInfo->uCommandLineLength);

	RtlCopyMemory(&ptInfo->szImageName,
		(void *)((ULONG)peProcess+0x174),16);

	KeUnstackDetachProcess(&pProcessApc); 
	return 1;
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		KdPrint(("peb errorr\r\n"));
	} 
	
	return 0;
}
2010-11-7 15:03
0
雪    币: 1103
活跃值: (496)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我是取得_PEB_LDR_DATA的结构,用KeAttachProcess(EProc);KeDetachProcess(); 是没有问题的
2010-11-7 15:18
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
11
你这代码看得好乱啊,给你一个从peb获取结构的例子吧  - -#

#include "ntifs.h"
#include "GetSystemVersion.h"

DWORD GetDllNameFromPeb(PEPROCESS Process)
{

        DWORD PebOffset=0;
        DWORD Peb;
        PPEB_LDR_DATA PebLdr;
        PLDR_DATA_TABLE_ENTRY LdrTableEntry;
        PLIST_ENTRY pListHead,pListNext;
       
        WIN_VER_DETAIL WinVer;
        BOOL bRetOK = FALSE;

        __try
        {
                WinVer=GetWindowsVersion();
                switch (WinVer)
                {
                case WINDOWS_VERSION_XP:     //xp
                        PebOffset=0x1b0;
                        break;
                case WINDOWS_VERSION_2K3:     //2003
                        PebOffset=0x190;
                        break;
                case WINDOWS_VERSION_2K3_SP1_SP2:     //2003
                        PebOffset=0x1a0;
                        break;
                case WINDOWS_VERSION_VISTA_2008:     //Vista+2008
                        PebOffset=0x188;
                        break;
                        /*case 6002:     //2008
                        PebOffset=0x188;
                        break;*/
                case WINDOWS_VERSION_7:     //win7
                        PebOffset=0x1a8;
                        break;
                }
                if (PebOffset==0)
                {
                        bRetOK = FALSE;
                        __leave;
                }
                Peb=*(DWORD*)((DWORD)Process+PebOffset);
                if (Peb == 0)
                {
                        DbgPrint("Peb is null\n");
                        bRetOK = FALSE;
                        __leave;
                }
                PebLdr=(PPEB_LDR_DATA)*(DWORD*)(Peb+0x0C);
                if (!MmIsAddressValid(PebLdr))
                {
                        DbgPrint("PebLdr offset is null\n");
                        bRetOK = FALSE;
                        __leave;
                }
                pListHead=&PebLdr->InLoadOrderModuleList;
                pListNext=pListHead->Flink;
                while (pListHead!=pListNext)
                {
                        LdrTableEntry=(PLDR_DATA_TABLE_ENTRY)pListNext;
                        if (MmIsAddressValid(&LdrTableEntry->BaseDllName.Buffer[LdrTableEntry->BaseDllName.Length]))
                        {
                                DbgPrint("DllBase:%x  dll path %ws\n",LdrTableEntry->DllBase,LdrTableEntry->BaseDllName.Buffer);
                        }
                        pListNext=pListNext->Flink;

                }
                bRetOK = TRUE;
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
                DbgPrint("GetDllNameFromPeb Error \r\n");
        }
        return bRetOK;
}
#pragma LOCKEDDATA
PEPROCESS GetEprocessFromPid(DWORD Pid)
{
        HANDLE hProcess;
        NTSTATUS status;
        OBJECT_ATTRIBUTES ObjectAttributes;
        PEPROCESS Process;
        CLIENT_ID ClientId={0};
        ClientId.UniqueProcess = (HANDLE)Pid;
        InitializeObjectAttributes( &ObjectAttributes, NULL, 0, NULL, NULL );
        status=ZwOpenProcess(&hProcess,PROCESS_ALL_ACCESS,&ObjectAttributes,&ClientId);
        if (!NT_SUCCESS(status))
        {
                return NULL;
        }
        status = ObReferenceObjectByHandle (hProcess,
                PROCESS_ALL_ACCESS,
                *PsProcessType,
                KernelMode,
                (PVOID *)&Process,
                NULL);
        if (!NT_SUCCESS(status))
        {
                ZwClose(hProcess);
        }
        ObDereferenceObject(Process);

        return Process;
}
VOID DriverUnload( IN PDRIVER_OBJECT DriverObject )
{

        return STATUS_SUCCESS;
}
NTSTATUS DriverEntry(
    IN OUT PDRIVER_OBJECT   DriverObject,
    IN PUNICODE_STRING      RegistryPath
    )
{
       
    PEPROCESS Eprocess;
        BOOL bRet;

    DriverObject->DriverUnload = DriverUnload;

        KdPrint(("DriverLoad\n"));
       
        Eprocess=GetEprocessFromPid(1912);

        if (Eprocess==NULL)
        {
                KdPrint(("get eprocess failed\n"));
                return STATUS_SUCCESS;
        }
        KeAttachProcess(Eprocess);
        bRet=GetDllNameFromPeb(Eprocess);
        if (!bRet)
        {
                KdPrint(("get dllname failed\n"));
        }

        KeDetachProcess();

    return STATUS_SUCCESS;
}
上传的附件:
2010-11-7 15:21
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢大家,KeAttachProcess(EProc);KeDetachProcess(); 就没问题了。
2010-11-7 15:25
0
游客
登录 | 注册 方可回帖
返回
//