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] [スペース] で終わる命令がある場合は失敗することは確かです。

誰かが同じものに対してより良い正規表現を提案できますか?

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 に答える