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

现在,我一直在研究,拆卸,评论等,我已经确定了一些我想为其创建新细分的内容,例如中断向量seg:offset,远jmps,跳转到不同CS值的跳转表等。即避免通过在使用表时使用(已知)CS值创建一个新段来手动计算跳转表偏移中的线性地址。
如何在不丢失输入数据的情况下创建新段(反汇编) ,数组,注释...)在我已经拥有的一个无所不包的细分中?似乎要为新的段腾出空间,我需要删除或移动已经存在的段,但是当我这样做时,在该区域(线性地址)中完成的所有工作都将丢失。

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

#1 楼

IDA的用户界面会删除细分受众群项目,因为如果细分受众群基础发生变化,通常需要重新创建代码。
如果您作弊并且不立即更改细分受众群基础,则不会破坏这些项目。即尝试以下操作:


创建新的段,并指定与现有段相同的基础。如果在调用“创建细分”菜单项之前使用选择,则IDA通常会填写当前的细分受众群。

使用IDC或IDAPython在IDA背后更改细分受众群: set_segm_attr(此处为SEGATTR_SEL,newbase)


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

评论


谢谢,做到了。澄清一下,当您说“如果段基础发生更改,通常需要重新创建代码” –像这样潜行段基础更改的潜在风险是什么?

–esrever
18年5月30日在10:56

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

–伊戈尔·斯科钦斯基♦
18年5月30日在11:01

#2 楼

在处理段时,IDA并不是非常用户友好。
有一个选项可以在调整段大小时保留数据,至少可以保持字节完整。但是您所有的名字和评论都将丢失。
因此,我唯一建议的方法是使用将数据库保存到IDC,然后对其进行编辑以删除段创建部分。因此,它仍将应用名称,注释等。

我个人通过两个步骤进行固件反转:

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

2)将固件拆分为多个部分,创建新的IDA数据库并正确加载这些部分

#3 楼

您可以分两步合并段:


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

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

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

拆分工作类似: > IDA将自动拆分并保留内容。



示例(在end-address脚本中)

将光标置于新的第一行您要创建的细分,并将其粘贴到脚本命令行中:

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


评论


我尝试了您的IDC命令,但是有同样的问题。第一:“范围00000000000FB050..0000000000100000包含指令/数据。是否要删除这些指令?”如果我选择“是”,则新细分部分中的所有工作都将丢失。如果我选择否:“创建一个段(00000000000FB050-0000000000100000,sel 0000000000000000):无法修剪前一个段。” (上一段位于F0000-100000)

–esrever
18年5月28日在6:36



如果您正在浏览80186 ROM,为什么将地址发布为64位(16个十六进制数字)?

–威廉·亨格维尔德(Willem Hengeveld)
18年5月28日在6:42

我必须说,我从未在分段架构上尝试过此命令,我知道它在平面地址空间中可以正常工作。您能否发布指向ROM的链接,所以我自己尝试一下?

–威廉·亨格维尔德(Willem Hengeveld)
18年5月28日在6:43

这就是我从IDA获得它们的方式。也许在第一次导入二进制文件时就搞砸了?

–esrever
18年5月28日在6:43

我现在将其添加到原始帖子中。

–esrever
18年5月28日在6:49