将 IDA 段拆分为子段

逆向工程 艾达 固件 蟒蛇 分割
2021-07-11 15:08:31

我正在反转一个固件,它包含在一个大的二进制块(.bin文件)中。

一些倒车后,我可以确定大垃圾箱有两个部分 - 文本和数据。现在我想将原始段分成这两个段。

例如:

原始文件段:

Name   start   end
ROM    0x0     0x21bd

包含所有代码和数据的一大段。

期望的结果段:

 Name  start   end
.text  0x0     0x11bd 
.data  0xc000  0xd000

我想将一大段分成两个未调整的段,就像这样。.data部分应保存来自原始ROM部分的字节换句话说,ROM应该将原始部分的0x11bd - 0x21bd复制到新数据部分的 0xc000 - 0xd000。

任何想法我怎样才能实现这一目标?

2个回答

在 IDA 中打开段窗口。去编辑你拥有的一大段。将名称更改为.text并根据适用情况编辑权限。取消选中“移动相邻段”和“禁用地址”,这一步非常重要,它可以防止实际段数据被删除。将结束地址更改为.text的结束单击确定并确认编辑。右键单击,然后选择“添加段”,将名称设置.data为之前加载的地址并填写起始地址和结束地址。然后转到 Edit -> Segments -> Move current segment 以选择正确的起始地址。

我总是发现更容易将 ida 之外的文件拆分和加入到需要的内容中,只需使用 edit ->segment->createSegment 创建段并具有正确的开始和结束地址,而不是处理 move_segment 头疼的问题,这将继续说不房间等等等等,糟糕的基地等等等等。

可能是具有更好 ida 经验的人会提供适当的 ida 方式来做您所要求的

这是适合您的情况的简单拆分器

forig = open('f://somrom.bin' , 'rb')
part1 = forig.read(0x11be)
forig.seek(0x11be,0)
part2 = forig.read(0x1000)
arr = bytearray(0xc000-0x11be)

ffinal = open('f:\\somromfinal.bin','wb')
ffinal.write(part1)
ffinal.write(arr)
ffinal.write(part2)
ffinal.close()
forig.close()

您可以检查它是否正确拆分

xxd.exe -g 1 -l 16 -s 0x11b0 somrom.bin
000011b0: 8c 08 31 2d 09 8a c1 7d 19 39 2b 83 e5 e3 57 ed  ..1-...}.9+...W.

xxd.exe -g 1 -l 16 -s 0x11b0 somromfinal.bin
000011b0: 8c 08 31 2d 09 8a c1 7d 19 39 2b 83 e5 e3 00 00  ..1-...}.9+..... 

<<<<<<<<0x11be bf =00

xxd.exe -g 1 -l 16 -s 0xc000 somromfinal.bin
0000c000: 57 ed 37 31 e2 31 2d 98 18 6f 53 36 59 4e ad 92  W.71.1-..oS6YN..
<<<<< 0xc000 start with 0x57 ed

你可以在 ida 中加载这个文件,
然后创建三个段
0000 到 11bd
11be 到 bff
c000 到 d000