1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
#! /usr/bin/env python
from miasm.arch.arm_arch import arm_mn
from miasm.core.bin_stream import bin_stream
from miasm.core import parse_asm
from miasm.core import asmbloc
import struct
my_mn = arm_mn
####filelogger sc####
all_bloc, symbol_pool = parse_asm.parse_txt(my_mn,r'''
toto:
STMFD SP!, {R0-R12, LR}^
MOV R11, LR
MOV R11, R0, ROR 4
STC P2,C3, [R5, 24]!
MOV R1, R0
LDR R2, [PC, R0 ROR 0x2]
CMP R2, R3
BLE tutu
ORR R0, R1, R2
ORRLE R0, R0, R0
ORR R0, R0, R0
LDR R3, [R11, 0x98]
LDR R3, [R11, -0x98]
STMFD SP!, {R4-R6,R11,R12,LR,PC}
STMFD SP!, {R0-R12, SP, LR, PC}
LDMIA R9, {R9, R12}
BLE tutu
LDMFD SP, {R4-R8,R11,SP,PC}
tutu:
LDMFD SP!, {R0-R12, LR}
BX LR
''')
g = asmbloc.bloc2graph(all_bloc[0])
open("graph.txt" , "w").write(g)
for b in all_bloc[0]:
print b
symbol_pool.add(asmbloc.asm_label('base_address', 0x0))
symbol_pool.getby_name("toto").offset = 0x0
resolved_b, patches = asmbloc.asm_resolve_final(my_mn, all_bloc[0], symbol_pool)
print patches
f = open('uu.bin', 'w')
for p, v in patches.items():
f.seek(p)
f.write(v)
f.close()
print 'DISASSEMBLE FILE'
data = open('uu.bin', 'rb').read()
in_str = bin_stream(data)
job_done = set()
symbol_pool = asmbloc.asm_symbol_pool()
all_bloc = asmbloc.dis_bloc_all(my_mn, in_str, 0, job_done, symbol_pool, follow_call = False, lines_wd = 20)
g = asmbloc.bloc2graph(all_bloc)
open("graph2.txt" , "w").write(g)
|