我刚写了一些代码来尝试用以下格式的objdump输出解析操作码: -
8048060: 89 e7 mov edi,esp
8048062: 89 fe mov esi,edi
8048064: 6a 6b push 0x6b
8048066: 58 pop eax
8048067: aa stos BYTE PTR es:[edi],al
8048068: 6a 65 push 0x65
804806a: 58 pop eax
804806b: aa stos BYTE PTR es:[edi],al
804806c: 6a 79 push 0x79
804806e: 58 pop eax
804806f: aa stos BYTE PTR es:[edi],al
8048070: 31 c0 xor eax,eax
8048072: aa stos BYTE PTR es:[edi],al
8048073: 40 inc eax
8048074: cd 80 int 0x80
我希望将操作码解压缩为89 e7 89 f3 .... cd 80
。
我尝试使用以下正则表达式声明: -
opcode = ""
for line in f.readlines():
match = re.search(r' ([\da-f]+):\s+([0-9a-f ]+)', line)
opcode += match.group(2).strip() + " "
虽然上面的代码片段适用于我的所有样本,但我确定在我的指令以[a-f] [空格]结束时会失败。
有人可以建议一个更好的正则表达式吗?
答案 0 :(得分:2)
您可以尝试以下方法:
r' ([\da-f]+):\s+((?:[0-9a-f]{2} )+)'
在操作码之后,这应该更可靠地停止。
答案 1 :(得分:1)
您不一定需要正则表达式。你可以只需要split()
字符串,如下所示(注意:如果空格总是完全如示例数据所示,这种方法很有效,这似乎很可能是因为它生成了):
opcodes = []
for line in f.readlines():
opcode = []
for x in line.split(' ')[4:]:
if x:
opcode.append(x)
else:
opcodes.append(opcode)
break
print opcodes
输出:[['89','e7'],['89','fe'],['6a','6b'],['58'],[ 'aa'],['6a','65'],['58'],['aa'],['6a','79'],['58'],['aa'],[ '31','c0'],['aa'],['40'],['cd','80']]
#if you need strings:
print [' '.join(sublist) for sublist in opcodes]
输出:['89 e7','89 fe','6a 6b','58','aa','6a 65','58','aa',' 6a 79','58','aa','31 c0','aa','40','cd 80']
答案 2 :(得分:0)
from itertools import chain
with open("objdump") as inf:
opstrs = (line[9:35] for line in inf)
ops = (opstr.split() for opstr in opstrs)
opcode = " ".join(chain(*ops))
导致操作码:
'89 e7 89 fe 6a 6b 58 aa 6a 65 58 aa 6a 79 58 aa 31 c0 aa 40 cd 80'