3

我刚刚编写了一些代码来尝试从以下格式的 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() + " "

虽然上面的代码片段有点适用于我的所有样本,但我确信在我有一条以 [af][space] 结尾的指令的情况下它会失败。

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

4

3 回答 3

2

您可以尝试以下方法:

r' ([\da-f]+):\s+((?:[0-9a-f]{2} )+)'

这应该在操作码之后更可靠地停止。

于 2012-06-14T18:54:40.033 回答
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']

于 2012-06-14T20:29:06.207 回答
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'
于 2012-06-15T02:17:49.677 回答