获取进程基址小技巧(傀儡进程)

本文介绍了一种在创建傀儡进程时,通过GetThreadContext函数直接获取PEB地址的方法,避免了使用未导出NT函数NtQueryInformationProcess的复杂过程。通过解析线程上下文的Ebx寄存器,结合PEB结构的特定偏移,可以快速定位并读取目标进程的加载基址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建傀儡进程时,一般需要以挂起模式创建进程,然后调用未导出NT函数NtQueryInformationProcess来获取目标进程的PEB地址,拿到PEB地址后,再通过ReadProcessMemory获取目标进程的PEB数据,最后NtUnMapViewOfSection,传入PEB结构中的ImageBaseAddress来卸载目标进程的内存。

其实可以直接通过GetThreadContext这个函数来直接获取PEB地址,获取的CONTEXT.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;

得知PEB结构偏移0x8的位置就是进程加载基址,在获取线程上下文后,直接用ebx的内容+8,再通过ReadProcessMemory读取4个字节,就可以得到被挂起进程的基址了。

测试代码:

   // 获取线程上下文
    CONTEXT ctx = { 0 };
    ctx.ContextFlags = CONTEXT_ALL;
    if (!GetThreadContext(pi.hThread, &ctx))
    {
        printf("GetThreadContext failed (%d).\n", GetLastError());
    }

    // 拿到目标进程主线程上下文后,在Ebx寄存器中保存的就是PEB的地址,
    // 而PEB结构偏移0x8的位置是AddressOfImageBase字段,
    // 所以直接来读取ctx.Ebx+0x8,就可以获取到目标进程的加载基址
    DWORD dwImageBase =  0;
    DWORD lpNumberOfBytesRead = 0;
    if (!ReadProcessMemory(pi.hProcess, (LPCVOID)(ctx.Ebx + 0x8), &dwImageBase, sizeof(DWORD), &lpNumberOfBytesRead))
    {
        printf("ReadProcessMemory failed (%d).\n", GetLastError());
        return;
    }

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值