我正在IDA中反汇编固件(西门子C165处理器-https://www.infineon.com/dgdl/Infineon-C165-DS-v02_00-en%5B8%5D.pdf?fileId=db3a304412b407950112b43a49a66fd7)。你知道吗
我有固件,所以我也可以通过Python读取它。你知道吗
我需要找到一个字符串
0, 1, 2, 3, 4, 5, 6, 7 (0-7)
编写了这个简单的程序:
from itertools import permutations
l = list(permutations(range(0,8)))
print(len(l))
with open("firm.ori", 'rb') as f:
s = f.read()
for i in l:
hexstr = '\\x'.join('{:02x}'.format(x) for x in i)
hexstrfinal = "\\0x" + hexstr
#print hexstrfinal
if(s.find(b'hexstrfinal')>0):
print "found"
但是,它没有找到任何东西
我以为序列会挨着一个,但也许不是。你知道吗
我只想确定程序是正确的。你知道吗
实际上,0-7应该是零位,那么这是否意味着我需要搜索,例如作为一个组合:
0x01, 0x23, 0x45, 0x67
上面是字节。你知道吗
有人能证实这一点,并建议如何搜索这个?你知道吗
更新1:
已试用第二种变体
from itertools import permutations
l = list(permutations(range(0,8)))
print(len(l))
with open("firm.ori", 'rb') as f:
s = f.read()
for item in l:
str1 = ''.join(str(e) for e in item)
n = 2
out = [str1[i:i+n] for i in range(0, len(str1), n)]
hexstr = '\\x'.join(e for e in out)
hexstrfinal = "\\x" + hexstr
#print hexstrfinal
if(s.find(b'hexstrfinal')>0):
print "found"
但也没有命中。。。你知道吗
你知道我做错了什么吗?你知道吗
现在还不清楚你在寻找什么,但是。。。你知道吗
每个
(0,1,2,3,4,5,6,7)
的排列将是一个类似于下面的七项元组您可以这样创建两个项字符串
然后对字符串进行整数运算并将其馈送到
bytes
那就去找吧
如果它找不到它就不在那里。你知道吗
这是一个10个字符的字节对象(类似于您的文件)
只是碰巧是:
搜索3字符(或3整数)序列
当我处理二进制文件时,我真的认为整数不是字符。你知道吗
您的代码中存在一些误解,而且效率低下。让我们从误解开始。你知道吗
由于
firm.ori
是以二进制模式(rb
)打开的,s = f.read()
的结果是bytes
对象。尽管有类似于字符串的方法,但这不是字符串!它包含字节,而不是字符。显示时,\x...
输出并不表示bytes
对象包含ASCII反斜杠和XE。相反,每个\x...
是一个转义序列,用于表示与ASCII可打印字符不对应的给定字节的十六进制值。你知道吗在循环中,您只处理字符串:
hexstr = '\\x'.join('{:02x}'.format(x) for x in i)
接受您的排列并将其格式化为bytes
对象的字符串表示形式。希望你能从上一段理解为什么这行不通。你知道吗s.find(b'hexstrfinal')
搜索文本ASCII数组b'hexstrfinal'
,而不是名为hexstrfinal
的变量。后者当然不起作用,因为hexstrfinal
的类型是str
,而不是bytes
。如果用一个简单的hexstrfinal.encode('ascii')
把它转换成bytes
,你会得到b'\\x...'
,这根本不是你想要的。正确的方法是希望您能理解为什么将一个字符串转换三次以获得所需的
bytes
是不必要的低效。任何时候,当你开始使用字符串作为拐杖来操纵数字时,都是评估你的方法的好时机。这就是我们开始讨论代码中的低效之处。你知道吗您当前正在尝试遍历0-7的所有可能排列,而不是查找实际存在的排列。考虑到文件的大小只有200KB,期望所有甚至大多数排列都出现在文件中是不合理的。此外,您正在整个文件中搜索每个可能的排列。对于文件大小
N
和K
排列,您的代码在O(N * K)
时间内运行,而这可以通过文件的一次传递或O(N)
完成。使用适当的数据结构,即使是用纯Python编写的循环也可能比当前代码的优化版本运行得更快。你知道吗策略很简单。遍历
s
。如果当前字符和下面的七个字符组成了一个有效的排列,开始一个聚会。否则,请继续查看:这里有许多可能的优化,您可以使用numpy或scipy更有效地完成整个过程。你知道吗
如果你允许在序列中重复,事情也会变得更复杂。在这种情况下,您必须对序列进行排序:
如果你想寻找一点点,事情会变得更复杂。我会完全放弃检查
b in allowed
,只需编写一个自定义检查,它可以应用于每半步:在这里,
build_set
只是将小字节分成一组。matches
检查在一个字节上对齐的8个半字节的数组(4个元素),或偏移半字节的8个半字节的数组(5个元素)。这两个病例都是独立报告的。你知道吗相关问题 更多 >
编程相关推荐