IDA 中 PEB 的结构定义

逆向工程 艾达 外壳代码
2021-07-08 07:56:08

在逆向 shellcode 时,我们会看到 PEB 在不同阶段经常运行。然而,我很好奇,在 IDA 中是否有任何预定义的标准结构?如果有,它叫什么?在四处寻找和谷歌搜索后,我找不到任何东西。我也会对 PEB_LDR_DATA 和 RTL_USER_PROCESS_PARAMETERS 的定义非常感兴趣。

我可以自己创建它们并以某种方式导出它们(必须弄清楚如何)。但在此之前,我真的很好奇 IDA 的标准结构定义中是否缺少某些东西。

2个回答

PEB 的结构是_PEBPEB_LDR_DATA您需要加载ntapi类型库,您可以通过进入类型库视图 ( Shift+ F11) 然后按来添加它Ins

如果您正在使用,IDA FREE则此和其他几个类型库不可用

如果你打算

create them yourself and export them somehow (would have to figure out how). 

这个演练提供了一些关于如何完成它的提示

操作系统 winxp sp3 vm

(all opaque structures like EPROCESS can vary from os to os / hotfix to hotfix patch tuesday to patch tuesday )

假设您在 ntkrnlpa.exe 中反转 PsGetProcessId()

                  ; Exported entry 872. PsGetProcessId    
                  ; Attributes: bp-based frame    
                  ; __stdcall PsGetProcessId(x)
                  public _PsGetProcessId@4
                  _PsGetProcessId@4 proc near
8B FF             mov     edi, edi
55                push    ebp
8B EC             mov     ebp, esp
8B 45 08          mov     eax, [ebp+8]
8B 80 84 00 00 00 mov     eax, [eax+84h] <-----
5D                pop     ebp
C2 04 00          retn    4
                  _PsGetProcessId@4 endp

并且您发现 84 是 EPROCESS->Pid 并希望将此信息传递给反汇编

制作一个名为的文本文件 EPROCESS.h

在文本文件中键入以下内容并保存以供以后访问

typedef struct EPROCESS 
{
  BYTE unknown[0x84];
  DWORD Pid;
} EPROCESS, *EPROCESS;

转到ida free ->File->Load File->Parse Header File或快捷方式ctrl+f9 浏览到EPROCESS.h

你应该看到这是ida information window成功的

The initial autoanalysis has been finished.
C:\Documents and Settings\Admin\Desktop\EPROCESS.h: `successfully compiled`

查看- >open subviews->structures或快捷方式shift+f9insert键点击add standard structure开始打字peb,你应该看到窗口滚动和显示你刚才添加的结构

00000000 EPROCESS        struc ; (sizeof=0x88, standard type)
00000000 unknown         db 132 dup(?)
00000084 Pid             dd ?
00000088 EPROCESS        ends

去idaview选择84h/right click->select structure offset

并应用 Eprocess.Pid

反汇编将变得更具可读性

8B 80 84 00 00 00 mov     eax, [eax+EPROCESS.Pid]

开始向这个 eprocess.h 添加其他发现的偏移量并再次加载它以更新结构定义

许多结构定义可以通过windbg查看

例如peb和peb_ldr_data可以这样查看

dt nt!_PEB
dt nt!_PEB_LDR_DATA

额外细节

如果您修改 .h 文件以添加另一个这样的结构成员

typedef struct EPROCESS 
{
  BYTE unknown[0x84];
  DWORD Pid;
  BYTE unk2[0xbc-0x88];
  DWORD DebugPort;
  BYTE unknown1[0x174-0xc0];
  BYTE ImageFileName[16];
} EPROCESS, *PEPROCESS;

请注意,您需要在再次解析头文件之前删除较早的定义,这意味着您之前的所有工作都将在重新加载时丢失,因此请保存您的工作