首页
社区
课程
招聘
[原创]获取被挂起进程基址小技巧(傀儡进程)
发表于: 2019-7-29 15:13 10496

[原创]获取被挂起进程基址小技巧(傀儡进程)

2019-7-29 15:13
10496

创建傀儡进程时,一般以挂起模式创建一个系统进程,如:svchost.exe

然后调用未导出NT函数NtQueryInformationProcess来获取目标进程的PEB地址,拿到PEB地址后,再通过ReadProcessMemory获取目标进程的PEB数据,
最后NtUnMapViewOfSection,传入PEB结构中的ImageBaseAddress来卸载目标进程的内存。

其实可以直接通过GetThreadContext这个函数来直接获取PEB地址,在Ebx寄存器中保存的就是PEB地址。

typedef struct __PEB {
    BYTE InheritedAddressSpace;
    BYTE ReadImageFileExecOptions;
    BYTE BeingDebugged;
    BYTE SpareBool;
    void* Mutant;
    void* ImageBaseAddress;  // offset 0x08
    _PEB_LDR_DATA* Ldr;
    /*....*/
}MYPEB, *PMYPEB;

typedef struct __PEB {
    BYTE InheritedAddressSpace;
    BYTE ReadImageFileExecOptions;
    BYTE BeingDebugged;
    BYTE SpareBool;
    void* Mutant;
    void* ImageBaseAddress;  // offset 0x08
    _PEB_LDR_DATA* Ldr;
    /*....*/
}MYPEB, *PMYPEB;


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
最新回复 (5)
雪    币: 5292
活跃值: (3570)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SAO
2
能解释一下这个技巧的原理吗?为什么GetThreadContext可以直接获取PEB,这是规律吗?看有的傀儡进程demo还会直接在获取寄存器数据后使用eax=oep,能解释一下吗?
2021-5-4 18:51
0
雪    币: 3625
活跃值: (4559)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
SAO 能解释一下这个技巧的原理吗?为什么GetThreadContext可以直接获取PEB,这是规律吗?看有的傀儡进程demo还会直接在获取寄存器数据后使用eax=oep,能解释一下吗?
以挂起的方式创建进程,其线程上下文context的ebx存放的就是peb的地址,这是通过逆向分析进程创建3环部分得到的结论
2021-7-14 11:18
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4

看来这个编程技巧挺深奥的,先收藏下来,慢慢学习一下。

2021-7-22 10:29
0
雪    币: 6
活跃值: (348)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
Mr.hack 以挂起的方式创建进程,其线程上下文context的ebx存放的就是peb的地址,这是通过逆向分析进程创建3环部分得到的结论
仅限于32位程序下  ebx只是刚好是不易丢失寄存器 本身在r3的进入程序"主线程"的时候 param1是oep param2是peb 而eax=param1  ebx=param2 所以出现的ebx=peb 未被丢失 而64位程序则不会出现这种情况
2021-7-22 11:25
1
雪    币: 4394
活跃值: (1571)
能力值: ( LV7,RANK:113 )
在线值:
发帖
回帖
粉丝
6
SAO 能解释一下这个技巧的原理吗?为什么GetThreadContext可以直接获取PEB,这是规律吗?看有的傀儡进程demo还会直接在获取寄存器数据后使用eax=oep,能解释一下吗?
参考一下wrk、或者泄露的windows源码
24eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6T1k6i4y4@1j5X3q4@1i4K6u0r3g2$3W2F1k6r3!0%4M7#2)9J5k6q4y4W2M7Y4k6W2M7W2)9J5c8X3u0D9L8$3u0Q4x3V1j5#2j5K6k6X3k6e0y4V1j5U0j5J5y4X3t1$3x3$3p5K6z5o6b7J5x3K6m8S2x3h3q4S2y4X3t1&6x3X3q4U0y4o6p5$3j5U0l9%4y4U0g2X3i4K6u0r3j5X3q4K6k6g2)9J5c8X3&6@1L8%4y4Q4x3V1k6H3M7#2)9J5c8X3y4J5k6h3q4@1k6g2)9J5k6h3y4Q4x3U0y4x3y4o6V1$3

        try {
            //
            // Initialize kernel thread object for user mode thread.
            //

            Thread->StartAddress = (PVOID)CONTEXT_TO_PROGRAM_COUNTER(ThreadContext);

#if defined(_IA64_)

            Thread->Win32StartAddress = (PVOID)ThreadContext->IntT0;

#elif defined(_AMD64_)

            Thread->Win32StartAddress = (PVOID)ThreadContext->Rdx;

#elif defined(_X86_)

            Thread->Win32StartAddress = (PVOID)ThreadContext->Eax;

#else

#error "no target architecture"

#endif // defined(_IA64_)

        } except (EXCEPTION_EXECUTE_HANDLER) {

            Status = GetExceptionCode();
        }
2021-9-2 21:35
0
游客
登录 | 注册 方可回帖
返回