通过 FS 寄存器访问衍生进程的 TIB?

Posted

技术标签:

【中文标题】通过 FS 寄存器访问衍生进程的 TIB?【英文标题】:Access a spawned process's TIB through FS register? 【发布时间】:2013-05-05 09:10:53 【问题描述】:

我想访问一个衍生进程的 TIB(我使用 CreateProcessW 成功创建了该进程)。

我通过以下方式获得了指向衍生进程的 TIB 的指针:

GetThreadContext(当然要设置权限) 访问 pContext.SegFs 像这样格式化这个值:(ldtSel.HighWord.Bits.BaseHi << 24 ) | ( ldtSel.HighWord.Bits.BaseMid << 16 ) | ( ldtSel.BaseLow );(我不认为这是必要的)。

格式化后我剩下的值是一个 10 位的指针。

如何使用这个变量代替 fs 寄存器来访问线程信息块? 我访问它的传统方式通常是这样的:

 __asm 
  
      mov eax, fs:[0x30]  // PEB
      mov dwPebBase, eax
  

但是,用指针变量替换“fs”当然是行不通的,去掉分号会产生意想不到的结果。 那么如何通过这个指针值访问 TIB 的成员,我觉得好像我正在访问不应该访问的内存(或无论如何尝试:P)。

感谢您的帮助。

【问题讨论】:

TIB 位于另一个进程的地址空间中,恐怕您无法从父进程访问它(但也许ReadProcessMemory 可能会有所帮助)。 您需要使用ReadProcessMemory。但与其跳入如何:为什么要从子进程中读取 TIB? (记住进程中可能有多个线程。) 好的,谢谢,ReadProcessMemory 似乎是要走的路。我需要通过 PEB 访问 LDR_MODULE,并访问 LIST_ENTRY InLoadOrderModuleList 并爬取列表。无法正常访问线程的TIB。 【参考方案1】:

您为此采取了错误的方法。使用NtQueryInformationProcess() 而不是GetThreadContext() 来访问衍生进程的PEB,例如:

PROCESS_INFORMATION pi = 0;
...
PROCESS_BASIC_INFORMATION pbi = 0;
ULONG pbi_len = 0;
if (NtQueryInformationProcess(pi.hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), &pbi_len) >= 0)

    if (pbi.PebBaseAddress)
    
        PEB peb = 0;
        SIZE_T peb_len = 0;
        if (ReadProcessMemory(pi.hProcess, pbi.PebBaseAddress, &peb, sizeof(peb), &peb_len))
        
            // use peb as needed...
        
    

有关详细信息,请参阅以下文章:

Get Process Info with NtQueryInformationProcess

【讨论】:

【参考方案2】:

一个简单的技巧是在你的本地进程中调用ntdll!RtlGetCurrentPeb(),这个例程返回一个指向PEB的指针,这个指针实际上是有效的,并且在远程进程中也指向PEB,然后你可以使用ReadProcessMemory()来阅读您需要的内容。

【讨论】:

以上是关于通过 FS 寄存器访问衍生进程的 TIB?的主要内容,如果未能解决你的问题,请参考以下文章

访问段寄存器 MASM

FS段寄存器详解

保护模式_段寄存器结构

操作系统之内存管理

Android 逆向Android 进程注入工具开发 ( 调试进程中寄存器的作用 | 通过 EIP 寄存器控制程序运行 | EIP 寄存器的存档与恢复 )

操作系统复习