首页
社区
课程
招聘
[IDA使用技巧]#012: 创建已知大小的结构
2024-4-15 13:45 1027

[IDA使用技巧]#012: 创建已知大小的结构

2024-4-15 13:45
1027

翻译:梦幻的彼岸

原文地址:https://hex-rays.com/blog/igor-tip-of-the-week-12-creating-structures-with-known-size/

有时,我们知道结构大小,但还不知道实际布局。例如,为结构分配的内存大小是固定的:


在这种情况下,您可以快速创建一个虚拟结构,然后在分析使用该结构的代码时对其进行修改。这里可以使用几种方法。

固定大小结构 1:单一数组

这是最快的选择,但会使结构修改变得有点笨拙。

  1. 创建结构体(进入结构体视图,按 Ins 键并指定名称);
  2. 创建数组(将光标置于结构体的起始位置,按 * 键并输入大小(十进制或十六进制)


当需要在中间创建一个字段时,按 * 键调整数组的大小,使其在字段之前结束,创建字段,然后在字段之后创建另一个数组,再次将结构填满。

固定大小结构 2:中间有较大空隙

  1. 创建结构体(转到结构体视图,按 Ins 并指定名称);
  2. 创建一个字节字段(按 D);
  3. 添加间隙(按 Ctrl-E 或在上下文菜单中选择 "展开结构类型...")并输入大小减 1;
  4. (可选但建议)在字段_0(现在位于结构体末尾)上按 N、Del、Enter。这将重置名称,使其与实际偏移量相匹配,并且不会妨碍在需要时在偏移量 0 处创建另一个字段_0。

要在间隙中间创建字段,请转到结构体中的特定偏移量(大结构体可使用 G)。

固定大小结构 3: 填充虚拟字段

  1. 创建结构体(转到结构体视图,按 Ins 键并指定名称);
  2. 创建一个虚拟字段(如 dword);
  3. 按 * 并输入大小(如果与字节不同,则除以字段大小)。取消选中 "Create as array[创建为数组]",然后点击确定。

根据代码自动创建字段

在分析使用固定寄存器基数的函数时,使用中间有间隙的结构(上述方案 2)尤其有用。例如,该函数使用rbx作为结构体的基数:


ATI6000Controller::initializeProjectDependentResources(void) proc near
  push    rbp
  mov     rbp, rsp
  push    rbx
  sub     rsp, 8
  mov     rbx, rdi
  lea     rax, `vtable for'NI40SharedController
  mov     rdi, rbx        ; this
  call    qword ptr [rax+0C30h]
  test    eax, eax
  jnz     loc_25CD
  mov     rax, [rbx+168h]
  mov     [rbx+4B8h], rax
  mov     rax, [rbx+178h]
  mov     [rbx+4C0h], rax
  mov     rax, [rbx+150h]
  mov     [rbx+4C8h], rax
  mov     [rbx+4B0h], rbx
  mov     rax, [rbx+448h]
  mov     [rbx+4D0h], rax
  mov     rcx, [rbx+170h]
  mov     [rbx+4D8h], rcx
  mov     rcx, [rax]
  mov     [rbx+4E0h], rcx
  mov     eax, [rax+8]
  mov     [rbx+4E8h], rax
  call    NI40PowerPlayManager::createPowerPlayManager(void)
  mov     [rbx+450h], rax
  test    rax, rax
  jnz     short loc_2585
  mov     eax, 0E00002BDh
  jmp     short loc_25CD
---------------------------------------------------------------

loc_2585:
  mov     rcx, [rax]
  lea     rsi, [rbx+4B0h]
  ...


自动为所有基于 rbx 的访问创建字段:

  1. 选择所有使用rbx的指令。
  2. 从上下文菜单中选择 "结构偏移量"(或按 T);
  3. 在对话框中,确保 Register 设置为rbx,选择创建的结构体(红叉号表示当前没有与偏移量匹配的字段);
  4. 从右侧窗格的上下文菜单中选择“Add missing fields[添加缺失字段]”


然后,您可以在使用该结构的所有其他函数中重复此操作,以创建其他缺失字段。





[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回