首先,我不熟悉二进制文件,希望这不是一个愚蠢的问题。

我从二进制文件的.text部分生成了带有指令序列的表。具有2个指令序列的表如下所示:

sequence         | total | relative
------------------------------------
e3a0b000e3a0e000 | 2437  |  0.0469
...


使用IDAPython提取序列,生成的文本文件如下所示:

9c54    SUBROUTINE
9c54    e3a0b000    MOV             R11, #0
9c58    e3a0e000    MOV             LR, #0
...


更新

现在,我正在使用Aho-Corasick算法将这些序列匹配到从中提取它们的同一二进制文件中。我只是将表中的所有序列添加到Aho自动机:

import binascii

import ahocorasick

from connect_db import DB
from get_metadata import get_meta

a = ahocorasick.Automaton()
meta = get_meta()
with DB('test.db') as db:
    for idx, key in enumerate(list(db.select_query(meta['select_queries']['select_all'].format('sequence_two')))):
        a.add_word(key[0], (idx, key[0]))

a.make_automaton()
with open('../test/test_binary', 'rb') as f:
    for sub in a.iter(f.read().hex()):
        print('file offset: %s; length: %d; sequence: %s' % (hex(sub[0]), len(sub[1][1]), sub[1][1]))


然后我得到以下结果:

file offset: 0x38b7; length: 16; sequence: e3a0b000e3a0e000
...


我的问题是Aho-Corasick返回0x38b7,我在Ubuntu中使用ghex再次查看二进制文件,并在预期的偏移量处找到了两条指令:

offset:  bytes:
00001C54 E3A0B000 E3A0E000 ...


意思是我应该在0x1c54-0x1c5c的范围内找到它们,这是原始偏移量(0x9c54-0x8000)

我还不太了解如何获得相同的偏移量,但是我想使用Aho-Corasick获得原始偏移量。我知道Aho-Corasick返回关键字结尾的偏移量。

最佳答案

当我发现将字节转换为十六进制ASCII时,这些字符将占用更多内存,因此我能够解决该问题。我必须将Aho-Corasick返回的偏移量减半才能获得实际的原始偏移量:

之前

with open('../test/test_binary', 'rb') as f:
for sub in a.iter(f.read().hex()):
    print('file offset: %s; length: %d; sequence: %s' % (hex(sub[0]), len(sub[1][1]), sub[1][1]))




with open('../test/test_binary', 'rb') as f:
for sub in a.iter(f.read().hex()):
    print('file offset: %s; length: %d; sequence: %s' % (hex(int(sub[0] / 2)), len(sub[1][1]), sub[1][1]))


新的输出几乎与预期的一样:

file offset: 0x1c5b; length: 16; sequence: e3a0b000e3a0e000


注意

将偏移量除以2时,它将整数转换为浮点数。我必须记住,将浮点数转换回整数将使该值向上或向下取整。

关于python - 如何在二进制文件中的readelf/IDA和Aho-Corasick之间获得相同的偏移量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55980546/

10-16 22:47