如何在 IDA Pro 中使用 IDC 脚本提取所有 Rodata 数据和 bss 部分?

逆向工程 艾达 拆卸 idapro插件 蟒蛇
2021-06-28 08:54:58

测试平台为 32 位 Linux ELF 和 32 位 Windows PE。

我使用IDC脚本从二进制文件中提取所有函数并转储到文件中,然后根据IDA Pro书中的示例进行分析。

但我不知道如何使用 IDC 脚本从 ELF 文件中提取 .data .rodata 和 .bss 部分。

目前我使用 IDA Pro 创建一个 asm 文件,并使用 Python 脚本来执行字符串解析器工作,从这个 asm 文件中提取 .data .rodata 和 .bss 部分。

基本上是可以的,但是需要一个非常繁琐的修改工作,而且由于我的测试库比较大(notepad++等..),我不得不花很多时间做修改工作才能正确提取这三个部分。

我的问题是“是否有任何 idc 脚本/idapython 脚本可以从 ELF 文件中提取 .data .rodata 和 .bss 部分?” 也欢迎任何 Windows 上的解决方案。

谢谢!

2个回答

对于该.bss部分,以下内容可能适合您:

import idaapi
import idc

print "section .bss"
start = idaapi.get_segm_by_name(".bss").startEA
end = idaapi.get_segm_by_name(".bss").endEA
item = idc.NextHead(start - 1, end)
while item != BADADDR:
   next = idc.NextHead(item, end)
   if next != BADADDR:
      print "%s: resb %d" % (idc.Name(item), next - item)
   else:
      print "%s: resb %d" % (idc.Name(item), end - item)
   item = next

尽管在实践中,NextHead似乎没有选择任何名为 as 的内容unk_XXXX,因此您可能需要进一步迭代该部分以确定是否存在对地址的任何交叉引用,以决定是否将声明与其关联。

对于.data.rodata部分,您需要根据需要更改db/dw/dd/...为并另外转储相关项目的内容。这些部分中项目的挑战是正确确定每个项目的大小并正确选择db/dw/dd/...Dumping raw bytes withdb可能是这里最简单的方法。

#Use carefully, I didn't check this code
#beware errors
#It's IDAPython, not IDC
#

import idautils
import idc
import idaapi

segfiles = {".rodata": "rodata.bin",
            ".data": "data.bin"}

# over all segments
for s in idautils.Segments():
    if idc.SegName(s) in segfiles:
        #if we need this segment ...
        fname = segfiles[idc.SegName(s)]
        f = open(fname, "wb")
        start = idc.GetSegmentAttr(s, idc.SEGATTR_START)
        end = idc.GetSegmentAttr(s, idc.SEGATTR_END)
        #from start to end write all to file
        while start < end:
            b = idc.Byte(start)
            f.write(b)
            start += 1
        f.close()