用于操作码解析的python

时间:2012-06-14 18:50:05

标签: python regex regular-language

我刚写了一些代码来尝试用以下格式的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] [空格]结束时会失败。

有人可以建议一个更好的正则表达式吗?

3 个答案:

答案 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'