如何仅使用python代码找出二进制文件(如IDA)中的地址?

逆向工程 艾达 二元分析 Python 地址 抵消
2021-07-01 21:25:56

我有二进制文件,例如https://github.com/andrew-d/static-binaries/blob/master/binaries/linux/x86_64/nmap,我用 IDA 打开,并搜索一些我想在没有打开 IDA 的情况下找到的数据, 仅使用 python 代码

1)如何找到这一系列字节的地址:48 8B 45 A8 48 8D 1C 02 48 8B 45 C8,结果必须是0x6B0C67

2)如何找出地址中的12个字节0x6B0C67结果必须是48 8B 45 A8 48 8D 1C 02 48 8B 45 C8

3)如何找到特定字符串的调用地址?例如i + 1 == features[i].index,位于0x6FC272结果必须是0x4022F6

我如何在不打开 Ida 的情况下找到所有这些?仅使用 python/c 代码?

谢谢

1个回答

您的意思是您想使用自己的代码在 python 或 c 中搜索任意文件中的十六进制模式?

您是否考虑过使用 regex 或 grep 来满足您的需求?

有些事情您应该注意
1) 文件偏移量不等于虚拟偏移量
2) 即使您设法映射文件,您也可能必须处理 aslr
2) 您需要重新了解 RVA ,VA ,文件偏移,文件对齐与节对齐等

这是一个示例 grep 演示(注意最后 5 个字节的相似性)

:\>grep  -obaP "\x48\x8b\x45\xa8\x48\x8d\x1c\x02\x48\x8b\x45\xc8" nmap
2821223:H<E"H?∟☻H<EE

:\>printf "%x\n" 2821223
2b0c67

或 python 演示

D:\>cat nmap.py
import re
fin = open("d:/nmap" , "rb")
dat = fin.read()
fin.close()
pat = re.search("\x48\x8b\x45\xa8\x48\x8d\x1c\x02\x48\x8b\x45\xc8",dat)
offset = hex(pat.start())
print (offset)

结果

D:\>python nmap.py
0x2b0c67

现在您知道如何找到偏移量,您可以使用任何十六进制编辑器来打印字节

这是一个 xxd 演示

D:\>xxd -l 32 -g 1 -s 0x2b0c67 nmap
02b0c67: 48 8b 45 a8 48 8d 1c 02 48 8b 45 c8 48 89 c7 e8  H.E.H...H.E.H...
02b0c77: a3 d7 ff ff 48 89 c2 48 8b 45 c0 48 01 d0 48 39  ....H..H.E.H..H9

您可以简单地使用 binascii 在 python 中的偏移处打印字节,如下所示

D:\>type nmap.py
import re
import binascii
fin = open("d:/nmap" , "rb")
dat = fin.read()
pat = re.search("\x48\x8b\x45\xa8\x48\x8d\x1c\x02\x48\x8b\x45\xc8",dat)
offset = hex(pat.start())
print (offset)
print ( binascii.hexlify(dat[pat.start():pat.start()+16]))
fin.close()
D:\>


D:\>python nmap.py
0x2b0c67
488b45a8488d1c02488b45c84889c7e8