IDA:在不丢失数据的情况下添加段

逆向工程 艾达 x86
2021-07-07 00:37:12

我正在 IDA 免费浏览旧的 80186 BIOS ROM。我已经在正确的地址加载了二进制文件,并为整个内容创建了一个大段,因为我对内部结构一无所知。

现在,由于我一直在挖掘、反汇编、评论等,我已经确定了一些我想为其创建新段的东西,例如中断向量 seg:offset、far jmps、偏移到不同 CS 值的跳转表,等等。

  1. 这是您应该如何使用 IDA 段吗?即,通过在使用表时使用(已知)CS 值创建一个新段,避免必须从跳转表偏移量手动计算线性地址。

  2. 如何在不丢失我已经拥有的一个包罗万象的段中输入的数据(反汇编、数组、注释...)的情况下创建一个新段?似乎要为新段腾出空间,我需要删除或移动已经存在的段,但是当我这样做时,在该区域(线性地址)中完成的所有工作都将丢失。

编辑:这是ROM。它在 0xf0000-0x100000 处加载,入口点是 f000:fff0(重置向量) https://www.dropbox.com/s/63oxq39w0v3rdo9/RYSA094_joined.bin?dl=0

3个回答

在处理段时,IDA 对用户不是很友好。有一个选项可以在您调整段大小时保留数据,它至少可以保持您的字节完整。但是你所有的名字和评论都将丢失。所以我唯一能建议的是使用save database to IDC,然后编辑它以删除段创建部分。这样它仍然会应用名称、注释等。

就个人而言,我分两步进行固件反转:

1) 在地址 0 加载整个固件,恢复内存映射。关闭这个 IDA 数据库。

2) 将固件拆分成碎片,创建新的 IDA 数据库并正确加载碎片

您可以分两步合并段:

  • 首先确保低段的结束地址与高段的起始地址匹配。
  • 然后一旦段相邻,您可以通过将第一个段的结束地址设置为第二个段的结束地址来组合它们而不会丢失数据。

然后IDA会自动合并两个segment而不会丢失数据。

我认为它们确实需要具有相同的段位数(16 位或 32 位)。

在尝试之前,请务必备份您的数据库,错别字可能会破坏您的数据。


拆分的工作原理类似:

  • 添加具有与end-address原始属性相同的属性的段
    • IDA 会自动拆分,并保留内容。

示例(在IDC脚本中)

将光标放在要创建的新段的第一行上,并将其粘贴到脚本命令行中:

AddSeg(here, SegEnd(here), GetSegmentAttr(here, SEGATTR_ORGBASE), 
    GetSegmentAttr(here, SEGATTR_BITNESS), 
    GetSegmentAttr(here, SEGATTR_ALIGN),
    GetSegmentAttr(here, SEGATTR_COMB));

IDA 的 UI 会删除段项,因为如果段基发生变化,通常需要重新创建代码。如果您作弊并且不立即更改段基数,则物品不会被破坏。即试试这个:

  1. 创建新段,指定与现有段相同的基数。如果在调用“创建段”菜单项之前使用选择,IDA 通常会填充当前段基础。

  2. 使用 IDC 或 IDAPython 更改 IDA 背后的段基础:

    set_segm_attr(这里,SEGATTR_SEL,newbase)

某些外部参照,尤其是那些基于当前段/CS 的外部参照,可能需要重新创建。