首页
社区
课程
招聘
[原创]关于在Ring0中读取/修改PEB
发表于: 2008-8-22 15:35 13385

[原创]关于在Ring0中读取/修改PEB

2008-8-22 15:35
13385

文章很菜,大牛飘过,如有纰漏,欢迎指正。  

上次看到http://bbs.pediy.com/showthread.php?t=69730中的一些回复,说是在驱动中修改PEB是不行的。
我寻思着NtReadProcessMemory/NtWriteProcessMemory读写用户空间也是KeStackAttachProcess到目标进程然后RtlCopyMemory的,所以在驱动中,Attach到目标进程然后读取/写入PEB应该是可行的,许多Ring3的程序不就这么做么?

另外对用户空间的操作应该使用ProbeForRead/ProbeForWrite来检查一下~

本程序省略此步骤。

经过实验,证明是可行的。
代码如下:

//===============================
NTKERNELAPI
NTSTATUS
PsLookupProcessByProcessId(
                           HANDLE ProcessId,
                           PEPROCESS *Process
                           );

NTKERNELAPI
VOID
KeAttachProcess (
                 PEPROCESS Process
                 );

NTKERNELAPI
VOID
KeDetachProcess (
                 VOID
                 );

typedef struct _PEB_LDR_DATA {
        ULONG                   Length;
        BOOLEAN                 Initialized;
        PVOID                   SsHandle;
        LIST_ENTRY              InLoadOrderModuleList;
        LIST_ENTRY              InMemoryOrderModuleList;
        LIST_ENTRY              InInitializationOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;

typedef struct _LDR_DATA_TABLE_ENTRY {
        LIST_ENTRY InLoadOrderLinks;
        LIST_ENTRY InMemoryOrderLinks;
        LIST_ENTRY InInitializationOrderLinks;
        PVOID DllBase;
        PVOID EntryPoint;
        ULONG SizeOfImage;
        UNICODE_STRING FullDllName;
        UNICODE_STRING BaseDllName;
        ULONG Flags;
        USHORT LoadCount;
        USHORT TlsIndex;
        union {
                LIST_ENTRY HashLinks;
                struct {
                        PVOID SectionPointer;
                        ULONG CheckSum;
                };
        };
        union {
                struct {
                        ULONG TimeDateStamp;
                };
                struct {
                        PVOID LoadedImports;
                };
        };
        struct _ACTIVATION_CONTEXT * EntryPointActivationContext;
        PVOID PatchInformation;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

NTSTATUS ModifyModuleName()
{
        NTSTATUS status;
        PEPROCESS Process;
        ULONG ulPEB;
        PPEB_LDR_DATA pLdr;
        PLDR_DATA_TABLE_ENTRY pLdt = NULL;
        PLIST_ENTRY pList,pHead;
        wchar_t wszFakePath[] = L"0GiNr.com";

        status = PsLookupProcessByProcessId(
                (HANDLE)1356,
                &Process);//exporer.exe的pid

        if ( !NT_SUCCESS(status) ) {
                dprintf("PsLookupProcessByProcessId = 0x%08lX",status);
                return status;
        }
        ObDereferenceObject(Process);
       
        KeAttachProcess(Process);

        dprintf("Process : 0x%08lX. \n",Process);
        ulPEB = *(ULONG *)((ULONG)Process + 0x1B0);
        dprintf("PEB : 0x%08lX. \n",ulPEB);
       
        __try {

                pLdr = *(PPEB_LDR_DATA *)(ulPEB + 0x00C);
                dprintf("Ldr : 0x%08lX. \n",pLdr);
                pHead = pLdr->InLoadOrderModuleList.Flink;
                pList = pHead;

                do {
                        pLdt = CONTAINING_RECORD(
                                pList,
                                LDR_DATA_TABLE_ENTRY,
                                InLoadOrderLinks);

                        if ( pLdt->EntryPoint &&
                                pLdt->FullDllName.Buffer &&
                                pLdt->BaseDllName.Buffer &&
                                pLdt->DllBase )
                        {
                                dprintf("FullDllName : %S \n",pLdt->FullDllName.Buffer);
                                dprintf("BaseDllName : %S \n",pLdt->BaseDllName.Buffer);
                                dprintf("DllBase : 0x%08lX. \n",pLdt->DllBase);
                                dprintf("DllSize : 0x%08lX. \n",pLdt->SizeOfImage);
                                dprintf("--------------");
                                //DllBase : 0x7C800000.
                                if ( (ULONG)pLdt->DllBase == 0x7C800000 ) {
                                        dprintf("Modify.");
                                        dprintf("--------------");
                                        wcscpy(pLdt->FullDllName.Buffer,wszFakePath);
                                        wcscpy(pLdt->BaseDllName.Buffer,wszFakePath);
                                                            //断链也是可以的。
                                        /*pLdt->InLoadOrderLinks.Blink->Flink =
                                                pLdt->InLoadOrderLinks.Flink;
                                        pLdt->InLoadOrderLinks.Flink->Blink =
                                                pLdt->InLoadOrderLinks.Blink;

                                        pLdt->InInitializationOrderLinks.Blink->Flink =
                                                pLdt->InInitializationOrderLinks.Flink;
                                        pLdt->InInitializationOrderLinks.Flink->Blink =
                                                pLdt->InInitializationOrderLinks.Blink;

                                        pLdt->InMemoryOrderLinks.Blink->Flink =
                                                pLdt->InMemoryOrderLinks.Flink;
                                        pLdt->InMemoryOrderLinks.Flink->Blink =
                                                pLdt->InMemoryOrderLinks.Blink;*/
                                }
                        }

                        pList = pList->Flink;
                } while ( pList != pHead );

        } __except(EXCEPTION_EXECUTE_HANDLER) {
                status = GetExceptionCode();
                dprintf("GetExceptionCode() = 0x%08lX. \n",status );
        }
        KeDetachProcess();

        return status;
}


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (17)
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
2
沙发学习~~
2008-8-22 16:00
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
占位   
2008-8-22 16:13
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
代码好象不全啊,驱动入口也没有。
2008-8-22 16:16
0
雪    币: 564
活跃值: (42)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
5
支持
。。。。。。。
2008-8-22 16:26
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
终于被楼主证实了,就是一个进程空间的问题啊
2008-8-22 17:44
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
7
小伟大叔。

顶顶顶顶。~
2008-8-22 19:58
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8

就是很简单的问题啊~

然后

回百折不挠:一个函数而已咯~
2008-8-22 20:47
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
9
不用ofset
要用psgetprocesspeb
2008-8-22 22:37
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
10
小伟叔叔阿 以后不要用offset了

不然打PP

放着好用的函数不用 故意用offset 该打!
2008-8-22 22:38
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
支持大叔 .
2008-8-22 22:46
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
12
ring3下能实现的东西,ring0下全部都能实现(除去稳定性一般人是做不到外),这个是肯定的,
ring0下能实现的东西,ring3下就不一定能实现了

这是因为ring3中建立是ring0的基础之上
2008-8-22 23:59
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
13
请教LS如何在ring0引发一个特权指令异常?
2008-8-23 01:09
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
14
vmcall ?

是不是可以进ring -1 ? 還是火星好~。
2008-8-23 02:05
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
15
买不起intelvt和amdv啊
2008-8-23 17:02
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
16
来一个IRQL 〉APC_LEVEL依然有效的例子吧
2008-8-23 23:50
0
雪    币: 147
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
先占座,上次的问题是我提得,PEB是可以读和改的,但是ldr还不知道能不,我测试下先,谢谢小伟阿~
2008-8-27 16:09
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
18
Ldr当然也是可以的
2008-8-27 22:13
0
游客
登录 | 注册 方可回帖
返回
//