在逆向 shellcode 时,我们会看到 PEB 在不同阶段经常运行。然而,我很好奇,在 IDA 中是否有任何预定义的标准结构?如果有,它叫什么?在四处寻找和谷歌搜索后,我找不到任何东西。我也会对 PEB_LDR_DATA 和 RTL_USER_PROCESS_PARAMETERS 的定义非常感兴趣。
我可以自己创建它们并以某种方式导出它们(必须弄清楚如何)。但在此之前,我真的很好奇 IDA 的标准结构定义中是否缺少某些东西。
在逆向 shellcode 时,我们会看到 PEB 在不同阶段经常运行。然而,我很好奇,在 IDA 中是否有任何预定义的标准结构?如果有,它叫什么?在四处寻找和谷歌搜索后,我找不到任何东西。我也会对 PEB_LDR_DATA 和 RTL_USER_PROCESS_PARAMETERS 的定义非常感兴趣。
我可以自己创建它们并以某种方式导出它们(必须弄清楚如何)。但在此之前,我真的很好奇 IDA 的标准结构定义中是否缺少某些东西。
PEB 的结构是_PEB和PEB_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+f9
按insert
键点击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;
请注意,您需要在再次解析头文件之前删除较早的定义,这意味着您之前的所有工作都将在重新加载时丢失,因此请保存您的工作