peb

peb结构获取

  1. 获取teb结构,在teb结构中查找peb地址,
  2. 获取fs段寄存器的内容,内容为teb的结构,其中偏移0x30是peb的地址
  3. 获取pbi结构,其中记录了peb的地址

c#没有内联汇编,不方便直接读取fs段寄存器的内容,所以我们采用第三种方法,通过调用ntdll.dll中的NtQueryInformationProcess()函数获取进程的pbi结构,再获取pbi结构中指向peb结构的地址,由这个地址去找peb结构。

peb结构说明

我找到一个网站完美的说明了peb结构,传送门

由于自己不是逆向选手,我关心的问题是通过修改peb结构修改进程名从而达到一些其他目的(后面会说),所以我们直接找到我们需要的地方

先找到我们的peb结构地址。

203314.jpg

16551936是fc9000,这是peb的地址

203515.jpg

peb结构中的ProcessParameter,位于偏移0x10的地址,他指向另一个结构的地址,叫做_RTL_USER_PROCESS_PARAMETERS,从偏移0x10的地方跟到012436b0这个地址去,也就是这个结构,这就是我们要关注的东西。

203837.jpg

按照结构走,比如我们需要找到commandline(是一个unicode_string结构),我们则跟到偏移0x40的地址上。如图所示,005c是长度,005e是最大长度,后面跟的01243bcc即是存储数据的地址了。再转过去,我们就找到了我们所需要的参数。

203155.jpg

我们要修改进程名,则需要修改commandline,imagepath,WindowTitle以及底下有个_LDR_DATA_TABLE_ENTRY结构中InLoadOrderModuleList和InMemoryOrderModuleList的FullDllName和BaseDllName。

用途

像之前说的,譬如windows任务管理,各种检测应用名的地方,实际上都和这个结构有关,甚至之前提到的靠白名单bypassUAC,也可以靠修改peb结构名完成,也就是我之前提到的,通过修改peb结构伪造进程名为explorer.exe去加载高权限的com组件,这个过程是不会触发UAC提示的。

(其实还有一个会用来解析进程名,EPROCESS结构,位于系统权限地址上)