1
+ from capstone import CS_ARCH_ARM , CS_MODE_THUMB , Cs
1
2
from unicorn import (
2
3
UC_ARCH_ARM ,
3
- UC_ERR_MAP ,
4
- UC_HOOK_BLOCK ,
5
4
UC_HOOK_CODE ,
6
5
UC_HOOK_MEM_FETCH_UNMAPPED ,
7
- UC_HOOK_MEM_READ ,
8
- UC_HOOK_MEM_READ_AFTER ,
9
6
UC_HOOK_MEM_READ_UNMAPPED ,
10
7
UC_HOOK_MEM_WRITE_UNMAPPED ,
11
8
UC_MODE_THUMB ,
12
9
Uc ,
13
- UcError ,
14
10
)
15
11
from unicorn .arm_const import (
16
12
UC_ARM_REG_PC ,
22
18
UC_ARM_REG_SP ,
23
19
)
24
20
25
- from capstone import Cs , CS_ARCH_ARM , CS_MODE_THUMB
26
- from unicorn .unicorn_const import UC_HOOK_MEM_WRITE
27
-
28
21
cs = Cs (CS_ARCH_ARM , CS_MODE_THUMB )
29
22
30
23
PAGE_SIZE = 0x1000
@@ -46,15 +39,17 @@ def hook_mem_read(uc, access, address, size, value, user_data):
46
39
def hook_mem_read_after (uc , access , address , size , value , user_data ):
47
40
if address < 0x38000 :
48
41
print (
49
- ">>> Memory READ at 0x%x, data size = %u, data value = 0x%x" % (address , size , value )
42
+ ">>> Memory READ at 0x%x, data size = %u, data value = 0x%x"
43
+ % (address , size , value )
50
44
)
51
45
return True
52
46
53
47
54
48
def hook_mem_write (uc , access , address , size , value , user_data ):
55
49
if address < 0xF0000000 :
56
50
print (
57
- ">>> Memory WRITE at 0x%x, data size = %u, data value = 0x%x" % (address , size , value )
51
+ ">>> Memory WRITE at 0x%x, data size = %u, data value = 0x%x"
52
+ % (address , size , value )
58
53
)
59
54
return True
60
55
@@ -101,15 +96,18 @@ def hook_instr(mu: Uc, address, size, user_data):
101
96
# input()
102
97
pass
103
98
if address >= 0x0369E0 and address <= 0x36A00 :
104
- print (">>> Tracing instruction at 0x%X, instruction size = 0x%X" % (address , size ))
99
+ print (
100
+ ">>> Tracing instruction at 0x%X, instruction size = 0x%X" % (address , size )
101
+ )
105
102
R0 = mu .reg_read (UC_ARM_REG_R0 )
106
103
R1 = mu .reg_read (UC_ARM_REG_R1 )
107
104
R2 = mu .reg_read (UC_ARM_REG_R2 )
108
105
R3 = mu .reg_read (UC_ARM_REG_R3 )
109
106
R4 = mu .reg_read (UC_ARM_REG_R4 )
110
107
PC = mu .reg_read (UC_ARM_REG_PC )
111
108
print (
112
- f"R0: { R0 :08X} R1: { R1 :08X} R2: { R2 :08X} R3: { R3 :08X} R4: { R4 :08X} PC: { PC :08X} "
109
+ f"R0: { R0 :08X} R1: { R1 :08X} R2: { R2 :08X} "
110
+ f"R3: { R3 :08X} R4: { R4 :08X} PC: { PC :08X} "
113
111
)
114
112
mem = mu .mem_read (address , size )
115
113
for i in cs .disasm (mem , address ):
@@ -120,15 +118,18 @@ def hook_instr(mu: Uc, address, size, user_data):
120
118
print ()
121
119
# dump_hex_buf(mu, R0, R1)
122
120
123
- mu .last_instr = f">>> Tracing instruction at 0x{ address :08X} , instruction size = 0x{ size :X} \n "
121
+ mu .last_instr = (
122
+ f">>> Tracing instruction at 0x{ address :08X} , instruction size = 0x{ size :X} \n "
123
+ )
124
124
R0 = mu .reg_read (UC_ARM_REG_R0 )
125
125
R1 = mu .reg_read (UC_ARM_REG_R1 )
126
126
R2 = mu .reg_read (UC_ARM_REG_R2 )
127
127
R3 = mu .reg_read (UC_ARM_REG_R3 )
128
128
R4 = mu .reg_read (UC_ARM_REG_R4 )
129
129
PC = mu .reg_read (UC_ARM_REG_PC )
130
130
mu .last_instr += (
131
- f"R0: { R0 :08X} R1: { R1 :08X} R2: { R2 :08X} R3: { R3 :08X} R4: { R4 :08X} PC: { PC :08X} \n "
131
+ f"R0: { R0 :08X} R1: { R1 :08X} R2: { R2 :08X} "
132
+ f"R3: { R3 :08X} R4: { R4 :08X} PC: { PC :08X} \n "
132
133
)
133
134
134
135
# branch = False
0 commit comments