飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 903|回复: 1

[其它] [IDA使用技巧]Igor的本周小贴士#167:添加和分割段

[复制链接]
  • TA的每日心情
    开心
    2019-3-15 11:00
  • 签到天数: 262 天

    [LV.8]以坛为家I

    发表于 2023-12-5 14:18:22 | 显示全部楼层 |阅读模式
    本帖最后由 梦幻的彼岸 于 2023-12-6 13:40 编辑

    翻译:梦幻的彼岸
    在分析固件二进制文件时,合理的内存布局相当重要。加载原始二进制文件时,IDA 通常会为整个二进制文件创建一个代码段。当您只需要分析该代码时,这就足够了,但情况并非总是如此。例如,例如,代码可以引用外部硬件作为MMIO(内存映射I/O),或者使用不属于二进制映像的额外内存。如何处理这种情况?
    创建段
    要在数据库中添加额外地址,请通过如下步骤: Edit > Segments > Create segment… 操作。

    segments1.png
    输入段名、起始/结束地址和可选类别。类通常只是提供信息,但可能会影响反编译器的行为。“Use sparse storage option”适用于大部分为空且数据项相对较少的数据段(如 BSS 或 MMIO)。启用该选项后,IDA 将使用针对此类情况优化的存储空间,因此即使新的数据段非常大,IDB 也不会增长太多。
    注意:段的结束地址是排他的,即段的最后一个字节的地址为 end_ea-1。
    段创建后,最好重新分析数据库,以便发现对新可用地址的引用。
    分割段
    如果您指定的地址范围与现有段有部分交叉,IDA 将自动截断该段,为新段腾出空间。例如,假设你有一个从 0 到 0x80000 的 ROM 固件段,但后来发现代码区域似乎在 0x60000 处结束。若要将最后一部分分割为只读数据,可创建一个边界为 0x60000 至 0x80000 的新段(如命名为 .rodata),ROM 段将自动截断为 0x60000 结尾。
    移动段边界
    比方说,在进一步分析二进制文件后,你发现 .rodata 实际上应该从 0x70000 开始。你可以通过以下步骤快速移动分割点:
    • 导航到新的分割点 (e.g. 0x70000);
    • Invoke Edit > Segments > Edit segment (或使用快捷键 Alt–S);
    • 在起始地址(或终止地址,取决于移动的方向)中,在此处输入。
    • 确保“Move adjacent segments” 已启用,然后单击 OK.
    segments2.png
    由于 IDA 中的大多数数字输入字段都接受IDC 表达式,此处将转换为当前地址(0x70000),因此 .rodata 段边界将调整为 0x70000-0x80000,相邻 ROM 段扩展为 0-0x70000。

    知识扩展(非原文内容)
    segments单词解析:
    一个"节"或"段"通常是指一个具有特定属性或用途的数据或代码的集合。例如,在某些操作系统中,内存可以被划分为不同的段,每个段用于不同的目的(例如,一个段用于执行程序代码,另一个段用于存储数据等)。在病毒分析中,"segments"可能指的是被病毒恶意利用的计算机资源的部分。

    评分

    参与人数 1威望 +1 飘云币 +1 收起 理由
    jolly_800 + 1 + 1 PYG有你更精彩!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    昨天 20:21
  • 签到天数: 101 天

    [LV.6]常住居民II

    发表于 2024-2-28 17:58:47 | 显示全部楼层
    学习第一课,谢谢
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表