-
-
[IDA使用技巧]#012: 创建已知大小的结构
-
发表于: 2024-4-15 13:45 2076
-
翻译:梦幻的彼岸
原文地址:https://hex-rays.com/blog/igor-tip-of-the-week-12-creating-structures-with-known-size/
有时,我们知道结构大小,但还不知道实际布局。例如,为结构分配的内存大小是固定的:
在这种情况下,您可以快速创建一个虚拟结构,然后在分析使用该结构的代码时对其进行修改。这里可以使用几种方法。
固定大小结构 1:单一数组
这是最快的选择,但会使结构修改变得有点笨拙。
- 创建结构体(进入结构体视图,按 Ins 键并指定名称);
- 创建数组(将光标置于结构体的起始位置,按 * 键并输入大小(十进制或十六进制)
当需要在中间创建一个字段时,按 * 键调整数组的大小,使其在字段之前结束,创建字段,然后在字段之后创建另一个数组,再次将结构填满。
固定大小结构 2:中间有较大空隙
- 创建结构体(转到结构体视图,按 Ins 并指定名称);
- 创建一个字节字段(按 D);
- 添加间隙(按 Ctrl-E 或在上下文菜单中选择 "展开结构类型...")并输入大小减 1;
- (可选但建议)在字段_0(现在位于结构体末尾)上按 N、Del、Enter。这将重置名称,使其与实际偏移量相匹配,并且不会妨碍在需要时在偏移量 0 处创建另一个字段_0。
要在间隙中间创建字段,请转到结构体中的特定偏移量(大结构体可使用 G)。
固定大小结构 3: 填充虚拟字段
- 创建结构体(转到结构体视图,按 Ins 键并指定名称);
- 创建一个虚拟字段(如 dword);
- 按 * 并输入大小(如果与字节不同,则除以字段大小)。取消选中 "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 的访问创建字段:
- 选择所有使用rbx的指令。
- 从上下文菜单中选择 "结构偏移量"(或按 T);
- 在对话框中,确保 Register 设置为
rbx
,选择创建的结构体(红叉号表示当前没有与偏移量匹配的字段); - 从右侧窗格的上下文菜单中选择“Add missing fields[添加缺失字段]”
然后,您可以在使用该结构的所有其他函数中重复此操作,以创建其他缺失字段。
赞赏
他的文章
- [原创]物联网安全:基础篇 4117
- 威胁情报小课堂:阻止活跃勒索软件的感染 2176
- [翻译]发现利用 Facebook 和 MS 管理控制台实施的 Kimsuky APT 攻击 7055
- 威胁情报小课堂:LockBit Black 2052
- 威胁情报小课堂:Nitrogen 2077
看原图
赞赏
雪币:
留言: