我想访问一个派生进程的TIB(我成功创build了CreateProcessW的过程)。
我已经获得了一个指向生成进程的TIB的指针:
(ldtSel.HighWord.Bits.BaseHi << 24 ) | ( ldtSel.HighWord.Bits.BaseMid << 16 ) | ( ldtSel.BaseLow );
(ldtSel.HighWord.Bits.BaseHi << 24 ) | ( ldtSel.HighWord.Bits.BaseMid << 16 ) | ( ldtSel.BaseLow );
(我不认为这是必要的)。 在格式之后我留下的值是一个10位数字的指针。
我如何使用这个variables来代替fs寄存器来访问线程信息块? 我通常会使用的传统方式就是这样:
__asm { mov eax, fs:[0x30] // PEB mov dwPebBase, eax }
但是,用指针variablesreplace“fs”当然是行不通的,删除分号意外的结果。 那么我怎样才能通过这个指针值来访问TIB的成员,我感觉好像在访问不应该被访问的内存(或者试图反正:P)。
感谢您的帮助。
你正在采取错误的做法。 使用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... } } }
有关更多信息,请参阅以下文章:
用NtQueryInformationProcess获取进程信息
一个简单的技巧就是在你的本地进程中调用ntdll!RtlGetCurrentPeb(),这个例程返回一个指向PEB的指针,这个指针实际上是有效的,并且也指向远程进程中的PEB,然后你可以使用ReadProcessMemory()需要。