Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
3f8370b4f8
2
.gitignore
vendored
2
.gitignore
vendored
@ -86,4 +86,4 @@ regress/sigill2
|
|||||||
regress/block_test
|
regress/block_test
|
||||||
regress/map_write
|
regress/map_write
|
||||||
regress/ro_mem_test
|
regress/ro_mem_test
|
||||||
|
regress/nr_mem_test
|
||||||
|
@ -15,6 +15,7 @@ SAMPLE_X86 = $(TMPDIR)/sample_x86
|
|||||||
|
|
||||||
all:
|
all:
|
||||||
cd python && $(MAKE) gen_const
|
cd python && $(MAKE) gen_const
|
||||||
|
cd go && $(MAKE) gen_const
|
||||||
|
|
||||||
samples: expected python
|
samples: expected python
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ import sys, re
|
|||||||
|
|
||||||
INCL_DIR = '../include/unicorn/'
|
INCL_DIR = '../include/unicorn/'
|
||||||
|
|
||||||
include = [ 'arm.h', 'arm64.h', 'mips.h', 'x86.h', 'sparc.h', 'm68k.h' ]
|
include = [ 'arm.h', 'arm64.h', 'mips.h', 'x86.h', 'sparc.h', 'm68k.h', 'unicorn.h' ]
|
||||||
|
|
||||||
template = {
|
template = {
|
||||||
'python': {
|
'python': {
|
||||||
@ -20,13 +20,14 @@ template = {
|
|||||||
'x86.h': 'x86',
|
'x86.h': 'x86',
|
||||||
'sparc.h': 'sparc',
|
'sparc.h': 'sparc',
|
||||||
'm68k.h': 'm68k',
|
'm68k.h': 'm68k',
|
||||||
|
'unicorn.h': 'unicorn',
|
||||||
'comment_open': '#',
|
'comment_open': '#',
|
||||||
'comment_close': '',
|
'comment_close': '',
|
||||||
},
|
},
|
||||||
'go': {
|
'go': {
|
||||||
'header': "package unicorn\n// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [%s_const.go]\nconst (",
|
'header': "package unicorn\n// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [%s_const.go]\nconst (\n",
|
||||||
'footer': ")",
|
'footer': ")",
|
||||||
'line_format': '%s = %s\n',
|
'line_format': '\t%s = %s\n',
|
||||||
'out_file': './go/unicorn/%s_const.go',
|
'out_file': './go/unicorn/%s_const.go',
|
||||||
# prefixes for constant filenames of all archs - case sensitive
|
# prefixes for constant filenames of all archs - case sensitive
|
||||||
'arm.h': 'arm',
|
'arm.h': 'arm',
|
||||||
@ -35,6 +36,7 @@ template = {
|
|||||||
'x86.h': 'x86',
|
'x86.h': 'x86',
|
||||||
'sparc.h': 'sparc',
|
'sparc.h': 'sparc',
|
||||||
'm68k.h': 'm68k',
|
'm68k.h': 'm68k',
|
||||||
|
'unicorn.h': 'unicorn',
|
||||||
'comment_open': '//',
|
'comment_open': '//',
|
||||||
'comment_close': '',
|
'comment_close': '',
|
||||||
},
|
},
|
||||||
@ -50,9 +52,11 @@ def gen(lang):
|
|||||||
prefix = templ[target]
|
prefix = templ[target]
|
||||||
outfile = open(templ['out_file'] %(prefix), 'w')
|
outfile = open(templ['out_file'] %(prefix), 'w')
|
||||||
outfile.write(templ['header'] % (prefix))
|
outfile.write(templ['header'] % (prefix))
|
||||||
|
if target == 'unicorn.h':
|
||||||
|
prefix = ''
|
||||||
lines = open(INCL_DIR + target).readlines()
|
lines = open(INCL_DIR + target).readlines()
|
||||||
|
|
||||||
|
previous = {}
|
||||||
count = 0
|
count = 0
|
||||||
for line in lines:
|
for line in lines:
|
||||||
line = line.strip()
|
line = line.strip()
|
||||||
@ -65,17 +69,21 @@ def gen(lang):
|
|||||||
if line == '' or line.startswith('//'):
|
if line == '' or line.startswith('//'):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if not line.startswith("UC_" + prefix.upper()):
|
|
||||||
continue
|
|
||||||
|
|
||||||
tmp = line.strip().split(',')
|
tmp = line.strip().split(',')
|
||||||
for t in tmp:
|
for t in tmp:
|
||||||
t = t.strip()
|
t = t.strip()
|
||||||
if not t or t.startswith('//'): continue
|
if not t or t.startswith('//'): continue
|
||||||
f = re.split('\s+', t)
|
f = re.split('\s+', t)
|
||||||
|
|
||||||
|
# parse #define UC_TARGET (num)
|
||||||
|
define = False
|
||||||
|
if f[0] == '#define' and len(f) >= 3 and f[2].isdigit():
|
||||||
|
define = True
|
||||||
|
f.pop(0)
|
||||||
|
f.insert(1, '=')
|
||||||
|
|
||||||
if f[0].startswith("UC_" + prefix.upper()):
|
if f[0].startswith("UC_" + prefix.upper()):
|
||||||
if len(f) > 1 and f[1] not in '//=':
|
if len(f) > 1 and f[1] not in ('//', '='):
|
||||||
print("Error: Unable to convert %s" % f)
|
print("Error: Unable to convert %s" % f)
|
||||||
continue
|
continue
|
||||||
elif len(f) > 1 and f[1] == '=':
|
elif len(f) > 1 and f[1] == '=':
|
||||||
@ -84,29 +92,31 @@ def gen(lang):
|
|||||||
rhs = str(count)
|
rhs = str(count)
|
||||||
count += 1
|
count += 1
|
||||||
|
|
||||||
try:
|
lhs = f[0].strip()
|
||||||
count = int(rhs) + 1
|
# evaluate bitshifts in constants e.g. "UC_X86 = 1 << 1"
|
||||||
if (count == 1):
|
match = re.match(r'(?P<rhs>\s*\d+\s*<<\s*\d+\s*)', rhs)
|
||||||
outfile.write("\n")
|
if match:
|
||||||
except ValueError:
|
rhs = eval(match.group(1))
|
||||||
if lang == 'ocaml':
|
else:
|
||||||
# ocaml uses lsl for '<<', lor for '|'
|
# evaluate references to other constants e.g. "UC_ARM_REG_X = UC_ARM_REG_SP"
|
||||||
rhs = rhs.replace('<<', ' lsl ')
|
match = re.match(r'^([^\d]\w+)$', rhs)
|
||||||
rhs = rhs.replace('|', ' lor ')
|
if match:
|
||||||
# ocaml variable has _ as prefix
|
rhs = previous[match.group(1)]
|
||||||
if rhs[0].isalpha():
|
|
||||||
rhs = '_' + rhs
|
|
||||||
|
|
||||||
outfile.write(templ['line_format'] %(f[0].strip(), rhs))
|
count = int(rhs) + 1
|
||||||
|
if (count == 1):
|
||||||
|
outfile.write("\n")
|
||||||
|
outfile.write(templ['line_format'] % (lhs, rhs))
|
||||||
|
previous[lhs] = rhs
|
||||||
|
|
||||||
outfile.write(templ['footer'])
|
outfile.write(templ['footer'])
|
||||||
outfile.close()
|
outfile.close()
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
try:
|
lang = sys.argv[1]
|
||||||
gen(sys.argv[1])
|
if not lang in template:
|
||||||
except:
|
raise RuntimeError("Unsupported binding %s" % lang)
|
||||||
raise RuntimeError("Unsupported binding %s" % sys.argv[1])
|
gen(sys.argv[1])
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
if len(sys.argv) < 2:
|
if len(sys.argv) < 2:
|
||||||
|
@ -2,9 +2,13 @@
|
|||||||
|
|
||||||
.PHONY: gen_const test
|
.PHONY: gen_const test
|
||||||
|
|
||||||
|
all:
|
||||||
|
$(MAKE) gen_const
|
||||||
|
cd unicorn && go build
|
||||||
|
$(MAKE) test
|
||||||
|
|
||||||
gen_const:
|
gen_const:
|
||||||
cd .. && python const_generator.py go
|
cd .. && python const_generator.py go
|
||||||
cd unicorn && go build
|
|
||||||
|
|
||||||
test:
|
test:
|
||||||
cd unicorn && go test
|
cd unicorn && go test
|
||||||
|
@ -1,276 +1,277 @@
|
|||||||
package unicorn
|
package unicorn
|
||||||
// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [arm64_const.go]
|
// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [arm64_const.go]
|
||||||
const (
|
const (
|
||||||
|
|
||||||
// ARM64 registers
|
// ARM64 registers
|
||||||
|
|
||||||
UC_ARM64_REG_INVALID = 0
|
UC_ARM64_REG_INVALID = 0
|
||||||
UC_ARM64_REG_X29 = 1
|
UC_ARM64_REG_X29 = 1
|
||||||
UC_ARM64_REG_X30 = 2
|
UC_ARM64_REG_X30 = 2
|
||||||
UC_ARM64_REG_NZCV = 3
|
UC_ARM64_REG_NZCV = 3
|
||||||
UC_ARM64_REG_SP = 4
|
UC_ARM64_REG_SP = 4
|
||||||
UC_ARM64_REG_WSP = 5
|
UC_ARM64_REG_WSP = 5
|
||||||
UC_ARM64_REG_WZR = 6
|
UC_ARM64_REG_WZR = 6
|
||||||
UC_ARM64_REG_XZR = 7
|
UC_ARM64_REG_XZR = 7
|
||||||
UC_ARM64_REG_B0 = 8
|
UC_ARM64_REG_B0 = 8
|
||||||
UC_ARM64_REG_B1 = 9
|
UC_ARM64_REG_B1 = 9
|
||||||
UC_ARM64_REG_B2 = 10
|
UC_ARM64_REG_B2 = 10
|
||||||
UC_ARM64_REG_B3 = 11
|
UC_ARM64_REG_B3 = 11
|
||||||
UC_ARM64_REG_B4 = 12
|
UC_ARM64_REG_B4 = 12
|
||||||
UC_ARM64_REG_B5 = 13
|
UC_ARM64_REG_B5 = 13
|
||||||
UC_ARM64_REG_B6 = 14
|
UC_ARM64_REG_B6 = 14
|
||||||
UC_ARM64_REG_B7 = 15
|
UC_ARM64_REG_B7 = 15
|
||||||
UC_ARM64_REG_B8 = 16
|
UC_ARM64_REG_B8 = 16
|
||||||
UC_ARM64_REG_B9 = 17
|
UC_ARM64_REG_B9 = 17
|
||||||
UC_ARM64_REG_B10 = 18
|
UC_ARM64_REG_B10 = 18
|
||||||
UC_ARM64_REG_B11 = 19
|
UC_ARM64_REG_B11 = 19
|
||||||
UC_ARM64_REG_B12 = 20
|
UC_ARM64_REG_B12 = 20
|
||||||
UC_ARM64_REG_B13 = 21
|
UC_ARM64_REG_B13 = 21
|
||||||
UC_ARM64_REG_B14 = 22
|
UC_ARM64_REG_B14 = 22
|
||||||
UC_ARM64_REG_B15 = 23
|
UC_ARM64_REG_B15 = 23
|
||||||
UC_ARM64_REG_B16 = 24
|
UC_ARM64_REG_B16 = 24
|
||||||
UC_ARM64_REG_B17 = 25
|
UC_ARM64_REG_B17 = 25
|
||||||
UC_ARM64_REG_B18 = 26
|
UC_ARM64_REG_B18 = 26
|
||||||
UC_ARM64_REG_B19 = 27
|
UC_ARM64_REG_B19 = 27
|
||||||
UC_ARM64_REG_B20 = 28
|
UC_ARM64_REG_B20 = 28
|
||||||
UC_ARM64_REG_B21 = 29
|
UC_ARM64_REG_B21 = 29
|
||||||
UC_ARM64_REG_B22 = 30
|
UC_ARM64_REG_B22 = 30
|
||||||
UC_ARM64_REG_B23 = 31
|
UC_ARM64_REG_B23 = 31
|
||||||
UC_ARM64_REG_B24 = 32
|
UC_ARM64_REG_B24 = 32
|
||||||
UC_ARM64_REG_B25 = 33
|
UC_ARM64_REG_B25 = 33
|
||||||
UC_ARM64_REG_B26 = 34
|
UC_ARM64_REG_B26 = 34
|
||||||
UC_ARM64_REG_B27 = 35
|
UC_ARM64_REG_B27 = 35
|
||||||
UC_ARM64_REG_B28 = 36
|
UC_ARM64_REG_B28 = 36
|
||||||
UC_ARM64_REG_B29 = 37
|
UC_ARM64_REG_B29 = 37
|
||||||
UC_ARM64_REG_B30 = 38
|
UC_ARM64_REG_B30 = 38
|
||||||
UC_ARM64_REG_B31 = 39
|
UC_ARM64_REG_B31 = 39
|
||||||
UC_ARM64_REG_D0 = 40
|
UC_ARM64_REG_D0 = 40
|
||||||
UC_ARM64_REG_D1 = 41
|
UC_ARM64_REG_D1 = 41
|
||||||
UC_ARM64_REG_D2 = 42
|
UC_ARM64_REG_D2 = 42
|
||||||
UC_ARM64_REG_D3 = 43
|
UC_ARM64_REG_D3 = 43
|
||||||
UC_ARM64_REG_D4 = 44
|
UC_ARM64_REG_D4 = 44
|
||||||
UC_ARM64_REG_D5 = 45
|
UC_ARM64_REG_D5 = 45
|
||||||
UC_ARM64_REG_D6 = 46
|
UC_ARM64_REG_D6 = 46
|
||||||
UC_ARM64_REG_D7 = 47
|
UC_ARM64_REG_D7 = 47
|
||||||
UC_ARM64_REG_D8 = 48
|
UC_ARM64_REG_D8 = 48
|
||||||
UC_ARM64_REG_D9 = 49
|
UC_ARM64_REG_D9 = 49
|
||||||
UC_ARM64_REG_D10 = 50
|
UC_ARM64_REG_D10 = 50
|
||||||
UC_ARM64_REG_D11 = 51
|
UC_ARM64_REG_D11 = 51
|
||||||
UC_ARM64_REG_D12 = 52
|
UC_ARM64_REG_D12 = 52
|
||||||
UC_ARM64_REG_D13 = 53
|
UC_ARM64_REG_D13 = 53
|
||||||
UC_ARM64_REG_D14 = 54
|
UC_ARM64_REG_D14 = 54
|
||||||
UC_ARM64_REG_D15 = 55
|
UC_ARM64_REG_D15 = 55
|
||||||
UC_ARM64_REG_D16 = 56
|
UC_ARM64_REG_D16 = 56
|
||||||
UC_ARM64_REG_D17 = 57
|
UC_ARM64_REG_D17 = 57
|
||||||
UC_ARM64_REG_D18 = 58
|
UC_ARM64_REG_D18 = 58
|
||||||
UC_ARM64_REG_D19 = 59
|
UC_ARM64_REG_D19 = 59
|
||||||
UC_ARM64_REG_D20 = 60
|
UC_ARM64_REG_D20 = 60
|
||||||
UC_ARM64_REG_D21 = 61
|
UC_ARM64_REG_D21 = 61
|
||||||
UC_ARM64_REG_D22 = 62
|
UC_ARM64_REG_D22 = 62
|
||||||
UC_ARM64_REG_D23 = 63
|
UC_ARM64_REG_D23 = 63
|
||||||
UC_ARM64_REG_D24 = 64
|
UC_ARM64_REG_D24 = 64
|
||||||
UC_ARM64_REG_D25 = 65
|
UC_ARM64_REG_D25 = 65
|
||||||
UC_ARM64_REG_D26 = 66
|
UC_ARM64_REG_D26 = 66
|
||||||
UC_ARM64_REG_D27 = 67
|
UC_ARM64_REG_D27 = 67
|
||||||
UC_ARM64_REG_D28 = 68
|
UC_ARM64_REG_D28 = 68
|
||||||
UC_ARM64_REG_D29 = 69
|
UC_ARM64_REG_D29 = 69
|
||||||
UC_ARM64_REG_D30 = 70
|
UC_ARM64_REG_D30 = 70
|
||||||
UC_ARM64_REG_D31 = 71
|
UC_ARM64_REG_D31 = 71
|
||||||
UC_ARM64_REG_H0 = 72
|
UC_ARM64_REG_H0 = 72
|
||||||
UC_ARM64_REG_H1 = 73
|
UC_ARM64_REG_H1 = 73
|
||||||
UC_ARM64_REG_H2 = 74
|
UC_ARM64_REG_H2 = 74
|
||||||
UC_ARM64_REG_H3 = 75
|
UC_ARM64_REG_H3 = 75
|
||||||
UC_ARM64_REG_H4 = 76
|
UC_ARM64_REG_H4 = 76
|
||||||
UC_ARM64_REG_H5 = 77
|
UC_ARM64_REG_H5 = 77
|
||||||
UC_ARM64_REG_H6 = 78
|
UC_ARM64_REG_H6 = 78
|
||||||
UC_ARM64_REG_H7 = 79
|
UC_ARM64_REG_H7 = 79
|
||||||
UC_ARM64_REG_H8 = 80
|
UC_ARM64_REG_H8 = 80
|
||||||
UC_ARM64_REG_H9 = 81
|
UC_ARM64_REG_H9 = 81
|
||||||
UC_ARM64_REG_H10 = 82
|
UC_ARM64_REG_H10 = 82
|
||||||
UC_ARM64_REG_H11 = 83
|
UC_ARM64_REG_H11 = 83
|
||||||
UC_ARM64_REG_H12 = 84
|
UC_ARM64_REG_H12 = 84
|
||||||
UC_ARM64_REG_H13 = 85
|
UC_ARM64_REG_H13 = 85
|
||||||
UC_ARM64_REG_H14 = 86
|
UC_ARM64_REG_H14 = 86
|
||||||
UC_ARM64_REG_H15 = 87
|
UC_ARM64_REG_H15 = 87
|
||||||
UC_ARM64_REG_H16 = 88
|
UC_ARM64_REG_H16 = 88
|
||||||
UC_ARM64_REG_H17 = 89
|
UC_ARM64_REG_H17 = 89
|
||||||
UC_ARM64_REG_H18 = 90
|
UC_ARM64_REG_H18 = 90
|
||||||
UC_ARM64_REG_H19 = 91
|
UC_ARM64_REG_H19 = 91
|
||||||
UC_ARM64_REG_H20 = 92
|
UC_ARM64_REG_H20 = 92
|
||||||
UC_ARM64_REG_H21 = 93
|
UC_ARM64_REG_H21 = 93
|
||||||
UC_ARM64_REG_H22 = 94
|
UC_ARM64_REG_H22 = 94
|
||||||
UC_ARM64_REG_H23 = 95
|
UC_ARM64_REG_H23 = 95
|
||||||
UC_ARM64_REG_H24 = 96
|
UC_ARM64_REG_H24 = 96
|
||||||
UC_ARM64_REG_H25 = 97
|
UC_ARM64_REG_H25 = 97
|
||||||
UC_ARM64_REG_H26 = 98
|
UC_ARM64_REG_H26 = 98
|
||||||
UC_ARM64_REG_H27 = 99
|
UC_ARM64_REG_H27 = 99
|
||||||
UC_ARM64_REG_H28 = 100
|
UC_ARM64_REG_H28 = 100
|
||||||
UC_ARM64_REG_H29 = 101
|
UC_ARM64_REG_H29 = 101
|
||||||
UC_ARM64_REG_H30 = 102
|
UC_ARM64_REG_H30 = 102
|
||||||
UC_ARM64_REG_H31 = 103
|
UC_ARM64_REG_H31 = 103
|
||||||
UC_ARM64_REG_Q0 = 104
|
UC_ARM64_REG_Q0 = 104
|
||||||
UC_ARM64_REG_Q1 = 105
|
UC_ARM64_REG_Q1 = 105
|
||||||
UC_ARM64_REG_Q2 = 106
|
UC_ARM64_REG_Q2 = 106
|
||||||
UC_ARM64_REG_Q3 = 107
|
UC_ARM64_REG_Q3 = 107
|
||||||
UC_ARM64_REG_Q4 = 108
|
UC_ARM64_REG_Q4 = 108
|
||||||
UC_ARM64_REG_Q5 = 109
|
UC_ARM64_REG_Q5 = 109
|
||||||
UC_ARM64_REG_Q6 = 110
|
UC_ARM64_REG_Q6 = 110
|
||||||
UC_ARM64_REG_Q7 = 111
|
UC_ARM64_REG_Q7 = 111
|
||||||
UC_ARM64_REG_Q8 = 112
|
UC_ARM64_REG_Q8 = 112
|
||||||
UC_ARM64_REG_Q9 = 113
|
UC_ARM64_REG_Q9 = 113
|
||||||
UC_ARM64_REG_Q10 = 114
|
UC_ARM64_REG_Q10 = 114
|
||||||
UC_ARM64_REG_Q11 = 115
|
UC_ARM64_REG_Q11 = 115
|
||||||
UC_ARM64_REG_Q12 = 116
|
UC_ARM64_REG_Q12 = 116
|
||||||
UC_ARM64_REG_Q13 = 117
|
UC_ARM64_REG_Q13 = 117
|
||||||
UC_ARM64_REG_Q14 = 118
|
UC_ARM64_REG_Q14 = 118
|
||||||
UC_ARM64_REG_Q15 = 119
|
UC_ARM64_REG_Q15 = 119
|
||||||
UC_ARM64_REG_Q16 = 120
|
UC_ARM64_REG_Q16 = 120
|
||||||
UC_ARM64_REG_Q17 = 121
|
UC_ARM64_REG_Q17 = 121
|
||||||
UC_ARM64_REG_Q18 = 122
|
UC_ARM64_REG_Q18 = 122
|
||||||
UC_ARM64_REG_Q19 = 123
|
UC_ARM64_REG_Q19 = 123
|
||||||
UC_ARM64_REG_Q20 = 124
|
UC_ARM64_REG_Q20 = 124
|
||||||
UC_ARM64_REG_Q21 = 125
|
UC_ARM64_REG_Q21 = 125
|
||||||
UC_ARM64_REG_Q22 = 126
|
UC_ARM64_REG_Q22 = 126
|
||||||
UC_ARM64_REG_Q23 = 127
|
UC_ARM64_REG_Q23 = 127
|
||||||
UC_ARM64_REG_Q24 = 128
|
UC_ARM64_REG_Q24 = 128
|
||||||
UC_ARM64_REG_Q25 = 129
|
UC_ARM64_REG_Q25 = 129
|
||||||
UC_ARM64_REG_Q26 = 130
|
UC_ARM64_REG_Q26 = 130
|
||||||
UC_ARM64_REG_Q27 = 131
|
UC_ARM64_REG_Q27 = 131
|
||||||
UC_ARM64_REG_Q28 = 132
|
UC_ARM64_REG_Q28 = 132
|
||||||
UC_ARM64_REG_Q29 = 133
|
UC_ARM64_REG_Q29 = 133
|
||||||
UC_ARM64_REG_Q30 = 134
|
UC_ARM64_REG_Q30 = 134
|
||||||
UC_ARM64_REG_Q31 = 135
|
UC_ARM64_REG_Q31 = 135
|
||||||
UC_ARM64_REG_S0 = 136
|
UC_ARM64_REG_S0 = 136
|
||||||
UC_ARM64_REG_S1 = 137
|
UC_ARM64_REG_S1 = 137
|
||||||
UC_ARM64_REG_S2 = 138
|
UC_ARM64_REG_S2 = 138
|
||||||
UC_ARM64_REG_S3 = 139
|
UC_ARM64_REG_S3 = 139
|
||||||
UC_ARM64_REG_S4 = 140
|
UC_ARM64_REG_S4 = 140
|
||||||
UC_ARM64_REG_S5 = 141
|
UC_ARM64_REG_S5 = 141
|
||||||
UC_ARM64_REG_S6 = 142
|
UC_ARM64_REG_S6 = 142
|
||||||
UC_ARM64_REG_S7 = 143
|
UC_ARM64_REG_S7 = 143
|
||||||
UC_ARM64_REG_S8 = 144
|
UC_ARM64_REG_S8 = 144
|
||||||
UC_ARM64_REG_S9 = 145
|
UC_ARM64_REG_S9 = 145
|
||||||
UC_ARM64_REG_S10 = 146
|
UC_ARM64_REG_S10 = 146
|
||||||
UC_ARM64_REG_S11 = 147
|
UC_ARM64_REG_S11 = 147
|
||||||
UC_ARM64_REG_S12 = 148
|
UC_ARM64_REG_S12 = 148
|
||||||
UC_ARM64_REG_S13 = 149
|
UC_ARM64_REG_S13 = 149
|
||||||
UC_ARM64_REG_S14 = 150
|
UC_ARM64_REG_S14 = 150
|
||||||
UC_ARM64_REG_S15 = 151
|
UC_ARM64_REG_S15 = 151
|
||||||
UC_ARM64_REG_S16 = 152
|
UC_ARM64_REG_S16 = 152
|
||||||
UC_ARM64_REG_S17 = 153
|
UC_ARM64_REG_S17 = 153
|
||||||
UC_ARM64_REG_S18 = 154
|
UC_ARM64_REG_S18 = 154
|
||||||
UC_ARM64_REG_S19 = 155
|
UC_ARM64_REG_S19 = 155
|
||||||
UC_ARM64_REG_S20 = 156
|
UC_ARM64_REG_S20 = 156
|
||||||
UC_ARM64_REG_S21 = 157
|
UC_ARM64_REG_S21 = 157
|
||||||
UC_ARM64_REG_S22 = 158
|
UC_ARM64_REG_S22 = 158
|
||||||
UC_ARM64_REG_S23 = 159
|
UC_ARM64_REG_S23 = 159
|
||||||
UC_ARM64_REG_S24 = 160
|
UC_ARM64_REG_S24 = 160
|
||||||
UC_ARM64_REG_S25 = 161
|
UC_ARM64_REG_S25 = 161
|
||||||
UC_ARM64_REG_S26 = 162
|
UC_ARM64_REG_S26 = 162
|
||||||
UC_ARM64_REG_S27 = 163
|
UC_ARM64_REG_S27 = 163
|
||||||
UC_ARM64_REG_S28 = 164
|
UC_ARM64_REG_S28 = 164
|
||||||
UC_ARM64_REG_S29 = 165
|
UC_ARM64_REG_S29 = 165
|
||||||
UC_ARM64_REG_S30 = 166
|
UC_ARM64_REG_S30 = 166
|
||||||
UC_ARM64_REG_S31 = 167
|
UC_ARM64_REG_S31 = 167
|
||||||
UC_ARM64_REG_W0 = 168
|
UC_ARM64_REG_W0 = 168
|
||||||
UC_ARM64_REG_W1 = 169
|
UC_ARM64_REG_W1 = 169
|
||||||
UC_ARM64_REG_W2 = 170
|
UC_ARM64_REG_W2 = 170
|
||||||
UC_ARM64_REG_W3 = 171
|
UC_ARM64_REG_W3 = 171
|
||||||
UC_ARM64_REG_W4 = 172
|
UC_ARM64_REG_W4 = 172
|
||||||
UC_ARM64_REG_W5 = 173
|
UC_ARM64_REG_W5 = 173
|
||||||
UC_ARM64_REG_W6 = 174
|
UC_ARM64_REG_W6 = 174
|
||||||
UC_ARM64_REG_W7 = 175
|
UC_ARM64_REG_W7 = 175
|
||||||
UC_ARM64_REG_W8 = 176
|
UC_ARM64_REG_W8 = 176
|
||||||
UC_ARM64_REG_W9 = 177
|
UC_ARM64_REG_W9 = 177
|
||||||
UC_ARM64_REG_W10 = 178
|
UC_ARM64_REG_W10 = 178
|
||||||
UC_ARM64_REG_W11 = 179
|
UC_ARM64_REG_W11 = 179
|
||||||
UC_ARM64_REG_W12 = 180
|
UC_ARM64_REG_W12 = 180
|
||||||
UC_ARM64_REG_W13 = 181
|
UC_ARM64_REG_W13 = 181
|
||||||
UC_ARM64_REG_W14 = 182
|
UC_ARM64_REG_W14 = 182
|
||||||
UC_ARM64_REG_W15 = 183
|
UC_ARM64_REG_W15 = 183
|
||||||
UC_ARM64_REG_W16 = 184
|
UC_ARM64_REG_W16 = 184
|
||||||
UC_ARM64_REG_W17 = 185
|
UC_ARM64_REG_W17 = 185
|
||||||
UC_ARM64_REG_W18 = 186
|
UC_ARM64_REG_W18 = 186
|
||||||
UC_ARM64_REG_W19 = 187
|
UC_ARM64_REG_W19 = 187
|
||||||
UC_ARM64_REG_W20 = 188
|
UC_ARM64_REG_W20 = 188
|
||||||
UC_ARM64_REG_W21 = 189
|
UC_ARM64_REG_W21 = 189
|
||||||
UC_ARM64_REG_W22 = 190
|
UC_ARM64_REG_W22 = 190
|
||||||
UC_ARM64_REG_W23 = 191
|
UC_ARM64_REG_W23 = 191
|
||||||
UC_ARM64_REG_W24 = 192
|
UC_ARM64_REG_W24 = 192
|
||||||
UC_ARM64_REG_W25 = 193
|
UC_ARM64_REG_W25 = 193
|
||||||
UC_ARM64_REG_W26 = 194
|
UC_ARM64_REG_W26 = 194
|
||||||
UC_ARM64_REG_W27 = 195
|
UC_ARM64_REG_W27 = 195
|
||||||
UC_ARM64_REG_W28 = 196
|
UC_ARM64_REG_W28 = 196
|
||||||
UC_ARM64_REG_W29 = 197
|
UC_ARM64_REG_W29 = 197
|
||||||
UC_ARM64_REG_W30 = 198
|
UC_ARM64_REG_W30 = 198
|
||||||
UC_ARM64_REG_X0 = 199
|
UC_ARM64_REG_X0 = 199
|
||||||
UC_ARM64_REG_X1 = 200
|
UC_ARM64_REG_X1 = 200
|
||||||
UC_ARM64_REG_X2 = 201
|
UC_ARM64_REG_X2 = 201
|
||||||
UC_ARM64_REG_X3 = 202
|
UC_ARM64_REG_X3 = 202
|
||||||
UC_ARM64_REG_X4 = 203
|
UC_ARM64_REG_X4 = 203
|
||||||
UC_ARM64_REG_X5 = 204
|
UC_ARM64_REG_X5 = 204
|
||||||
UC_ARM64_REG_X6 = 205
|
UC_ARM64_REG_X6 = 205
|
||||||
UC_ARM64_REG_X7 = 206
|
UC_ARM64_REG_X7 = 206
|
||||||
UC_ARM64_REG_X8 = 207
|
UC_ARM64_REG_X8 = 207
|
||||||
UC_ARM64_REG_X9 = 208
|
UC_ARM64_REG_X9 = 208
|
||||||
UC_ARM64_REG_X10 = 209
|
UC_ARM64_REG_X10 = 209
|
||||||
UC_ARM64_REG_X11 = 210
|
UC_ARM64_REG_X11 = 210
|
||||||
UC_ARM64_REG_X12 = 211
|
UC_ARM64_REG_X12 = 211
|
||||||
UC_ARM64_REG_X13 = 212
|
UC_ARM64_REG_X13 = 212
|
||||||
UC_ARM64_REG_X14 = 213
|
UC_ARM64_REG_X14 = 213
|
||||||
UC_ARM64_REG_X15 = 214
|
UC_ARM64_REG_X15 = 214
|
||||||
UC_ARM64_REG_X16 = 215
|
UC_ARM64_REG_X16 = 215
|
||||||
UC_ARM64_REG_X17 = 216
|
UC_ARM64_REG_X17 = 216
|
||||||
UC_ARM64_REG_X18 = 217
|
UC_ARM64_REG_X18 = 217
|
||||||
UC_ARM64_REG_X19 = 218
|
UC_ARM64_REG_X19 = 218
|
||||||
UC_ARM64_REG_X20 = 219
|
UC_ARM64_REG_X20 = 219
|
||||||
UC_ARM64_REG_X21 = 220
|
UC_ARM64_REG_X21 = 220
|
||||||
UC_ARM64_REG_X22 = 221
|
UC_ARM64_REG_X22 = 221
|
||||||
UC_ARM64_REG_X23 = 222
|
UC_ARM64_REG_X23 = 222
|
||||||
UC_ARM64_REG_X24 = 223
|
UC_ARM64_REG_X24 = 223
|
||||||
UC_ARM64_REG_X25 = 224
|
UC_ARM64_REG_X25 = 224
|
||||||
UC_ARM64_REG_X26 = 225
|
UC_ARM64_REG_X26 = 225
|
||||||
UC_ARM64_REG_X27 = 226
|
UC_ARM64_REG_X27 = 226
|
||||||
UC_ARM64_REG_X28 = 227
|
UC_ARM64_REG_X28 = 227
|
||||||
UC_ARM64_REG_V0 = 228
|
UC_ARM64_REG_V0 = 228
|
||||||
UC_ARM64_REG_V1 = 229
|
UC_ARM64_REG_V1 = 229
|
||||||
UC_ARM64_REG_V2 = 230
|
UC_ARM64_REG_V2 = 230
|
||||||
UC_ARM64_REG_V3 = 231
|
UC_ARM64_REG_V3 = 231
|
||||||
UC_ARM64_REG_V4 = 232
|
UC_ARM64_REG_V4 = 232
|
||||||
UC_ARM64_REG_V5 = 233
|
UC_ARM64_REG_V5 = 233
|
||||||
UC_ARM64_REG_V6 = 234
|
UC_ARM64_REG_V6 = 234
|
||||||
UC_ARM64_REG_V7 = 235
|
UC_ARM64_REG_V7 = 235
|
||||||
UC_ARM64_REG_V8 = 236
|
UC_ARM64_REG_V8 = 236
|
||||||
UC_ARM64_REG_V9 = 237
|
UC_ARM64_REG_V9 = 237
|
||||||
UC_ARM64_REG_V10 = 238
|
UC_ARM64_REG_V10 = 238
|
||||||
UC_ARM64_REG_V11 = 239
|
UC_ARM64_REG_V11 = 239
|
||||||
UC_ARM64_REG_V12 = 240
|
UC_ARM64_REG_V12 = 240
|
||||||
UC_ARM64_REG_V13 = 241
|
UC_ARM64_REG_V13 = 241
|
||||||
UC_ARM64_REG_V14 = 242
|
UC_ARM64_REG_V14 = 242
|
||||||
UC_ARM64_REG_V15 = 243
|
UC_ARM64_REG_V15 = 243
|
||||||
UC_ARM64_REG_V16 = 244
|
UC_ARM64_REG_V16 = 244
|
||||||
UC_ARM64_REG_V17 = 245
|
UC_ARM64_REG_V17 = 245
|
||||||
UC_ARM64_REG_V18 = 246
|
UC_ARM64_REG_V18 = 246
|
||||||
UC_ARM64_REG_V19 = 247
|
UC_ARM64_REG_V19 = 247
|
||||||
UC_ARM64_REG_V20 = 248
|
UC_ARM64_REG_V20 = 248
|
||||||
UC_ARM64_REG_V21 = 249
|
UC_ARM64_REG_V21 = 249
|
||||||
UC_ARM64_REG_V22 = 250
|
UC_ARM64_REG_V22 = 250
|
||||||
UC_ARM64_REG_V23 = 251
|
UC_ARM64_REG_V23 = 251
|
||||||
UC_ARM64_REG_V24 = 252
|
UC_ARM64_REG_V24 = 252
|
||||||
UC_ARM64_REG_V25 = 253
|
UC_ARM64_REG_V25 = 253
|
||||||
UC_ARM64_REG_V26 = 254
|
UC_ARM64_REG_V26 = 254
|
||||||
UC_ARM64_REG_V27 = 255
|
UC_ARM64_REG_V27 = 255
|
||||||
UC_ARM64_REG_V28 = 256
|
UC_ARM64_REG_V28 = 256
|
||||||
UC_ARM64_REG_V29 = 257
|
UC_ARM64_REG_V29 = 257
|
||||||
UC_ARM64_REG_V30 = 258
|
UC_ARM64_REG_V30 = 258
|
||||||
UC_ARM64_REG_V31 = 259
|
UC_ARM64_REG_V31 = 259
|
||||||
|
|
||||||
// pseudo registers
|
// pseudo registers
|
||||||
UC_ARM64_REG_PC = 260
|
UC_ARM64_REG_PC = 260
|
||||||
UC_ARM64_REG_ENDING = 261
|
UC_ARM64_REG_ENDING = 261
|
||||||
|
|
||||||
// alias registers
|
// alias registers
|
||||||
UC_ARM64_REG_IP1 = UC_ARM64_REG_X16
|
UC_ARM64_REG_IP1 = 215
|
||||||
UC_ARM64_REG_IP0 = UC_ARM64_REG_X17
|
UC_ARM64_REG_IP0 = 216
|
||||||
UC_ARM64_REG_FP = UC_ARM64_REG_X29
|
UC_ARM64_REG_FP = 1
|
||||||
UC_ARM64_REG_LR = UC_ARM64_REG_X30
|
UC_ARM64_REG_LR = 2
|
||||||
)
|
)
|
@ -1,127 +1,128 @@
|
|||||||
package unicorn
|
package unicorn
|
||||||
// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [arm_const.go]
|
// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [arm_const.go]
|
||||||
const (
|
const (
|
||||||
|
|
||||||
// ARM registers
|
// ARM registers
|
||||||
|
|
||||||
UC_ARM_REG_INVALID = 0
|
UC_ARM_REG_INVALID = 0
|
||||||
UC_ARM_REG_APSR = 1
|
UC_ARM_REG_APSR = 1
|
||||||
UC_ARM_REG_APSR_NZCV = 2
|
UC_ARM_REG_APSR_NZCV = 2
|
||||||
UC_ARM_REG_CPSR = 3
|
UC_ARM_REG_CPSR = 3
|
||||||
UC_ARM_REG_FPEXC = 4
|
UC_ARM_REG_FPEXC = 4
|
||||||
UC_ARM_REG_FPINST = 5
|
UC_ARM_REG_FPINST = 5
|
||||||
UC_ARM_REG_FPSCR = 6
|
UC_ARM_REG_FPSCR = 6
|
||||||
UC_ARM_REG_FPSCR_NZCV = 7
|
UC_ARM_REG_FPSCR_NZCV = 7
|
||||||
UC_ARM_REG_FPSID = 8
|
UC_ARM_REG_FPSID = 8
|
||||||
UC_ARM_REG_ITSTATE = 9
|
UC_ARM_REG_ITSTATE = 9
|
||||||
UC_ARM_REG_LR = 10
|
UC_ARM_REG_LR = 10
|
||||||
UC_ARM_REG_PC = 11
|
UC_ARM_REG_PC = 11
|
||||||
UC_ARM_REG_SP = 12
|
UC_ARM_REG_SP = 12
|
||||||
UC_ARM_REG_SPSR = 13
|
UC_ARM_REG_SPSR = 13
|
||||||
UC_ARM_REG_D0 = 14
|
UC_ARM_REG_D0 = 14
|
||||||
UC_ARM_REG_D1 = 15
|
UC_ARM_REG_D1 = 15
|
||||||
UC_ARM_REG_D2 = 16
|
UC_ARM_REG_D2 = 16
|
||||||
UC_ARM_REG_D3 = 17
|
UC_ARM_REG_D3 = 17
|
||||||
UC_ARM_REG_D4 = 18
|
UC_ARM_REG_D4 = 18
|
||||||
UC_ARM_REG_D5 = 19
|
UC_ARM_REG_D5 = 19
|
||||||
UC_ARM_REG_D6 = 20
|
UC_ARM_REG_D6 = 20
|
||||||
UC_ARM_REG_D7 = 21
|
UC_ARM_REG_D7 = 21
|
||||||
UC_ARM_REG_D8 = 22
|
UC_ARM_REG_D8 = 22
|
||||||
UC_ARM_REG_D9 = 23
|
UC_ARM_REG_D9 = 23
|
||||||
UC_ARM_REG_D10 = 24
|
UC_ARM_REG_D10 = 24
|
||||||
UC_ARM_REG_D11 = 25
|
UC_ARM_REG_D11 = 25
|
||||||
UC_ARM_REG_D12 = 26
|
UC_ARM_REG_D12 = 26
|
||||||
UC_ARM_REG_D13 = 27
|
UC_ARM_REG_D13 = 27
|
||||||
UC_ARM_REG_D14 = 28
|
UC_ARM_REG_D14 = 28
|
||||||
UC_ARM_REG_D15 = 29
|
UC_ARM_REG_D15 = 29
|
||||||
UC_ARM_REG_D16 = 30
|
UC_ARM_REG_D16 = 30
|
||||||
UC_ARM_REG_D17 = 31
|
UC_ARM_REG_D17 = 31
|
||||||
UC_ARM_REG_D18 = 32
|
UC_ARM_REG_D18 = 32
|
||||||
UC_ARM_REG_D19 = 33
|
UC_ARM_REG_D19 = 33
|
||||||
UC_ARM_REG_D20 = 34
|
UC_ARM_REG_D20 = 34
|
||||||
UC_ARM_REG_D21 = 35
|
UC_ARM_REG_D21 = 35
|
||||||
UC_ARM_REG_D22 = 36
|
UC_ARM_REG_D22 = 36
|
||||||
UC_ARM_REG_D23 = 37
|
UC_ARM_REG_D23 = 37
|
||||||
UC_ARM_REG_D24 = 38
|
UC_ARM_REG_D24 = 38
|
||||||
UC_ARM_REG_D25 = 39
|
UC_ARM_REG_D25 = 39
|
||||||
UC_ARM_REG_D26 = 40
|
UC_ARM_REG_D26 = 40
|
||||||
UC_ARM_REG_D27 = 41
|
UC_ARM_REG_D27 = 41
|
||||||
UC_ARM_REG_D28 = 42
|
UC_ARM_REG_D28 = 42
|
||||||
UC_ARM_REG_D29 = 43
|
UC_ARM_REG_D29 = 43
|
||||||
UC_ARM_REG_D30 = 44
|
UC_ARM_REG_D30 = 44
|
||||||
UC_ARM_REG_D31 = 45
|
UC_ARM_REG_D31 = 45
|
||||||
UC_ARM_REG_FPINST2 = 46
|
UC_ARM_REG_FPINST2 = 46
|
||||||
UC_ARM_REG_MVFR0 = 47
|
UC_ARM_REG_MVFR0 = 47
|
||||||
UC_ARM_REG_MVFR1 = 48
|
UC_ARM_REG_MVFR1 = 48
|
||||||
UC_ARM_REG_MVFR2 = 49
|
UC_ARM_REG_MVFR2 = 49
|
||||||
UC_ARM_REG_Q0 = 50
|
UC_ARM_REG_Q0 = 50
|
||||||
UC_ARM_REG_Q1 = 51
|
UC_ARM_REG_Q1 = 51
|
||||||
UC_ARM_REG_Q2 = 52
|
UC_ARM_REG_Q2 = 52
|
||||||
UC_ARM_REG_Q3 = 53
|
UC_ARM_REG_Q3 = 53
|
||||||
UC_ARM_REG_Q4 = 54
|
UC_ARM_REG_Q4 = 54
|
||||||
UC_ARM_REG_Q5 = 55
|
UC_ARM_REG_Q5 = 55
|
||||||
UC_ARM_REG_Q6 = 56
|
UC_ARM_REG_Q6 = 56
|
||||||
UC_ARM_REG_Q7 = 57
|
UC_ARM_REG_Q7 = 57
|
||||||
UC_ARM_REG_Q8 = 58
|
UC_ARM_REG_Q8 = 58
|
||||||
UC_ARM_REG_Q9 = 59
|
UC_ARM_REG_Q9 = 59
|
||||||
UC_ARM_REG_Q10 = 60
|
UC_ARM_REG_Q10 = 60
|
||||||
UC_ARM_REG_Q11 = 61
|
UC_ARM_REG_Q11 = 61
|
||||||
UC_ARM_REG_Q12 = 62
|
UC_ARM_REG_Q12 = 62
|
||||||
UC_ARM_REG_Q13 = 63
|
UC_ARM_REG_Q13 = 63
|
||||||
UC_ARM_REG_Q14 = 64
|
UC_ARM_REG_Q14 = 64
|
||||||
UC_ARM_REG_Q15 = 65
|
UC_ARM_REG_Q15 = 65
|
||||||
UC_ARM_REG_R0 = 66
|
UC_ARM_REG_R0 = 66
|
||||||
UC_ARM_REG_R1 = 67
|
UC_ARM_REG_R1 = 67
|
||||||
UC_ARM_REG_R2 = 68
|
UC_ARM_REG_R2 = 68
|
||||||
UC_ARM_REG_R3 = 69
|
UC_ARM_REG_R3 = 69
|
||||||
UC_ARM_REG_R4 = 70
|
UC_ARM_REG_R4 = 70
|
||||||
UC_ARM_REG_R5 = 71
|
UC_ARM_REG_R5 = 71
|
||||||
UC_ARM_REG_R6 = 72
|
UC_ARM_REG_R6 = 72
|
||||||
UC_ARM_REG_R7 = 73
|
UC_ARM_REG_R7 = 73
|
||||||
UC_ARM_REG_R8 = 74
|
UC_ARM_REG_R8 = 74
|
||||||
UC_ARM_REG_R9 = 75
|
UC_ARM_REG_R9 = 75
|
||||||
UC_ARM_REG_R10 = 76
|
UC_ARM_REG_R10 = 76
|
||||||
UC_ARM_REG_R11 = 77
|
UC_ARM_REG_R11 = 77
|
||||||
UC_ARM_REG_R12 = 78
|
UC_ARM_REG_R12 = 78
|
||||||
UC_ARM_REG_S0 = 79
|
UC_ARM_REG_S0 = 79
|
||||||
UC_ARM_REG_S1 = 80
|
UC_ARM_REG_S1 = 80
|
||||||
UC_ARM_REG_S2 = 81
|
UC_ARM_REG_S2 = 81
|
||||||
UC_ARM_REG_S3 = 82
|
UC_ARM_REG_S3 = 82
|
||||||
UC_ARM_REG_S4 = 83
|
UC_ARM_REG_S4 = 83
|
||||||
UC_ARM_REG_S5 = 84
|
UC_ARM_REG_S5 = 84
|
||||||
UC_ARM_REG_S6 = 85
|
UC_ARM_REG_S6 = 85
|
||||||
UC_ARM_REG_S7 = 86
|
UC_ARM_REG_S7 = 86
|
||||||
UC_ARM_REG_S8 = 87
|
UC_ARM_REG_S8 = 87
|
||||||
UC_ARM_REG_S9 = 88
|
UC_ARM_REG_S9 = 88
|
||||||
UC_ARM_REG_S10 = 89
|
UC_ARM_REG_S10 = 89
|
||||||
UC_ARM_REG_S11 = 90
|
UC_ARM_REG_S11 = 90
|
||||||
UC_ARM_REG_S12 = 91
|
UC_ARM_REG_S12 = 91
|
||||||
UC_ARM_REG_S13 = 92
|
UC_ARM_REG_S13 = 92
|
||||||
UC_ARM_REG_S14 = 93
|
UC_ARM_REG_S14 = 93
|
||||||
UC_ARM_REG_S15 = 94
|
UC_ARM_REG_S15 = 94
|
||||||
UC_ARM_REG_S16 = 95
|
UC_ARM_REG_S16 = 95
|
||||||
UC_ARM_REG_S17 = 96
|
UC_ARM_REG_S17 = 96
|
||||||
UC_ARM_REG_S18 = 97
|
UC_ARM_REG_S18 = 97
|
||||||
UC_ARM_REG_S19 = 98
|
UC_ARM_REG_S19 = 98
|
||||||
UC_ARM_REG_S20 = 99
|
UC_ARM_REG_S20 = 99
|
||||||
UC_ARM_REG_S21 = 100
|
UC_ARM_REG_S21 = 100
|
||||||
UC_ARM_REG_S22 = 101
|
UC_ARM_REG_S22 = 101
|
||||||
UC_ARM_REG_S23 = 102
|
UC_ARM_REG_S23 = 102
|
||||||
UC_ARM_REG_S24 = 103
|
UC_ARM_REG_S24 = 103
|
||||||
UC_ARM_REG_S25 = 104
|
UC_ARM_REG_S25 = 104
|
||||||
UC_ARM_REG_S26 = 105
|
UC_ARM_REG_S26 = 105
|
||||||
UC_ARM_REG_S27 = 106
|
UC_ARM_REG_S27 = 106
|
||||||
UC_ARM_REG_S28 = 107
|
UC_ARM_REG_S28 = 107
|
||||||
UC_ARM_REG_S29 = 108
|
UC_ARM_REG_S29 = 108
|
||||||
UC_ARM_REG_S30 = 109
|
UC_ARM_REG_S30 = 109
|
||||||
UC_ARM_REG_S31 = 110
|
UC_ARM_REG_S31 = 110
|
||||||
UC_ARM_REG_ENDING = 111
|
UC_ARM_REG_ENDING = 111
|
||||||
|
|
||||||
// alias registers
|
// alias registers
|
||||||
UC_ARM_REG_R13 = UC_ARM_REG_SP
|
UC_ARM_REG_R13 = 12
|
||||||
UC_ARM_REG_R14 = UC_ARM_REG_LR
|
UC_ARM_REG_R14 = 10
|
||||||
UC_ARM_REG_R15 = UC_ARM_REG_PC
|
UC_ARM_REG_R15 = 11
|
||||||
UC_ARM_REG_SB = UC_ARM_REG_R9
|
UC_ARM_REG_SB = 75
|
||||||
UC_ARM_REG_SL = UC_ARM_REG_R10
|
UC_ARM_REG_SL = 76
|
||||||
UC_ARM_REG_FP = UC_ARM_REG_R11
|
UC_ARM_REG_FP = 77
|
||||||
UC_ARM_REG_IP = UC_ARM_REG_R12
|
UC_ARM_REG_IP = 78
|
||||||
)
|
)
|
@ -1,22 +0,0 @@
|
|||||||
package unicorn
|
|
||||||
|
|
||||||
// #include <unicorn/unicorn.h>
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
// TODO: update const script to generate these?
|
|
||||||
const (
|
|
||||||
UC_HOOK_BLOCK = C.UC_HOOK_BLOCK
|
|
||||||
UC_HOOK_CODE = C.UC_HOOK_CODE
|
|
||||||
UC_HOOK_MEM_INVALID = C.UC_HOOK_MEM_INVALID
|
|
||||||
UC_HOOK_MEM_READ = C.UC_HOOK_MEM_READ
|
|
||||||
UC_HOOK_MEM_WRITE = C.UC_HOOK_MEM_WRITE
|
|
||||||
UC_HOOK_MEM_READ_WRITE = C.UC_HOOK_MEM_READ_WRITE
|
|
||||||
UC_HOOK_INSN = C.UC_HOOK_INSN
|
|
||||||
|
|
||||||
UC_ARCH_X86 = C.UC_ARCH_X86
|
|
||||||
UC_MODE_32 = C.UC_MODE_32
|
|
||||||
UC_MODE_64 = C.UC_MODE_64
|
|
||||||
|
|
||||||
UC_ERR_MEM_READ = C.UC_ERR_MEM_READ
|
|
||||||
UC_ERR_MEM_WRITE = C.UC_ERR_MEM_WRITE
|
|
||||||
)
|
|
@ -1,26 +1,27 @@
|
|||||||
package unicorn
|
package unicorn
|
||||||
// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [m68k_const.go]
|
// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [m68k_const.go]
|
||||||
const (
|
const (
|
||||||
|
|
||||||
// M68K registers
|
// M68K registers
|
||||||
|
|
||||||
UC_M68K_REG_INVALID = 0
|
UC_M68K_REG_INVALID = 0
|
||||||
UC_M68K_REG_A0 = 1
|
UC_M68K_REG_A0 = 1
|
||||||
UC_M68K_REG_A1 = 2
|
UC_M68K_REG_A1 = 2
|
||||||
UC_M68K_REG_A2 = 3
|
UC_M68K_REG_A2 = 3
|
||||||
UC_M68K_REG_A3 = 4
|
UC_M68K_REG_A3 = 4
|
||||||
UC_M68K_REG_A4 = 5
|
UC_M68K_REG_A4 = 5
|
||||||
UC_M68K_REG_A5 = 6
|
UC_M68K_REG_A5 = 6
|
||||||
UC_M68K_REG_A6 = 7
|
UC_M68K_REG_A6 = 7
|
||||||
UC_M68K_REG_A7 = 8
|
UC_M68K_REG_A7 = 8
|
||||||
UC_M68K_REG_D0 = 9
|
UC_M68K_REG_D0 = 9
|
||||||
UC_M68K_REG_D1 = 10
|
UC_M68K_REG_D1 = 10
|
||||||
UC_M68K_REG_D2 = 11
|
UC_M68K_REG_D2 = 11
|
||||||
UC_M68K_REG_D3 = 12
|
UC_M68K_REG_D3 = 12
|
||||||
UC_M68K_REG_D4 = 13
|
UC_M68K_REG_D4 = 13
|
||||||
UC_M68K_REG_D5 = 14
|
UC_M68K_REG_D5 = 14
|
||||||
UC_M68K_REG_D6 = 15
|
UC_M68K_REG_D6 = 15
|
||||||
UC_M68K_REG_D7 = 16
|
UC_M68K_REG_D7 = 16
|
||||||
UC_M68K_REG_SR = 17
|
UC_M68K_REG_SR = 17
|
||||||
UC_M68K_REG_PC = 18
|
UC_M68K_REG_PC = 18
|
||||||
UC_M68K_REG_ENDING = 19
|
UC_M68K_REG_ENDING = 19
|
||||||
)
|
)
|
@ -1,197 +1,198 @@
|
|||||||
package unicorn
|
package unicorn
|
||||||
// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [mips_const.go]
|
// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [mips_const.go]
|
||||||
const (
|
const (
|
||||||
|
|
||||||
// MIPS registers
|
// MIPS registers
|
||||||
|
|
||||||
UC_MIPS_REG_INVALID = 0
|
UC_MIPS_REG_INVALID = 0
|
||||||
|
|
||||||
// General purpose registers
|
// General purpose registers
|
||||||
UC_MIPS_REG_PC = 1
|
UC_MIPS_REG_PC = 1
|
||||||
UC_MIPS_REG_0 = 2
|
UC_MIPS_REG_0 = 2
|
||||||
UC_MIPS_REG_1 = 3
|
UC_MIPS_REG_1 = 3
|
||||||
UC_MIPS_REG_2 = 4
|
UC_MIPS_REG_2 = 4
|
||||||
UC_MIPS_REG_3 = 5
|
UC_MIPS_REG_3 = 5
|
||||||
UC_MIPS_REG_4 = 6
|
UC_MIPS_REG_4 = 6
|
||||||
UC_MIPS_REG_5 = 7
|
UC_MIPS_REG_5 = 7
|
||||||
UC_MIPS_REG_6 = 8
|
UC_MIPS_REG_6 = 8
|
||||||
UC_MIPS_REG_7 = 9
|
UC_MIPS_REG_7 = 9
|
||||||
UC_MIPS_REG_8 = 10
|
UC_MIPS_REG_8 = 10
|
||||||
UC_MIPS_REG_9 = 11
|
UC_MIPS_REG_9 = 11
|
||||||
UC_MIPS_REG_10 = 12
|
UC_MIPS_REG_10 = 12
|
||||||
UC_MIPS_REG_11 = 13
|
UC_MIPS_REG_11 = 13
|
||||||
UC_MIPS_REG_12 = 14
|
UC_MIPS_REG_12 = 14
|
||||||
UC_MIPS_REG_13 = 15
|
UC_MIPS_REG_13 = 15
|
||||||
UC_MIPS_REG_14 = 16
|
UC_MIPS_REG_14 = 16
|
||||||
UC_MIPS_REG_15 = 17
|
UC_MIPS_REG_15 = 17
|
||||||
UC_MIPS_REG_16 = 18
|
UC_MIPS_REG_16 = 18
|
||||||
UC_MIPS_REG_17 = 19
|
UC_MIPS_REG_17 = 19
|
||||||
UC_MIPS_REG_18 = 20
|
UC_MIPS_REG_18 = 20
|
||||||
UC_MIPS_REG_19 = 21
|
UC_MIPS_REG_19 = 21
|
||||||
UC_MIPS_REG_20 = 22
|
UC_MIPS_REG_20 = 22
|
||||||
UC_MIPS_REG_21 = 23
|
UC_MIPS_REG_21 = 23
|
||||||
UC_MIPS_REG_22 = 24
|
UC_MIPS_REG_22 = 24
|
||||||
UC_MIPS_REG_23 = 25
|
UC_MIPS_REG_23 = 25
|
||||||
UC_MIPS_REG_24 = 26
|
UC_MIPS_REG_24 = 26
|
||||||
UC_MIPS_REG_25 = 27
|
UC_MIPS_REG_25 = 27
|
||||||
UC_MIPS_REG_26 = 28
|
UC_MIPS_REG_26 = 28
|
||||||
UC_MIPS_REG_27 = 29
|
UC_MIPS_REG_27 = 29
|
||||||
UC_MIPS_REG_28 = 30
|
UC_MIPS_REG_28 = 30
|
||||||
UC_MIPS_REG_29 = 31
|
UC_MIPS_REG_29 = 31
|
||||||
UC_MIPS_REG_30 = 32
|
UC_MIPS_REG_30 = 32
|
||||||
UC_MIPS_REG_31 = 33
|
UC_MIPS_REG_31 = 33
|
||||||
|
|
||||||
// DSP registers
|
// DSP registers
|
||||||
UC_MIPS_REG_DSPCCOND = 34
|
UC_MIPS_REG_DSPCCOND = 34
|
||||||
UC_MIPS_REG_DSPCARRY = 35
|
UC_MIPS_REG_DSPCARRY = 35
|
||||||
UC_MIPS_REG_DSPEFI = 36
|
UC_MIPS_REG_DSPEFI = 36
|
||||||
UC_MIPS_REG_DSPOUTFLAG = 37
|
UC_MIPS_REG_DSPOUTFLAG = 37
|
||||||
UC_MIPS_REG_DSPOUTFLAG16_19 = 38
|
UC_MIPS_REG_DSPOUTFLAG16_19 = 38
|
||||||
UC_MIPS_REG_DSPOUTFLAG20 = 39
|
UC_MIPS_REG_DSPOUTFLAG20 = 39
|
||||||
UC_MIPS_REG_DSPOUTFLAG21 = 40
|
UC_MIPS_REG_DSPOUTFLAG21 = 40
|
||||||
UC_MIPS_REG_DSPOUTFLAG22 = 41
|
UC_MIPS_REG_DSPOUTFLAG22 = 41
|
||||||
UC_MIPS_REG_DSPOUTFLAG23 = 42
|
UC_MIPS_REG_DSPOUTFLAG23 = 42
|
||||||
UC_MIPS_REG_DSPPOS = 43
|
UC_MIPS_REG_DSPPOS = 43
|
||||||
UC_MIPS_REG_DSPSCOUNT = 44
|
UC_MIPS_REG_DSPSCOUNT = 44
|
||||||
|
|
||||||
// ACC registers
|
// ACC registers
|
||||||
UC_MIPS_REG_AC0 = 45
|
UC_MIPS_REG_AC0 = 45
|
||||||
UC_MIPS_REG_AC1 = 46
|
UC_MIPS_REG_AC1 = 46
|
||||||
UC_MIPS_REG_AC2 = 47
|
UC_MIPS_REG_AC2 = 47
|
||||||
UC_MIPS_REG_AC3 = 48
|
UC_MIPS_REG_AC3 = 48
|
||||||
|
|
||||||
// COP registers
|
// COP registers
|
||||||
UC_MIPS_REG_CC0 = 49
|
UC_MIPS_REG_CC0 = 49
|
||||||
UC_MIPS_REG_CC1 = 50
|
UC_MIPS_REG_CC1 = 50
|
||||||
UC_MIPS_REG_CC2 = 51
|
UC_MIPS_REG_CC2 = 51
|
||||||
UC_MIPS_REG_CC3 = 52
|
UC_MIPS_REG_CC3 = 52
|
||||||
UC_MIPS_REG_CC4 = 53
|
UC_MIPS_REG_CC4 = 53
|
||||||
UC_MIPS_REG_CC5 = 54
|
UC_MIPS_REG_CC5 = 54
|
||||||
UC_MIPS_REG_CC6 = 55
|
UC_MIPS_REG_CC6 = 55
|
||||||
UC_MIPS_REG_CC7 = 56
|
UC_MIPS_REG_CC7 = 56
|
||||||
|
|
||||||
// FPU registers
|
// FPU registers
|
||||||
UC_MIPS_REG_F0 = 57
|
UC_MIPS_REG_F0 = 57
|
||||||
UC_MIPS_REG_F1 = 58
|
UC_MIPS_REG_F1 = 58
|
||||||
UC_MIPS_REG_F2 = 59
|
UC_MIPS_REG_F2 = 59
|
||||||
UC_MIPS_REG_F3 = 60
|
UC_MIPS_REG_F3 = 60
|
||||||
UC_MIPS_REG_F4 = 61
|
UC_MIPS_REG_F4 = 61
|
||||||
UC_MIPS_REG_F5 = 62
|
UC_MIPS_REG_F5 = 62
|
||||||
UC_MIPS_REG_F6 = 63
|
UC_MIPS_REG_F6 = 63
|
||||||
UC_MIPS_REG_F7 = 64
|
UC_MIPS_REG_F7 = 64
|
||||||
UC_MIPS_REG_F8 = 65
|
UC_MIPS_REG_F8 = 65
|
||||||
UC_MIPS_REG_F9 = 66
|
UC_MIPS_REG_F9 = 66
|
||||||
UC_MIPS_REG_F10 = 67
|
UC_MIPS_REG_F10 = 67
|
||||||
UC_MIPS_REG_F11 = 68
|
UC_MIPS_REG_F11 = 68
|
||||||
UC_MIPS_REG_F12 = 69
|
UC_MIPS_REG_F12 = 69
|
||||||
UC_MIPS_REG_F13 = 70
|
UC_MIPS_REG_F13 = 70
|
||||||
UC_MIPS_REG_F14 = 71
|
UC_MIPS_REG_F14 = 71
|
||||||
UC_MIPS_REG_F15 = 72
|
UC_MIPS_REG_F15 = 72
|
||||||
UC_MIPS_REG_F16 = 73
|
UC_MIPS_REG_F16 = 73
|
||||||
UC_MIPS_REG_F17 = 74
|
UC_MIPS_REG_F17 = 74
|
||||||
UC_MIPS_REG_F18 = 75
|
UC_MIPS_REG_F18 = 75
|
||||||
UC_MIPS_REG_F19 = 76
|
UC_MIPS_REG_F19 = 76
|
||||||
UC_MIPS_REG_F20 = 77
|
UC_MIPS_REG_F20 = 77
|
||||||
UC_MIPS_REG_F21 = 78
|
UC_MIPS_REG_F21 = 78
|
||||||
UC_MIPS_REG_F22 = 79
|
UC_MIPS_REG_F22 = 79
|
||||||
UC_MIPS_REG_F23 = 80
|
UC_MIPS_REG_F23 = 80
|
||||||
UC_MIPS_REG_F24 = 81
|
UC_MIPS_REG_F24 = 81
|
||||||
UC_MIPS_REG_F25 = 82
|
UC_MIPS_REG_F25 = 82
|
||||||
UC_MIPS_REG_F26 = 83
|
UC_MIPS_REG_F26 = 83
|
||||||
UC_MIPS_REG_F27 = 84
|
UC_MIPS_REG_F27 = 84
|
||||||
UC_MIPS_REG_F28 = 85
|
UC_MIPS_REG_F28 = 85
|
||||||
UC_MIPS_REG_F29 = 86
|
UC_MIPS_REG_F29 = 86
|
||||||
UC_MIPS_REG_F30 = 87
|
UC_MIPS_REG_F30 = 87
|
||||||
UC_MIPS_REG_F31 = 88
|
UC_MIPS_REG_F31 = 88
|
||||||
UC_MIPS_REG_FCC0 = 89
|
UC_MIPS_REG_FCC0 = 89
|
||||||
UC_MIPS_REG_FCC1 = 90
|
UC_MIPS_REG_FCC1 = 90
|
||||||
UC_MIPS_REG_FCC2 = 91
|
UC_MIPS_REG_FCC2 = 91
|
||||||
UC_MIPS_REG_FCC3 = 92
|
UC_MIPS_REG_FCC3 = 92
|
||||||
UC_MIPS_REG_FCC4 = 93
|
UC_MIPS_REG_FCC4 = 93
|
||||||
UC_MIPS_REG_FCC5 = 94
|
UC_MIPS_REG_FCC5 = 94
|
||||||
UC_MIPS_REG_FCC6 = 95
|
UC_MIPS_REG_FCC6 = 95
|
||||||
UC_MIPS_REG_FCC7 = 96
|
UC_MIPS_REG_FCC7 = 96
|
||||||
|
|
||||||
// AFPR128
|
// AFPR128
|
||||||
UC_MIPS_REG_W0 = 97
|
UC_MIPS_REG_W0 = 97
|
||||||
UC_MIPS_REG_W1 = 98
|
UC_MIPS_REG_W1 = 98
|
||||||
UC_MIPS_REG_W2 = 99
|
UC_MIPS_REG_W2 = 99
|
||||||
UC_MIPS_REG_W3 = 100
|
UC_MIPS_REG_W3 = 100
|
||||||
UC_MIPS_REG_W4 = 101
|
UC_MIPS_REG_W4 = 101
|
||||||
UC_MIPS_REG_W5 = 102
|
UC_MIPS_REG_W5 = 102
|
||||||
UC_MIPS_REG_W6 = 103
|
UC_MIPS_REG_W6 = 103
|
||||||
UC_MIPS_REG_W7 = 104
|
UC_MIPS_REG_W7 = 104
|
||||||
UC_MIPS_REG_W8 = 105
|
UC_MIPS_REG_W8 = 105
|
||||||
UC_MIPS_REG_W9 = 106
|
UC_MIPS_REG_W9 = 106
|
||||||
UC_MIPS_REG_W10 = 107
|
UC_MIPS_REG_W10 = 107
|
||||||
UC_MIPS_REG_W11 = 108
|
UC_MIPS_REG_W11 = 108
|
||||||
UC_MIPS_REG_W12 = 109
|
UC_MIPS_REG_W12 = 109
|
||||||
UC_MIPS_REG_W13 = 110
|
UC_MIPS_REG_W13 = 110
|
||||||
UC_MIPS_REG_W14 = 111
|
UC_MIPS_REG_W14 = 111
|
||||||
UC_MIPS_REG_W15 = 112
|
UC_MIPS_REG_W15 = 112
|
||||||
UC_MIPS_REG_W16 = 113
|
UC_MIPS_REG_W16 = 113
|
||||||
UC_MIPS_REG_W17 = 114
|
UC_MIPS_REG_W17 = 114
|
||||||
UC_MIPS_REG_W18 = 115
|
UC_MIPS_REG_W18 = 115
|
||||||
UC_MIPS_REG_W19 = 116
|
UC_MIPS_REG_W19 = 116
|
||||||
UC_MIPS_REG_W20 = 117
|
UC_MIPS_REG_W20 = 117
|
||||||
UC_MIPS_REG_W21 = 118
|
UC_MIPS_REG_W21 = 118
|
||||||
UC_MIPS_REG_W22 = 119
|
UC_MIPS_REG_W22 = 119
|
||||||
UC_MIPS_REG_W23 = 120
|
UC_MIPS_REG_W23 = 120
|
||||||
UC_MIPS_REG_W24 = 121
|
UC_MIPS_REG_W24 = 121
|
||||||
UC_MIPS_REG_W25 = 122
|
UC_MIPS_REG_W25 = 122
|
||||||
UC_MIPS_REG_W26 = 123
|
UC_MIPS_REG_W26 = 123
|
||||||
UC_MIPS_REG_W27 = 124
|
UC_MIPS_REG_W27 = 124
|
||||||
UC_MIPS_REG_W28 = 125
|
UC_MIPS_REG_W28 = 125
|
||||||
UC_MIPS_REG_W29 = 126
|
UC_MIPS_REG_W29 = 126
|
||||||
UC_MIPS_REG_W30 = 127
|
UC_MIPS_REG_W30 = 127
|
||||||
UC_MIPS_REG_W31 = 128
|
UC_MIPS_REG_W31 = 128
|
||||||
UC_MIPS_REG_HI = 129
|
UC_MIPS_REG_HI = 129
|
||||||
UC_MIPS_REG_LO = 130
|
UC_MIPS_REG_LO = 130
|
||||||
UC_MIPS_REG_P0 = 131
|
UC_MIPS_REG_P0 = 131
|
||||||
UC_MIPS_REG_P1 = 132
|
UC_MIPS_REG_P1 = 132
|
||||||
UC_MIPS_REG_P2 = 133
|
UC_MIPS_REG_P2 = 133
|
||||||
UC_MIPS_REG_MPL0 = 134
|
UC_MIPS_REG_MPL0 = 134
|
||||||
UC_MIPS_REG_MPL1 = 135
|
UC_MIPS_REG_MPL1 = 135
|
||||||
UC_MIPS_REG_MPL2 = 136
|
UC_MIPS_REG_MPL2 = 136
|
||||||
UC_MIPS_REG_ENDING = 137
|
UC_MIPS_REG_ENDING = 137
|
||||||
UC_MIPS_REG_ZERO = UC_MIPS_REG_0
|
UC_MIPS_REG_ZERO = 2
|
||||||
UC_MIPS_REG_AT = UC_MIPS_REG_1
|
UC_MIPS_REG_AT = 3
|
||||||
UC_MIPS_REG_V0 = UC_MIPS_REG_2
|
UC_MIPS_REG_V0 = 4
|
||||||
UC_MIPS_REG_V1 = UC_MIPS_REG_3
|
UC_MIPS_REG_V1 = 5
|
||||||
UC_MIPS_REG_A0 = UC_MIPS_REG_4
|
UC_MIPS_REG_A0 = 6
|
||||||
UC_MIPS_REG_A1 = UC_MIPS_REG_5
|
UC_MIPS_REG_A1 = 7
|
||||||
UC_MIPS_REG_A2 = UC_MIPS_REG_6
|
UC_MIPS_REG_A2 = 8
|
||||||
UC_MIPS_REG_A3 = UC_MIPS_REG_7
|
UC_MIPS_REG_A3 = 9
|
||||||
UC_MIPS_REG_T0 = UC_MIPS_REG_8
|
UC_MIPS_REG_T0 = 10
|
||||||
UC_MIPS_REG_T1 = UC_MIPS_REG_9
|
UC_MIPS_REG_T1 = 11
|
||||||
UC_MIPS_REG_T2 = UC_MIPS_REG_10
|
UC_MIPS_REG_T2 = 12
|
||||||
UC_MIPS_REG_T3 = UC_MIPS_REG_11
|
UC_MIPS_REG_T3 = 13
|
||||||
UC_MIPS_REG_T4 = UC_MIPS_REG_12
|
UC_MIPS_REG_T4 = 14
|
||||||
UC_MIPS_REG_T5 = UC_MIPS_REG_13
|
UC_MIPS_REG_T5 = 15
|
||||||
UC_MIPS_REG_T6 = UC_MIPS_REG_14
|
UC_MIPS_REG_T6 = 16
|
||||||
UC_MIPS_REG_T7 = UC_MIPS_REG_15
|
UC_MIPS_REG_T7 = 17
|
||||||
UC_MIPS_REG_S0 = UC_MIPS_REG_16
|
UC_MIPS_REG_S0 = 18
|
||||||
UC_MIPS_REG_S1 = UC_MIPS_REG_17
|
UC_MIPS_REG_S1 = 19
|
||||||
UC_MIPS_REG_S2 = UC_MIPS_REG_18
|
UC_MIPS_REG_S2 = 20
|
||||||
UC_MIPS_REG_S3 = UC_MIPS_REG_19
|
UC_MIPS_REG_S3 = 21
|
||||||
UC_MIPS_REG_S4 = UC_MIPS_REG_20
|
UC_MIPS_REG_S4 = 22
|
||||||
UC_MIPS_REG_S5 = UC_MIPS_REG_21
|
UC_MIPS_REG_S5 = 23
|
||||||
UC_MIPS_REG_S6 = UC_MIPS_REG_22
|
UC_MIPS_REG_S6 = 24
|
||||||
UC_MIPS_REG_S7 = UC_MIPS_REG_23
|
UC_MIPS_REG_S7 = 25
|
||||||
UC_MIPS_REG_T8 = UC_MIPS_REG_24
|
UC_MIPS_REG_T8 = 26
|
||||||
UC_MIPS_REG_T9 = UC_MIPS_REG_25
|
UC_MIPS_REG_T9 = 27
|
||||||
UC_MIPS_REG_K0 = UC_MIPS_REG_26
|
UC_MIPS_REG_K0 = 28
|
||||||
UC_MIPS_REG_K1 = UC_MIPS_REG_27
|
UC_MIPS_REG_K1 = 29
|
||||||
UC_MIPS_REG_GP = UC_MIPS_REG_28
|
UC_MIPS_REG_GP = 30
|
||||||
UC_MIPS_REG_SP = UC_MIPS_REG_29
|
UC_MIPS_REG_SP = 31
|
||||||
UC_MIPS_REG_FP = UC_MIPS_REG_30
|
UC_MIPS_REG_FP = 32
|
||||||
UC_MIPS_REG_S8 = UC_MIPS_REG_30
|
UC_MIPS_REG_S8 = 32
|
||||||
UC_MIPS_REG_RA = UC_MIPS_REG_31
|
UC_MIPS_REG_RA = 33
|
||||||
UC_MIPS_REG_HI0 = UC_MIPS_REG_AC0
|
UC_MIPS_REG_HI0 = 45
|
||||||
UC_MIPS_REG_HI1 = UC_MIPS_REG_AC1
|
UC_MIPS_REG_HI1 = 46
|
||||||
UC_MIPS_REG_HI2 = UC_MIPS_REG_AC2
|
UC_MIPS_REG_HI2 = 47
|
||||||
UC_MIPS_REG_HI3 = UC_MIPS_REG_AC3
|
UC_MIPS_REG_HI3 = 48
|
||||||
UC_MIPS_REG_LO0 = UC_MIPS_REG_HI0
|
UC_MIPS_REG_LO0 = 45
|
||||||
UC_MIPS_REG_LO1 = UC_MIPS_REG_HI1
|
UC_MIPS_REG_LO1 = 46
|
||||||
UC_MIPS_REG_LO2 = UC_MIPS_REG_HI2
|
UC_MIPS_REG_LO2 = 47
|
||||||
UC_MIPS_REG_LO3 = UC_MIPS_REG_HI3
|
UC_MIPS_REG_LO3 = 48
|
||||||
)
|
)
|
@ -1,98 +1,99 @@
|
|||||||
package unicorn
|
package unicorn
|
||||||
// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [sparc_const.go]
|
// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [sparc_const.go]
|
||||||
const (
|
const (
|
||||||
|
|
||||||
// SPARC registers
|
// SPARC registers
|
||||||
|
|
||||||
UC_SPARC_REG_INVALID = 0
|
UC_SPARC_REG_INVALID = 0
|
||||||
UC_SPARC_REG_F0 = 1
|
UC_SPARC_REG_F0 = 1
|
||||||
UC_SPARC_REG_F1 = 2
|
UC_SPARC_REG_F1 = 2
|
||||||
UC_SPARC_REG_F2 = 3
|
UC_SPARC_REG_F2 = 3
|
||||||
UC_SPARC_REG_F3 = 4
|
UC_SPARC_REG_F3 = 4
|
||||||
UC_SPARC_REG_F4 = 5
|
UC_SPARC_REG_F4 = 5
|
||||||
UC_SPARC_REG_F5 = 6
|
UC_SPARC_REG_F5 = 6
|
||||||
UC_SPARC_REG_F6 = 7
|
UC_SPARC_REG_F6 = 7
|
||||||
UC_SPARC_REG_F7 = 8
|
UC_SPARC_REG_F7 = 8
|
||||||
UC_SPARC_REG_F8 = 9
|
UC_SPARC_REG_F8 = 9
|
||||||
UC_SPARC_REG_F9 = 10
|
UC_SPARC_REG_F9 = 10
|
||||||
UC_SPARC_REG_F10 = 11
|
UC_SPARC_REG_F10 = 11
|
||||||
UC_SPARC_REG_F11 = 12
|
UC_SPARC_REG_F11 = 12
|
||||||
UC_SPARC_REG_F12 = 13
|
UC_SPARC_REG_F12 = 13
|
||||||
UC_SPARC_REG_F13 = 14
|
UC_SPARC_REG_F13 = 14
|
||||||
UC_SPARC_REG_F14 = 15
|
UC_SPARC_REG_F14 = 15
|
||||||
UC_SPARC_REG_F15 = 16
|
UC_SPARC_REG_F15 = 16
|
||||||
UC_SPARC_REG_F16 = 17
|
UC_SPARC_REG_F16 = 17
|
||||||
UC_SPARC_REG_F17 = 18
|
UC_SPARC_REG_F17 = 18
|
||||||
UC_SPARC_REG_F18 = 19
|
UC_SPARC_REG_F18 = 19
|
||||||
UC_SPARC_REG_F19 = 20
|
UC_SPARC_REG_F19 = 20
|
||||||
UC_SPARC_REG_F20 = 21
|
UC_SPARC_REG_F20 = 21
|
||||||
UC_SPARC_REG_F21 = 22
|
UC_SPARC_REG_F21 = 22
|
||||||
UC_SPARC_REG_F22 = 23
|
UC_SPARC_REG_F22 = 23
|
||||||
UC_SPARC_REG_F23 = 24
|
UC_SPARC_REG_F23 = 24
|
||||||
UC_SPARC_REG_F24 = 25
|
UC_SPARC_REG_F24 = 25
|
||||||
UC_SPARC_REG_F25 = 26
|
UC_SPARC_REG_F25 = 26
|
||||||
UC_SPARC_REG_F26 = 27
|
UC_SPARC_REG_F26 = 27
|
||||||
UC_SPARC_REG_F27 = 28
|
UC_SPARC_REG_F27 = 28
|
||||||
UC_SPARC_REG_F28 = 29
|
UC_SPARC_REG_F28 = 29
|
||||||
UC_SPARC_REG_F29 = 30
|
UC_SPARC_REG_F29 = 30
|
||||||
UC_SPARC_REG_F30 = 31
|
UC_SPARC_REG_F30 = 31
|
||||||
UC_SPARC_REG_F31 = 32
|
UC_SPARC_REG_F31 = 32
|
||||||
UC_SPARC_REG_F32 = 33
|
UC_SPARC_REG_F32 = 33
|
||||||
UC_SPARC_REG_F34 = 34
|
UC_SPARC_REG_F34 = 34
|
||||||
UC_SPARC_REG_F36 = 35
|
UC_SPARC_REG_F36 = 35
|
||||||
UC_SPARC_REG_F38 = 36
|
UC_SPARC_REG_F38 = 36
|
||||||
UC_SPARC_REG_F40 = 37
|
UC_SPARC_REG_F40 = 37
|
||||||
UC_SPARC_REG_F42 = 38
|
UC_SPARC_REG_F42 = 38
|
||||||
UC_SPARC_REG_F44 = 39
|
UC_SPARC_REG_F44 = 39
|
||||||
UC_SPARC_REG_F46 = 40
|
UC_SPARC_REG_F46 = 40
|
||||||
UC_SPARC_REG_F48 = 41
|
UC_SPARC_REG_F48 = 41
|
||||||
UC_SPARC_REG_F50 = 42
|
UC_SPARC_REG_F50 = 42
|
||||||
UC_SPARC_REG_F52 = 43
|
UC_SPARC_REG_F52 = 43
|
||||||
UC_SPARC_REG_F54 = 44
|
UC_SPARC_REG_F54 = 44
|
||||||
UC_SPARC_REG_F56 = 45
|
UC_SPARC_REG_F56 = 45
|
||||||
UC_SPARC_REG_F58 = 46
|
UC_SPARC_REG_F58 = 46
|
||||||
UC_SPARC_REG_F60 = 47
|
UC_SPARC_REG_F60 = 47
|
||||||
UC_SPARC_REG_F62 = 48
|
UC_SPARC_REG_F62 = 48
|
||||||
UC_SPARC_REG_FCC0 = 49
|
UC_SPARC_REG_FCC0 = 49
|
||||||
UC_SPARC_REG_FCC1 = 50
|
UC_SPARC_REG_FCC1 = 50
|
||||||
UC_SPARC_REG_FCC2 = 51
|
UC_SPARC_REG_FCC2 = 51
|
||||||
UC_SPARC_REG_FCC3 = 52
|
UC_SPARC_REG_FCC3 = 52
|
||||||
UC_SPARC_REG_FP = 53
|
UC_SPARC_REG_FP = 53
|
||||||
UC_SPARC_REG_G0 = 54
|
UC_SPARC_REG_G0 = 54
|
||||||
UC_SPARC_REG_G1 = 55
|
UC_SPARC_REG_G1 = 55
|
||||||
UC_SPARC_REG_G2 = 56
|
UC_SPARC_REG_G2 = 56
|
||||||
UC_SPARC_REG_G3 = 57
|
UC_SPARC_REG_G3 = 57
|
||||||
UC_SPARC_REG_G4 = 58
|
UC_SPARC_REG_G4 = 58
|
||||||
UC_SPARC_REG_G5 = 59
|
UC_SPARC_REG_G5 = 59
|
||||||
UC_SPARC_REG_G6 = 60
|
UC_SPARC_REG_G6 = 60
|
||||||
UC_SPARC_REG_G7 = 61
|
UC_SPARC_REG_G7 = 61
|
||||||
UC_SPARC_REG_I0 = 62
|
UC_SPARC_REG_I0 = 62
|
||||||
UC_SPARC_REG_I1 = 63
|
UC_SPARC_REG_I1 = 63
|
||||||
UC_SPARC_REG_I2 = 64
|
UC_SPARC_REG_I2 = 64
|
||||||
UC_SPARC_REG_I3 = 65
|
UC_SPARC_REG_I3 = 65
|
||||||
UC_SPARC_REG_I4 = 66
|
UC_SPARC_REG_I4 = 66
|
||||||
UC_SPARC_REG_I5 = 67
|
UC_SPARC_REG_I5 = 67
|
||||||
UC_SPARC_REG_I7 = 68
|
UC_SPARC_REG_I7 = 68
|
||||||
UC_SPARC_REG_ICC = 69
|
UC_SPARC_REG_ICC = 69
|
||||||
UC_SPARC_REG_L0 = 70
|
UC_SPARC_REG_L0 = 70
|
||||||
UC_SPARC_REG_L1 = 71
|
UC_SPARC_REG_L1 = 71
|
||||||
UC_SPARC_REG_L2 = 72
|
UC_SPARC_REG_L2 = 72
|
||||||
UC_SPARC_REG_L3 = 73
|
UC_SPARC_REG_L3 = 73
|
||||||
UC_SPARC_REG_L4 = 74
|
UC_SPARC_REG_L4 = 74
|
||||||
UC_SPARC_REG_L5 = 75
|
UC_SPARC_REG_L5 = 75
|
||||||
UC_SPARC_REG_L6 = 76
|
UC_SPARC_REG_L6 = 76
|
||||||
UC_SPARC_REG_L7 = 77
|
UC_SPARC_REG_L7 = 77
|
||||||
UC_SPARC_REG_O0 = 78
|
UC_SPARC_REG_O0 = 78
|
||||||
UC_SPARC_REG_O1 = 79
|
UC_SPARC_REG_O1 = 79
|
||||||
UC_SPARC_REG_O2 = 80
|
UC_SPARC_REG_O2 = 80
|
||||||
UC_SPARC_REG_O3 = 81
|
UC_SPARC_REG_O3 = 81
|
||||||
UC_SPARC_REG_O4 = 82
|
UC_SPARC_REG_O4 = 82
|
||||||
UC_SPARC_REG_O5 = 83
|
UC_SPARC_REG_O5 = 83
|
||||||
UC_SPARC_REG_O7 = 84
|
UC_SPARC_REG_O7 = 84
|
||||||
UC_SPARC_REG_SP = 85
|
UC_SPARC_REG_SP = 85
|
||||||
UC_SPARC_REG_Y = 86
|
UC_SPARC_REG_Y = 86
|
||||||
UC_SPARC_REG_XCC = 87
|
UC_SPARC_REG_XCC = 87
|
||||||
UC_SPARC_REG_PC = 88
|
UC_SPARC_REG_PC = 88
|
||||||
UC_SPARC_REG_ENDING = 89
|
UC_SPARC_REG_ENDING = 89
|
||||||
UC_SPARC_REG_O6 = UC_SPARC_REG_SP
|
UC_SPARC_REG_O6 = 85
|
||||||
UC_SPARC_REG_I6 = UC_SPARC_REG_FP
|
UC_SPARC_REG_I6 = 53
|
||||||
)
|
)
|
@ -17,7 +17,7 @@ func (u UcError) Error() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func errReturn(err C.uc_err) error {
|
func errReturn(err C.uc_err) error {
|
||||||
if err != C.UC_ERR_OK {
|
if err != UC_ERR_OK {
|
||||||
return UcError(err)
|
return UcError(err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -36,10 +36,10 @@ func NewUc(arch, mode int) (*Uc, error) {
|
|||||||
var major, minor C.uint
|
var major, minor C.uint
|
||||||
C.uc_version(&major, &minor)
|
C.uc_version(&major, &minor)
|
||||||
if major != C.UC_API_MAJOR || minor != C.UC_API_MINOR {
|
if major != C.UC_API_MAJOR || minor != C.UC_API_MINOR {
|
||||||
return nil, UcError(C.UC_ERR_VERSION)
|
return nil, UcError(UC_ERR_VERSION)
|
||||||
}
|
}
|
||||||
var handle C.uch
|
var handle C.uch
|
||||||
if ucerr := C.uc_open(C.uc_arch(arch), C.uc_mode(mode), &handle); ucerr != C.UC_ERR_OK {
|
if ucerr := C.uc_open(C.uc_arch(arch), C.uc_mode(mode), &handle); ucerr != UC_ERR_OK {
|
||||||
return nil, UcError(ucerr)
|
return nil, UcError(ucerr)
|
||||||
}
|
}
|
||||||
uc := &Uc{handle, arch, mode}
|
uc := &Uc{handle, arch, mode}
|
||||||
|
66
bindings/go/unicorn/unicorn_const.go
Normal file
66
bindings/go/unicorn/unicorn_const.go
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
package unicorn
|
||||||
|
// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [unicorn_const.go]
|
||||||
|
const (
|
||||||
|
|
||||||
|
UC_API_MAJOR = 0
|
||||||
|
UC_API_MINOR = 9
|
||||||
|
UC_SECOND_SCALE = 1000000
|
||||||
|
UC_MILISECOND_SCALE = 1000
|
||||||
|
UC_ARCH_ARM = 1
|
||||||
|
UC_ARCH_ARM64 = 2
|
||||||
|
UC_ARCH_MIPS = 3
|
||||||
|
UC_ARCH_X86 = 4
|
||||||
|
UC_ARCH_PPC = 5
|
||||||
|
UC_ARCH_SPARC = 6
|
||||||
|
UC_ARCH_M68K = 7
|
||||||
|
UC_ARCH_MAX = 8
|
||||||
|
|
||||||
|
UC_MODE_LITTLE_ENDIAN = 0
|
||||||
|
|
||||||
|
UC_MODE_ARM = 0
|
||||||
|
UC_MODE_16 = 2
|
||||||
|
UC_MODE_32 = 4
|
||||||
|
UC_MODE_64 = 8
|
||||||
|
UC_MODE_THUMB = 16
|
||||||
|
UC_MODE_MCLASS = 32
|
||||||
|
UC_MODE_V8 = 64
|
||||||
|
UC_MODE_MICRO = 16
|
||||||
|
UC_MODE_MIPS3 = 32
|
||||||
|
UC_MODE_MIPS32R6 = 64
|
||||||
|
UC_MODE_V9 = 16
|
||||||
|
UC_MODE_QPX = 16
|
||||||
|
UC_MODE_BIG_ENDIAN = 2147483648
|
||||||
|
UC_MODE_MIPS32 = 4
|
||||||
|
UC_MODE_MIPS64 = 8
|
||||||
|
|
||||||
|
UC_ERR_OK = 0
|
||||||
|
UC_ERR_OOM = 1
|
||||||
|
UC_ERR_ARCH = 2
|
||||||
|
UC_ERR_HANDLE = 3
|
||||||
|
UC_ERR_UCH = 4
|
||||||
|
UC_ERR_MODE = 5
|
||||||
|
UC_ERR_VERSION = 6
|
||||||
|
UC_ERR_MEM_READ = 7
|
||||||
|
UC_ERR_MEM_WRITE = 8
|
||||||
|
UC_ERR_CODE_INVALID = 9
|
||||||
|
UC_ERR_HOOK = 10
|
||||||
|
UC_ERR_INSN_INVALID = 11
|
||||||
|
UC_ERR_MAP = 12
|
||||||
|
UC_ERR_MEM_WRITE_NW = 13
|
||||||
|
UC_ERR_MEM_READ_NR = 14
|
||||||
|
UC_MEM_READ = 16
|
||||||
|
UC_MEM_WRITE = 17
|
||||||
|
UC_MEM_READ_WRITE = 18
|
||||||
|
UC_MEM_WRITE_NW = 19
|
||||||
|
UC_MEM_READ_NR = 20
|
||||||
|
UC_HOOK_INTR = 32
|
||||||
|
UC_HOOK_INSN = 33
|
||||||
|
UC_HOOK_CODE = 34
|
||||||
|
UC_HOOK_BLOCK = 35
|
||||||
|
UC_HOOK_MEM_INVALID = 36
|
||||||
|
UC_HOOK_MEM_READ = 37
|
||||||
|
UC_HOOK_MEM_WRITE = 38
|
||||||
|
UC_HOOK_MEM_READ_WRITE = 39
|
||||||
|
UC_PROT_READ = 1
|
||||||
|
UC_PROT_WRITE = 2
|
||||||
|
)
|
File diff suppressed because it is too large
Load Diff
15
bindings/python/sample_all.sh
Executable file
15
bindings/python/sample_all.sh
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
./sample_x86.py
|
||||||
|
echo "=========================="
|
||||||
|
./shellcode.py
|
||||||
|
echo "=========================="
|
||||||
|
./sample_arm.py
|
||||||
|
echo "=========================="
|
||||||
|
./sample_arm64.py
|
||||||
|
echo "=========================="
|
||||||
|
./sample_mips.py
|
||||||
|
echo "=========================="
|
||||||
|
./sample_sparc.py
|
||||||
|
echo "=========================="
|
||||||
|
./sample_m68k.py
|
@ -1,464 +1,4 @@
|
|||||||
# Unicorn Python bindings, by Nguyen Anh Quynnh <aquynh@gmail.com>
|
# Unicorn Python bindings, by Nguyen Anh Quynnh <aquynh@gmail.com>
|
||||||
import sys
|
|
||||||
_python2 = sys.version_info[0] < 3
|
|
||||||
if _python2:
|
|
||||||
range = xrange
|
|
||||||
from . import arm_const, arm64_const, mips_const, sparc_const, m68k_const, x86_const
|
from . import arm_const, arm64_const, mips_const, sparc_const, m68k_const, x86_const
|
||||||
|
from unicorn_const import *
|
||||||
__all__ = [
|
from unicorn import Uc, uc_version, uc_arch_supported, version_bind, debug, UcError
|
||||||
'Uc',
|
|
||||||
|
|
||||||
'uc_version',
|
|
||||||
'uc_arch_supported',
|
|
||||||
'version_bind',
|
|
||||||
'debug',
|
|
||||||
|
|
||||||
'UC_API_MAJOR',
|
|
||||||
'UC_API_MINOR',
|
|
||||||
|
|
||||||
'UC_ARCH_ARM',
|
|
||||||
'UC_ARCH_ARM64',
|
|
||||||
'UC_ARCH_MIPS',
|
|
||||||
'UC_ARCH_X86',
|
|
||||||
'UC_ARCH_SPARC',
|
|
||||||
'UC_ARCH_M68K',
|
|
||||||
'UC_ARCH_ALL',
|
|
||||||
|
|
||||||
'UC_MODE_LITTLE_ENDIAN',
|
|
||||||
'UC_MODE_BIG_ENDIAN',
|
|
||||||
'UC_MODE_16',
|
|
||||||
'UC_MODE_32',
|
|
||||||
'UC_MODE_64',
|
|
||||||
'UC_MODE_ARM',
|
|
||||||
'UC_MODE_THUMB',
|
|
||||||
'UC_MODE_MCLASS',
|
|
||||||
'UC_MODE_MICRO',
|
|
||||||
'UC_MODE_MIPS3',
|
|
||||||
'UC_MODE_MIPS32R6',
|
|
||||||
'UC_MODE_MIPSGP64',
|
|
||||||
'UC_MODE_V8',
|
|
||||||
'UC_MODE_V9',
|
|
||||||
'UC_MODE_MIPS32',
|
|
||||||
'UC_MODE_MIPS64',
|
|
||||||
|
|
||||||
'UC_ERR_OK',
|
|
||||||
'UC_ERR_OOM',
|
|
||||||
'UC_ERR_ARCH',
|
|
||||||
'UC_ERR_HANDLE',
|
|
||||||
'UC_ERR_UCH',
|
|
||||||
'UC_ERR_MODE',
|
|
||||||
'UC_ERR_VERSION',
|
|
||||||
'UC_ERR_MEM_READ',
|
|
||||||
'UC_ERR_MEM_WRITE',
|
|
||||||
'UC_ERR_CODE_INVALID',
|
|
||||||
'UC_ERR_HOOK',
|
|
||||||
'UC_ERR_INSN_INVALID',
|
|
||||||
'UC_ERR_MAP',
|
|
||||||
|
|
||||||
'UC_HOOK_INTR',
|
|
||||||
'UC_HOOK_INSN',
|
|
||||||
'UC_HOOK_CODE',
|
|
||||||
'UC_HOOK_BLOCK',
|
|
||||||
'UC_HOOK_MEM_INVALID',
|
|
||||||
'UC_HOOK_MEM_READ',
|
|
||||||
'UC_HOOK_MEM_WRITE',
|
|
||||||
'UC_HOOK_MEM_READ_WRITE',
|
|
||||||
|
|
||||||
'UC_MEM_READ',
|
|
||||||
'UC_MEM_WRITE',
|
|
||||||
'UC_MEM_READ_WRITE',
|
|
||||||
|
|
||||||
'UC_SECOND_SCALE',
|
|
||||||
'UC_MILISECOND_SCALE',
|
|
||||||
|
|
||||||
'UcError',
|
|
||||||
]
|
|
||||||
|
|
||||||
# Unicorn C interface
|
|
||||||
|
|
||||||
# API version
|
|
||||||
UC_API_MAJOR = 0
|
|
||||||
UC_API_MINOR = 9
|
|
||||||
|
|
||||||
# Architectures
|
|
||||||
UC_ARCH_ARM = 1
|
|
||||||
UC_ARCH_ARM64 = 2
|
|
||||||
UC_ARCH_MIPS = 3
|
|
||||||
UC_ARCH_X86 = 4
|
|
||||||
UC_ARCH_PPC = 5
|
|
||||||
UC_ARCH_SPARC = 6
|
|
||||||
UC_ARCH_M68K = 7
|
|
||||||
UC_ARCH_MAX = 8
|
|
||||||
UC_ARCH_ALL = 0xFFFF
|
|
||||||
|
|
||||||
# Hardware modes
|
|
||||||
UC_MODE_LITTLE_ENDIAN = 0 # little-endian mode (default mode)
|
|
||||||
UC_MODE_ARM = 0 # ARM mode
|
|
||||||
UC_MODE_16 = (1 << 1) # 16-bit mode (for X86)
|
|
||||||
UC_MODE_32 = (1 << 2) # 32-bit mode (for X86)
|
|
||||||
UC_MODE_64 = (1 << 3) # 64-bit mode (for X86, PPC)
|
|
||||||
UC_MODE_THUMB = (1 << 4) # ARM's Thumb mode, including Thumb-2
|
|
||||||
UC_MODE_MCLASS = (1 << 5) # ARM's Cortex-M series
|
|
||||||
UC_MODE_V8 = (1 << 6) # ARMv8 A32 encodings for ARM
|
|
||||||
UC_MODE_MICRO = (1 << 4) # MicroMips mode (MIPS architecture)
|
|
||||||
UC_MODE_MIPS3 = (1 << 5) # Mips III ISA
|
|
||||||
UC_MODE_MIPS32R6 = (1 << 6) # Mips32r6 ISA
|
|
||||||
UC_MODE_MIPSGP64 = (1 << 7) # General Purpose Registers are 64-bit wide (MIPS arch)
|
|
||||||
UC_MODE_V9 = (1 << 4) # Sparc V9 mode (for Sparc)
|
|
||||||
UC_MODE_BIG_ENDIAN = (1 << 31) # big-endian mode
|
|
||||||
UC_MODE_MIPS32 = UC_MODE_32 # Mips32 ISA
|
|
||||||
UC_MODE_MIPS64 = UC_MODE_64 # Mips64 ISA
|
|
||||||
|
|
||||||
|
|
||||||
# Unicorn error type
|
|
||||||
UC_ERR_OK = 0 # No error: everything was fine
|
|
||||||
UC_ERR_OOM = 1 # Out-Of-Memory error: uc_open(), uc_emulate()
|
|
||||||
UC_ERR_ARCH = 2 # Unsupported architecture: uc_open()
|
|
||||||
UC_ERR_HANDLE = 3 # Invalid handle
|
|
||||||
UC_ERR_UCH = 4 # Invalid handle (uch)
|
|
||||||
UC_ERR_MODE = 5 # Invalid/unsupported mode: uc_open()
|
|
||||||
UC_ERR_VERSION = 6 # Unsupported version (bindings)
|
|
||||||
UC_ERR_MEM_READ = 7 # Quit emulation due to invalid memory READ: uc_emu_start()
|
|
||||||
UC_ERR_MEM_WRITE = 8 # Quit emulation due to invalid memory WRITE: uc_emu_start()
|
|
||||||
UC_ERR_CODE_INVALID = 9 # Quit emulation due to invalid code address: uc_emu_start()
|
|
||||||
UC_ERR_HOOK = 10 # Invalid hook type: uc_hook_add()
|
|
||||||
UC_ERR_INSN_INVALID = 11 # Invalid instruction
|
|
||||||
UC_ERR_MAP = 12 # Invalid memory mapping
|
|
||||||
|
|
||||||
|
|
||||||
# All type of hooks for uc_hook_add() API.
|
|
||||||
UC_HOOK_INTR = 32 # Hook all interrupt events
|
|
||||||
UC_HOOK_INSN = 33 # Hook a particular instruction
|
|
||||||
UC_HOOK_CODE = 34 # Hook a range of code
|
|
||||||
UC_HOOK_BLOCK = 35 # Hook basic blocks
|
|
||||||
UC_HOOK_MEM_INVALID = 36 # Hook for all invalid memory access events
|
|
||||||
UC_HOOK_MEM_READ = 37 # Hook all memory read events.
|
|
||||||
UC_HOOK_MEM_WRITE = 38 # Hook all memory write events.
|
|
||||||
UC_HOOK_MEM_READ_WRITE = 39 # Hook all memory accesses (either READ or WRITE).
|
|
||||||
|
|
||||||
|
|
||||||
# All type of memory accesses for UC_HOOK_MEM_*
|
|
||||||
UC_MEM_READ = 16 # Memory is read from
|
|
||||||
UC_MEM_WRITE = 17 # Memory is written to
|
|
||||||
UC_MEM_READ_WRITE = 18 # Memory is accessed (either READ or WRITE)
|
|
||||||
|
|
||||||
|
|
||||||
# Time scales to calculate timeout on microsecond unit
|
|
||||||
# This is for Uc.emu_start()
|
|
||||||
UC_SECOND_SCALE = 1000000 # 1 second = 1000,000 microseconds
|
|
||||||
UC_MILISECOND_SCALE = 1000 # 1 milisecond = 1000 nanoseconds
|
|
||||||
|
|
||||||
|
|
||||||
import ctypes, ctypes.util, sys
|
|
||||||
from os.path import split, join, dirname
|
|
||||||
import distutils.sysconfig
|
|
||||||
|
|
||||||
|
|
||||||
import inspect
|
|
||||||
if not hasattr(sys.modules[__name__], '__file__'):
|
|
||||||
__file__ = inspect.getfile(inspect.currentframe())
|
|
||||||
|
|
||||||
_lib_path = split(__file__)[0]
|
|
||||||
_all_libs = ['unicorn.dll', 'libunicorn.so', 'libunicorn.dylib']
|
|
||||||
_found = False
|
|
||||||
|
|
||||||
for _lib in _all_libs:
|
|
||||||
try:
|
|
||||||
_lib_file = join(_lib_path, _lib)
|
|
||||||
# print "Trying to load:", _lib_file
|
|
||||||
_uc = ctypes.cdll.LoadLibrary(_lib_file)
|
|
||||||
_found = True
|
|
||||||
break
|
|
||||||
except OSError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if _found == False:
|
|
||||||
# try loading from default paths
|
|
||||||
for _lib in _all_libs:
|
|
||||||
try:
|
|
||||||
_uc = ctypes.cdll.LoadLibrary(_lib)
|
|
||||||
_found = True
|
|
||||||
break
|
|
||||||
except OSError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if _found == False:
|
|
||||||
# last try: loading from python lib directory
|
|
||||||
_lib_path = distutils.sysconfig.get_python_lib()
|
|
||||||
for _lib in _all_libs:
|
|
||||||
try:
|
|
||||||
_lib_file = join(_lib_path, 'unicorn', _lib)
|
|
||||||
# print "Trying to load:", _lib_file
|
|
||||||
_uc = ctypes.cdll.LoadLibrary(_lib_file)
|
|
||||||
_found = True
|
|
||||||
break
|
|
||||||
except OSError:
|
|
||||||
pass
|
|
||||||
if _found == False:
|
|
||||||
raise ImportError("ERROR: fail to load the dynamic library.")
|
|
||||||
|
|
||||||
|
|
||||||
# setup all the function prototype
|
|
||||||
def _setup_prototype(lib, fname, restype, *argtypes):
|
|
||||||
getattr(lib, fname).restype = restype
|
|
||||||
getattr(lib, fname).argtypes = argtypes
|
|
||||||
|
|
||||||
_setup_prototype(_uc, "uc_version", ctypes.c_int, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
|
|
||||||
_setup_prototype(_uc, "uc_arch_supported", ctypes.c_bool, ctypes.c_int)
|
|
||||||
_setup_prototype(_uc, "uc_open", ctypes.c_int, ctypes.c_uint, ctypes.c_uint, ctypes.POINTER(ctypes.c_size_t))
|
|
||||||
_setup_prototype(_uc, "uc_close", ctypes.c_int, ctypes.POINTER(ctypes.c_size_t))
|
|
||||||
_setup_prototype(_uc, "uc_strerror", ctypes.c_char_p, ctypes.c_int)
|
|
||||||
_setup_prototype(_uc, "uc_errno", ctypes.c_int, ctypes.c_size_t)
|
|
||||||
_setup_prototype(_uc, "uc_reg_read", ctypes.c_int, ctypes.c_size_t, ctypes.c_int, ctypes.c_void_p)
|
|
||||||
_setup_prototype(_uc, "uc_reg_write", ctypes.c_int, ctypes.c_size_t, ctypes.c_int, ctypes.c_void_p)
|
|
||||||
_setup_prototype(_uc, "uc_mem_read", ctypes.c_int, ctypes.c_size_t, ctypes.c_uint64, ctypes.POINTER(ctypes.c_char), ctypes.c_size_t)
|
|
||||||
_setup_prototype(_uc, "uc_mem_write", ctypes.c_int, ctypes.c_size_t, ctypes.c_uint64, ctypes.POINTER(ctypes.c_char), ctypes.c_size_t)
|
|
||||||
_setup_prototype(_uc, "uc_emu_start", ctypes.c_int, ctypes.c_size_t, ctypes.c_uint64, ctypes.c_uint64, ctypes.c_uint64, ctypes.c_size_t)
|
|
||||||
_setup_prototype(_uc, "uc_emu_stop", ctypes.c_int, ctypes.c_size_t)
|
|
||||||
_setup_prototype(_uc, "uc_hook_del", ctypes.c_int, ctypes.c_size_t, ctypes.POINTER(ctypes.c_size_t))
|
|
||||||
_setup_prototype(_uc, "uc_mem_map", ctypes.c_int, ctypes.c_size_t, ctypes.c_uint64, ctypes.c_size_t)
|
|
||||||
|
|
||||||
# uc_hook_add is special due to variable number of arguments
|
|
||||||
_uc.uc_hook_add = getattr(_uc, "uc_hook_add")
|
|
||||||
_uc.uc_hook_add.restype = ctypes.c_int
|
|
||||||
|
|
||||||
UC_HOOK_CODE_CB = ctypes.CFUNCTYPE(None, ctypes.c_size_t, ctypes.c_uint64, ctypes.c_size_t, ctypes.c_void_p)
|
|
||||||
UC_HOOK_MEM_INVALID_CB = ctypes.CFUNCTYPE(ctypes.c_bool, ctypes.c_size_t, ctypes.c_int, \
|
|
||||||
ctypes.c_uint64, ctypes.c_int, ctypes.c_int64, ctypes.c_void_p)
|
|
||||||
UC_HOOK_MEM_ACCESS_CB = ctypes.CFUNCTYPE(None, ctypes.c_size_t, ctypes.c_int, \
|
|
||||||
ctypes.c_uint64, ctypes.c_int, ctypes.c_int64, ctypes.c_void_p)
|
|
||||||
UC_HOOK_INTR_CB = ctypes.CFUNCTYPE(None, ctypes.c_size_t, ctypes.c_uint32, \
|
|
||||||
ctypes.c_void_p)
|
|
||||||
UC_HOOK_INSN_IN_CB = ctypes.CFUNCTYPE(ctypes.c_uint32, ctypes.c_size_t, ctypes.c_uint32, \
|
|
||||||
ctypes.c_int, ctypes.c_void_p)
|
|
||||||
UC_HOOK_INSN_OUT_CB = ctypes.CFUNCTYPE(None, ctypes.c_size_t, ctypes.c_uint32, \
|
|
||||||
ctypes.c_int, ctypes.c_uint32, ctypes.c_void_p)
|
|
||||||
UC_HOOK_INSN_SYSCALL_CB = ctypes.CFUNCTYPE(None, ctypes.c_size_t, ctypes.c_void_p)
|
|
||||||
|
|
||||||
|
|
||||||
# access to error code via @errno of UcError
|
|
||||||
class UcError(Exception):
|
|
||||||
def __init__(self, errno):
|
|
||||||
self.errno = errno
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return _uc.uc_strerror(self.errno)
|
|
||||||
|
|
||||||
|
|
||||||
# return the core's version
|
|
||||||
def uc_version():
|
|
||||||
major = ctypes.c_int()
|
|
||||||
minor = ctypes.c_int()
|
|
||||||
combined = _uc.uc_version(ctypes.byref(major), ctypes.byref(minor))
|
|
||||||
return (major.value, minor.value, combined)
|
|
||||||
|
|
||||||
|
|
||||||
# return the binding's version
|
|
||||||
def version_bind():
|
|
||||||
return (UC_API_MAJOR, UC_API_MINOR, (UC_API_MAJOR << 8) + UC_API_MINOR)
|
|
||||||
|
|
||||||
|
|
||||||
# check to see if this engine supports a particular arch
|
|
||||||
def uc_arch_supported(query):
|
|
||||||
return _uc.uc_arch_supported(query)
|
|
||||||
|
|
||||||
|
|
||||||
class Uc(object):
|
|
||||||
def __init__(self, arch, mode):
|
|
||||||
# verify version compatibility with the core before doing anything
|
|
||||||
(major, minor, _combined) = uc_version()
|
|
||||||
if major != UC_API_MAJOR or minor != UC_API_MINOR:
|
|
||||||
self._uch = None
|
|
||||||
# our binding version is different from the core's API version
|
|
||||||
raise UcError(UC_ERR_VERSION)
|
|
||||||
|
|
||||||
self._arch, self._mode = arch, mode
|
|
||||||
self._uch = ctypes.c_size_t()
|
|
||||||
status = _uc.uc_open(arch, mode, ctypes.byref(self._uch))
|
|
||||||
if status != UC_ERR_OK:
|
|
||||||
self._uch = None
|
|
||||||
raise UcError(status)
|
|
||||||
# internal mapping table to save callback & userdata
|
|
||||||
self._callbacks = {}
|
|
||||||
self._callback_count = 0
|
|
||||||
|
|
||||||
|
|
||||||
# destructor to be called automatically when object is destroyed.
|
|
||||||
def __del__(self):
|
|
||||||
if self._uch:
|
|
||||||
try:
|
|
||||||
status = _uc.uc_close(ctypes.byref(self._uch))
|
|
||||||
if status != UC_ERR_OK:
|
|
||||||
raise UcError(status)
|
|
||||||
except: # _uc might be pulled from under our feet
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# emulate from @begin, and stop when reaching address @until
|
|
||||||
def emu_start(self, begin, until, timeout=0, count=0):
|
|
||||||
status = _uc.uc_emu_start(self._uch, begin, until, timeout, count)
|
|
||||||
if status != UC_ERR_OK:
|
|
||||||
raise UcError(status)
|
|
||||||
|
|
||||||
|
|
||||||
# stop emulation
|
|
||||||
def emu_stop(self):
|
|
||||||
status = _uc.uc_emu_stop(self._uch)
|
|
||||||
if status != UC_ERR_OK:
|
|
||||||
raise UcError(status)
|
|
||||||
|
|
||||||
|
|
||||||
# return the value of a register
|
|
||||||
def reg_read(self, reg_id):
|
|
||||||
# read to 64bit number to be safe
|
|
||||||
reg = ctypes.c_int64(0)
|
|
||||||
status = _uc.uc_reg_read(self._uch, reg_id, ctypes.byref(reg))
|
|
||||||
if status != UC_ERR_OK:
|
|
||||||
raise UcError(status)
|
|
||||||
return reg.value
|
|
||||||
|
|
||||||
|
|
||||||
# write to a register
|
|
||||||
def reg_write(self, reg_id, value):
|
|
||||||
# convert to 64bit number to be safe
|
|
||||||
reg = ctypes.c_int64(value)
|
|
||||||
status = _uc.uc_reg_write(self._uch, reg_id, ctypes.byref(reg))
|
|
||||||
if status != UC_ERR_OK:
|
|
||||||
raise UcError(status)
|
|
||||||
|
|
||||||
|
|
||||||
# read data from memory
|
|
||||||
def mem_read(self, address, size):
|
|
||||||
data = ctypes.create_string_buffer(size)
|
|
||||||
status = _uc.uc_mem_read(self._uch, address, data, size)
|
|
||||||
if status != UC_ERR_OK:
|
|
||||||
raise UcError(status)
|
|
||||||
return bytearray(data)
|
|
||||||
|
|
||||||
|
|
||||||
# write to memory
|
|
||||||
def mem_write(self, address, data):
|
|
||||||
status = _uc.uc_mem_write(self._uch, address, data, len(data))
|
|
||||||
if status != UC_ERR_OK:
|
|
||||||
raise UcError(status)
|
|
||||||
|
|
||||||
|
|
||||||
# map a range of memory
|
|
||||||
def mem_map(self, address, size):
|
|
||||||
status = _uc.uc_mem_map(self._uch, address, size)
|
|
||||||
if status != UC_ERR_OK:
|
|
||||||
raise UcError(status)
|
|
||||||
|
|
||||||
|
|
||||||
def _hookcode_cb(self, handle, address, size, user_data):
|
|
||||||
# call user's callback with self object
|
|
||||||
(cb, data) = self._callbacks[user_data]
|
|
||||||
cb(self, address, size, data)
|
|
||||||
|
|
||||||
|
|
||||||
def _hook_mem_invalid_cb(self, handle, access, address, size, value, user_data):
|
|
||||||
# call user's callback with self object
|
|
||||||
(cb, data) = self._callbacks[user_data]
|
|
||||||
return cb(self, access, address, size, value, data)
|
|
||||||
|
|
||||||
|
|
||||||
def _hook_mem_access_cb(self, handle, access, address, size, value, user_data):
|
|
||||||
# call user's callback with self object
|
|
||||||
(cb, data) = self._callbacks[user_data]
|
|
||||||
cb(self, access, address, size, value, data)
|
|
||||||
|
|
||||||
|
|
||||||
def _hook_intr_cb(self, handle, intno, user_data):
|
|
||||||
# call user's callback with self object
|
|
||||||
(cb, data) = self._callbacks[user_data]
|
|
||||||
cb(self, intno, data)
|
|
||||||
|
|
||||||
|
|
||||||
def _hook_insn_in_cb(self, handle, port, size, user_data):
|
|
||||||
# call user's callback with self object
|
|
||||||
(cb, data) = self._callbacks[user_data]
|
|
||||||
return cb(self, port, size, data)
|
|
||||||
|
|
||||||
|
|
||||||
def _hook_insn_out_cb(self, handle, port, size, value, user_data):
|
|
||||||
# call user's callback with self object
|
|
||||||
(cb, data) = self._callbacks[user_data]
|
|
||||||
cb(self, port, size, value, data)
|
|
||||||
|
|
||||||
|
|
||||||
def _hook_insn_syscall_cb(self, handle, user_data):
|
|
||||||
# call user's callback with self object
|
|
||||||
(cb, data) = self._callbacks[user_data]
|
|
||||||
cb(self, data)
|
|
||||||
|
|
||||||
|
|
||||||
# add a hook
|
|
||||||
def hook_add(self, htype, callback, user_data=None, arg1=1, arg2=0):
|
|
||||||
_h2 = ctypes.c_size_t()
|
|
||||||
|
|
||||||
# save callback & user_data
|
|
||||||
self._callback_count += 1
|
|
||||||
self._callbacks[self._callback_count] = (callback, user_data)
|
|
||||||
|
|
||||||
if htype in (UC_HOOK_BLOCK, UC_HOOK_CODE):
|
|
||||||
begin = ctypes.c_uint64(arg1)
|
|
||||||
end = ctypes.c_uint64(arg2)
|
|
||||||
# set callback with wrapper, so it can be called
|
|
||||||
# with this object as param
|
|
||||||
cb = ctypes.cast(UC_HOOK_CODE_CB(self._hookcode_cb), UC_HOOK_CODE_CB)
|
|
||||||
status = _uc.uc_hook_add(self._uch, ctypes.byref(_h2), htype, cb, \
|
|
||||||
ctypes.cast(self._callback_count, ctypes.c_void_p), begin, end)
|
|
||||||
elif htype == UC_HOOK_MEM_INVALID:
|
|
||||||
cb = ctypes.cast(UC_HOOK_MEM_INVALID_CB(self._hook_mem_invalid_cb), UC_HOOK_MEM_INVALID_CB)
|
|
||||||
status = _uc.uc_hook_add(self._uch, ctypes.byref(_h2), htype, \
|
|
||||||
cb, ctypes.cast(self._callback_count, ctypes.c_void_p))
|
|
||||||
elif htype in (UC_HOOK_MEM_READ, UC_HOOK_MEM_WRITE, UC_HOOK_MEM_READ_WRITE):
|
|
||||||
cb = ctypes.cast(UC_HOOK_MEM_ACCESS_CB(self._hook_mem_access_cb), UC_HOOK_MEM_ACCESS_CB)
|
|
||||||
status = _uc.uc_hook_add(self._uch, ctypes.byref(_h2), htype, \
|
|
||||||
cb, ctypes.cast(self._callback_count, ctypes.c_void_p))
|
|
||||||
elif htype == UC_HOOK_INSN:
|
|
||||||
insn = ctypes.c_int(arg1)
|
|
||||||
if arg1 == x86_const.UC_X86_INS_IN: # IN instruction
|
|
||||||
cb = ctypes.cast(UC_HOOK_INSN_IN_CB(self._hook_insn_in_cb), UC_HOOK_INSN_IN_CB)
|
|
||||||
if arg1 == x86_const.UC_X86_INS_OUT: # OUT instruction
|
|
||||||
cb = ctypes.cast(UC_HOOK_INSN_OUT_CB(self._hook_insn_out_cb), UC_HOOK_INSN_OUT_CB)
|
|
||||||
if arg1 in (x86_const.UC_X86_INS_SYSCALL, x86_const.UC_X86_INS_SYSENTER): # SYSCALL/SYSENTER instruction
|
|
||||||
cb = ctypes.cast(UC_HOOK_INSN_SYSCALL_CB(self._hook_insn_syscall_cb), UC_HOOK_INSN_SYSCALL_CB)
|
|
||||||
status = _uc.uc_hook_add(self._uch, ctypes.byref(_h2), htype, \
|
|
||||||
cb, ctypes.cast(self._callback_count, ctypes.c_void_p), insn)
|
|
||||||
elif htype == UC_HOOK_INTR:
|
|
||||||
cb = ctypes.cast(UC_HOOK_INTR_CB(self._hook_intr_cb), UC_HOOK_INTR_CB)
|
|
||||||
status = _uc.uc_hook_add(self._uch, ctypes.byref(_h2), htype, \
|
|
||||||
cb, ctypes.cast(self._callback_count, ctypes.c_void_p))
|
|
||||||
|
|
||||||
if status != UC_ERR_OK:
|
|
||||||
raise UcError(status)
|
|
||||||
|
|
||||||
return _h2.value
|
|
||||||
|
|
||||||
|
|
||||||
# delete a hook
|
|
||||||
def hook_del(self, h):
|
|
||||||
_h = ctypes.c_size_t(h)
|
|
||||||
status = _uc.uc_hook_del(self._uch, ctypes.byref(_h))
|
|
||||||
if status != UC_ERR_OK:
|
|
||||||
raise UcError(status)
|
|
||||||
h = 0
|
|
||||||
|
|
||||||
|
|
||||||
# print out debugging info
|
|
||||||
def debug():
|
|
||||||
archs = { "arm": UC_ARCH_ARM, "arm64": UC_ARCH_ARM64, \
|
|
||||||
"mips": UC_ARCH_MIPS, "sparc": UC_ARCH_SPARC, \
|
|
||||||
"m68k": UC_ARCH_M68K, "x86": UC_ARCH_X86 }
|
|
||||||
|
|
||||||
all_archs = ""
|
|
||||||
keys = archs.keys()
|
|
||||||
keys.sort()
|
|
||||||
for k in keys:
|
|
||||||
if uc_arch_supported(archs[k]):
|
|
||||||
all_archs += "-%s" % k
|
|
||||||
|
|
||||||
(major, minor, _combined) = uc_version()
|
|
||||||
|
|
||||||
return "python-%s-c%u.%u-b%u.%u" % (all_archs, major, minor, UC_API_MAJOR, UC_API_MINOR)
|
|
||||||
|
@ -268,7 +268,7 @@ UC_ARM64_REG_PC = 260
|
|||||||
UC_ARM64_REG_ENDING = 261
|
UC_ARM64_REG_ENDING = 261
|
||||||
|
|
||||||
# alias registers
|
# alias registers
|
||||||
UC_ARM64_REG_IP1 = UC_ARM64_REG_X16
|
UC_ARM64_REG_IP1 = 215
|
||||||
UC_ARM64_REG_IP0 = UC_ARM64_REG_X17
|
UC_ARM64_REG_IP0 = 216
|
||||||
UC_ARM64_REG_FP = UC_ARM64_REG_X29
|
UC_ARM64_REG_FP = 1
|
||||||
UC_ARM64_REG_LR = UC_ARM64_REG_X30
|
UC_ARM64_REG_LR = 2
|
||||||
|
@ -116,10 +116,10 @@ UC_ARM_REG_S31 = 110
|
|||||||
UC_ARM_REG_ENDING = 111
|
UC_ARM_REG_ENDING = 111
|
||||||
|
|
||||||
# alias registers
|
# alias registers
|
||||||
UC_ARM_REG_R13 = UC_ARM_REG_SP
|
UC_ARM_REG_R13 = 12
|
||||||
UC_ARM_REG_R14 = UC_ARM_REG_LR
|
UC_ARM_REG_R14 = 10
|
||||||
UC_ARM_REG_R15 = UC_ARM_REG_PC
|
UC_ARM_REG_R15 = 11
|
||||||
UC_ARM_REG_SB = UC_ARM_REG_R9
|
UC_ARM_REG_SB = 75
|
||||||
UC_ARM_REG_SL = UC_ARM_REG_R10
|
UC_ARM_REG_SL = 76
|
||||||
UC_ARM_REG_FP = UC_ARM_REG_R11
|
UC_ARM_REG_FP = 77
|
||||||
UC_ARM_REG_IP = UC_ARM_REG_R12
|
UC_ARM_REG_IP = 78
|
||||||
|
@ -152,44 +152,44 @@ UC_MIPS_REG_MPL0 = 134
|
|||||||
UC_MIPS_REG_MPL1 = 135
|
UC_MIPS_REG_MPL1 = 135
|
||||||
UC_MIPS_REG_MPL2 = 136
|
UC_MIPS_REG_MPL2 = 136
|
||||||
UC_MIPS_REG_ENDING = 137
|
UC_MIPS_REG_ENDING = 137
|
||||||
UC_MIPS_REG_ZERO = UC_MIPS_REG_0
|
UC_MIPS_REG_ZERO = 2
|
||||||
UC_MIPS_REG_AT = UC_MIPS_REG_1
|
UC_MIPS_REG_AT = 3
|
||||||
UC_MIPS_REG_V0 = UC_MIPS_REG_2
|
UC_MIPS_REG_V0 = 4
|
||||||
UC_MIPS_REG_V1 = UC_MIPS_REG_3
|
UC_MIPS_REG_V1 = 5
|
||||||
UC_MIPS_REG_A0 = UC_MIPS_REG_4
|
UC_MIPS_REG_A0 = 6
|
||||||
UC_MIPS_REG_A1 = UC_MIPS_REG_5
|
UC_MIPS_REG_A1 = 7
|
||||||
UC_MIPS_REG_A2 = UC_MIPS_REG_6
|
UC_MIPS_REG_A2 = 8
|
||||||
UC_MIPS_REG_A3 = UC_MIPS_REG_7
|
UC_MIPS_REG_A3 = 9
|
||||||
UC_MIPS_REG_T0 = UC_MIPS_REG_8
|
UC_MIPS_REG_T0 = 10
|
||||||
UC_MIPS_REG_T1 = UC_MIPS_REG_9
|
UC_MIPS_REG_T1 = 11
|
||||||
UC_MIPS_REG_T2 = UC_MIPS_REG_10
|
UC_MIPS_REG_T2 = 12
|
||||||
UC_MIPS_REG_T3 = UC_MIPS_REG_11
|
UC_MIPS_REG_T3 = 13
|
||||||
UC_MIPS_REG_T4 = UC_MIPS_REG_12
|
UC_MIPS_REG_T4 = 14
|
||||||
UC_MIPS_REG_T5 = UC_MIPS_REG_13
|
UC_MIPS_REG_T5 = 15
|
||||||
UC_MIPS_REG_T6 = UC_MIPS_REG_14
|
UC_MIPS_REG_T6 = 16
|
||||||
UC_MIPS_REG_T7 = UC_MIPS_REG_15
|
UC_MIPS_REG_T7 = 17
|
||||||
UC_MIPS_REG_S0 = UC_MIPS_REG_16
|
UC_MIPS_REG_S0 = 18
|
||||||
UC_MIPS_REG_S1 = UC_MIPS_REG_17
|
UC_MIPS_REG_S1 = 19
|
||||||
UC_MIPS_REG_S2 = UC_MIPS_REG_18
|
UC_MIPS_REG_S2 = 20
|
||||||
UC_MIPS_REG_S3 = UC_MIPS_REG_19
|
UC_MIPS_REG_S3 = 21
|
||||||
UC_MIPS_REG_S4 = UC_MIPS_REG_20
|
UC_MIPS_REG_S4 = 22
|
||||||
UC_MIPS_REG_S5 = UC_MIPS_REG_21
|
UC_MIPS_REG_S5 = 23
|
||||||
UC_MIPS_REG_S6 = UC_MIPS_REG_22
|
UC_MIPS_REG_S6 = 24
|
||||||
UC_MIPS_REG_S7 = UC_MIPS_REG_23
|
UC_MIPS_REG_S7 = 25
|
||||||
UC_MIPS_REG_T8 = UC_MIPS_REG_24
|
UC_MIPS_REG_T8 = 26
|
||||||
UC_MIPS_REG_T9 = UC_MIPS_REG_25
|
UC_MIPS_REG_T9 = 27
|
||||||
UC_MIPS_REG_K0 = UC_MIPS_REG_26
|
UC_MIPS_REG_K0 = 28
|
||||||
UC_MIPS_REG_K1 = UC_MIPS_REG_27
|
UC_MIPS_REG_K1 = 29
|
||||||
UC_MIPS_REG_GP = UC_MIPS_REG_28
|
UC_MIPS_REG_GP = 30
|
||||||
UC_MIPS_REG_SP = UC_MIPS_REG_29
|
UC_MIPS_REG_SP = 31
|
||||||
UC_MIPS_REG_FP = UC_MIPS_REG_30
|
UC_MIPS_REG_FP = 32
|
||||||
UC_MIPS_REG_S8 = UC_MIPS_REG_30
|
UC_MIPS_REG_S8 = 32
|
||||||
UC_MIPS_REG_RA = UC_MIPS_REG_31
|
UC_MIPS_REG_RA = 33
|
||||||
UC_MIPS_REG_HI0 = UC_MIPS_REG_AC0
|
UC_MIPS_REG_HI0 = 45
|
||||||
UC_MIPS_REG_HI1 = UC_MIPS_REG_AC1
|
UC_MIPS_REG_HI1 = 46
|
||||||
UC_MIPS_REG_HI2 = UC_MIPS_REG_AC2
|
UC_MIPS_REG_HI2 = 47
|
||||||
UC_MIPS_REG_HI3 = UC_MIPS_REG_AC3
|
UC_MIPS_REG_HI3 = 48
|
||||||
UC_MIPS_REG_LO0 = UC_MIPS_REG_HI0
|
UC_MIPS_REG_LO0 = 45
|
||||||
UC_MIPS_REG_LO1 = UC_MIPS_REG_HI1
|
UC_MIPS_REG_LO1 = 46
|
||||||
UC_MIPS_REG_LO2 = UC_MIPS_REG_HI2
|
UC_MIPS_REG_LO2 = 47
|
||||||
UC_MIPS_REG_LO3 = UC_MIPS_REG_HI3
|
UC_MIPS_REG_LO3 = 48
|
||||||
|
@ -92,5 +92,5 @@ UC_SPARC_REG_Y = 86
|
|||||||
UC_SPARC_REG_XCC = 87
|
UC_SPARC_REG_XCC = 87
|
||||||
UC_SPARC_REG_PC = 88
|
UC_SPARC_REG_PC = 88
|
||||||
UC_SPARC_REG_ENDING = 89
|
UC_SPARC_REG_ENDING = 89
|
||||||
UC_SPARC_REG_O6 = UC_SPARC_REG_SP
|
UC_SPARC_REG_O6 = 85
|
||||||
UC_SPARC_REG_I6 = UC_SPARC_REG_FP
|
UC_SPARC_REG_I6 = 53
|
||||||
|
321
bindings/python/unicorn/unicorn.py
Normal file
321
bindings/python/unicorn/unicorn.py
Normal file
@ -0,0 +1,321 @@
|
|||||||
|
# Unicorn Python bindings, by Nguyen Anh Quynnh <aquynh@gmail.com>
|
||||||
|
import sys
|
||||||
|
_python2 = sys.version_info[0] < 3
|
||||||
|
if _python2:
|
||||||
|
range = xrange
|
||||||
|
from . import arm_const, arm64_const, mips_const, sparc_const, m68k_const, x86_const
|
||||||
|
from unicorn_const import *
|
||||||
|
|
||||||
|
import ctypes, ctypes.util, sys
|
||||||
|
from os.path import split, join, dirname
|
||||||
|
import distutils.sysconfig
|
||||||
|
|
||||||
|
|
||||||
|
import inspect
|
||||||
|
if not hasattr(sys.modules[__name__], '__file__'):
|
||||||
|
__file__ = inspect.getfile(inspect.currentframe())
|
||||||
|
|
||||||
|
_lib_path = split(__file__)[0]
|
||||||
|
_all_libs = ['unicorn.dll', 'libunicorn.so', 'libunicorn.dylib']
|
||||||
|
_found = False
|
||||||
|
|
||||||
|
for _lib in _all_libs:
|
||||||
|
try:
|
||||||
|
_lib_file = join(_lib_path, _lib)
|
||||||
|
# print "Trying to load:", _lib_file
|
||||||
|
_uc = ctypes.cdll.LoadLibrary(_lib_file)
|
||||||
|
_found = True
|
||||||
|
break
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if _found == False:
|
||||||
|
# try loading from default paths
|
||||||
|
for _lib in _all_libs:
|
||||||
|
try:
|
||||||
|
_uc = ctypes.cdll.LoadLibrary(_lib)
|
||||||
|
_found = True
|
||||||
|
break
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if _found == False:
|
||||||
|
# last try: loading from python lib directory
|
||||||
|
_lib_path = distutils.sysconfig.get_python_lib()
|
||||||
|
for _lib in _all_libs:
|
||||||
|
try:
|
||||||
|
_lib_file = join(_lib_path, 'unicorn', _lib)
|
||||||
|
# print "Trying to load:", _lib_file
|
||||||
|
_uc = ctypes.cdll.LoadLibrary(_lib_file)
|
||||||
|
_found = True
|
||||||
|
break
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
if _found == False:
|
||||||
|
raise ImportError("ERROR: fail to load the dynamic library.")
|
||||||
|
|
||||||
|
|
||||||
|
# setup all the function prototype
|
||||||
|
def _setup_prototype(lib, fname, restype, *argtypes):
|
||||||
|
getattr(lib, fname).restype = restype
|
||||||
|
getattr(lib, fname).argtypes = argtypes
|
||||||
|
|
||||||
|
_setup_prototype(_uc, "uc_version", ctypes.c_int, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
|
||||||
|
_setup_prototype(_uc, "uc_arch_supported", ctypes.c_bool, ctypes.c_int)
|
||||||
|
_setup_prototype(_uc, "uc_open", ctypes.c_int, ctypes.c_uint, ctypes.c_uint, ctypes.POINTER(ctypes.c_size_t))
|
||||||
|
_setup_prototype(_uc, "uc_close", ctypes.c_int, ctypes.POINTER(ctypes.c_size_t))
|
||||||
|
_setup_prototype(_uc, "uc_strerror", ctypes.c_char_p, ctypes.c_int)
|
||||||
|
_setup_prototype(_uc, "uc_errno", ctypes.c_int, ctypes.c_size_t)
|
||||||
|
_setup_prototype(_uc, "uc_reg_read", ctypes.c_int, ctypes.c_size_t, ctypes.c_int, ctypes.c_void_p)
|
||||||
|
_setup_prototype(_uc, "uc_reg_write", ctypes.c_int, ctypes.c_size_t, ctypes.c_int, ctypes.c_void_p)
|
||||||
|
_setup_prototype(_uc, "uc_mem_read", ctypes.c_int, ctypes.c_size_t, ctypes.c_uint64, ctypes.POINTER(ctypes.c_char), ctypes.c_size_t)
|
||||||
|
_setup_prototype(_uc, "uc_mem_write", ctypes.c_int, ctypes.c_size_t, ctypes.c_uint64, ctypes.POINTER(ctypes.c_char), ctypes.c_size_t)
|
||||||
|
_setup_prototype(_uc, "uc_emu_start", ctypes.c_int, ctypes.c_size_t, ctypes.c_uint64, ctypes.c_uint64, ctypes.c_uint64, ctypes.c_size_t)
|
||||||
|
_setup_prototype(_uc, "uc_emu_stop", ctypes.c_int, ctypes.c_size_t)
|
||||||
|
_setup_prototype(_uc, "uc_hook_del", ctypes.c_int, ctypes.c_size_t, ctypes.POINTER(ctypes.c_size_t))
|
||||||
|
_setup_prototype(_uc, "uc_mem_map", ctypes.c_int, ctypes.c_size_t, ctypes.c_uint64, ctypes.c_size_t)
|
||||||
|
|
||||||
|
# uc_hook_add is special due to variable number of arguments
|
||||||
|
_uc.uc_hook_add = getattr(_uc, "uc_hook_add")
|
||||||
|
_uc.uc_hook_add.restype = ctypes.c_int
|
||||||
|
|
||||||
|
UC_HOOK_CODE_CB = ctypes.CFUNCTYPE(None, ctypes.c_size_t, ctypes.c_uint64, ctypes.c_size_t, ctypes.c_void_p)
|
||||||
|
UC_HOOK_MEM_INVALID_CB = ctypes.CFUNCTYPE(ctypes.c_bool, ctypes.c_size_t, ctypes.c_int, \
|
||||||
|
ctypes.c_uint64, ctypes.c_int, ctypes.c_int64, ctypes.c_void_p)
|
||||||
|
UC_HOOK_MEM_ACCESS_CB = ctypes.CFUNCTYPE(None, ctypes.c_size_t, ctypes.c_int, \
|
||||||
|
ctypes.c_uint64, ctypes.c_int, ctypes.c_int64, ctypes.c_void_p)
|
||||||
|
UC_HOOK_INTR_CB = ctypes.CFUNCTYPE(None, ctypes.c_size_t, ctypes.c_uint32, \
|
||||||
|
ctypes.c_void_p)
|
||||||
|
UC_HOOK_INSN_IN_CB = ctypes.CFUNCTYPE(ctypes.c_uint32, ctypes.c_size_t, ctypes.c_uint32, \
|
||||||
|
ctypes.c_int, ctypes.c_void_p)
|
||||||
|
UC_HOOK_INSN_OUT_CB = ctypes.CFUNCTYPE(None, ctypes.c_size_t, ctypes.c_uint32, \
|
||||||
|
ctypes.c_int, ctypes.c_uint32, ctypes.c_void_p)
|
||||||
|
UC_HOOK_INSN_SYSCALL_CB = ctypes.CFUNCTYPE(None, ctypes.c_size_t, ctypes.c_void_p)
|
||||||
|
|
||||||
|
|
||||||
|
# access to error code via @errno of UcError
|
||||||
|
class UcError(Exception):
|
||||||
|
def __init__(self, errno):
|
||||||
|
self.errno = errno
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return _uc.uc_strerror(self.errno)
|
||||||
|
|
||||||
|
|
||||||
|
# return the core's version
|
||||||
|
def uc_version():
|
||||||
|
major = ctypes.c_int()
|
||||||
|
minor = ctypes.c_int()
|
||||||
|
combined = _uc.uc_version(ctypes.byref(major), ctypes.byref(minor))
|
||||||
|
return (major.value, minor.value, combined)
|
||||||
|
|
||||||
|
|
||||||
|
# return the binding's version
|
||||||
|
def version_bind():
|
||||||
|
return (UC_API_MAJOR, UC_API_MINOR, (UC_API_MAJOR << 8) + UC_API_MINOR)
|
||||||
|
|
||||||
|
|
||||||
|
# check to see if this engine supports a particular arch
|
||||||
|
def uc_arch_supported(query):
|
||||||
|
return _uc.uc_arch_supported(query)
|
||||||
|
|
||||||
|
|
||||||
|
class Uc(object):
|
||||||
|
def __init__(self, arch, mode):
|
||||||
|
# verify version compatibility with the core before doing anything
|
||||||
|
(major, minor, _combined) = uc_version()
|
||||||
|
if major != UC_API_MAJOR or minor != UC_API_MINOR:
|
||||||
|
self._uch = None
|
||||||
|
# our binding version is different from the core's API version
|
||||||
|
raise UcError(UC_ERR_VERSION)
|
||||||
|
|
||||||
|
self._arch, self._mode = arch, mode
|
||||||
|
self._uch = ctypes.c_size_t()
|
||||||
|
status = _uc.uc_open(arch, mode, ctypes.byref(self._uch))
|
||||||
|
if status != UC_ERR_OK:
|
||||||
|
self._uch = None
|
||||||
|
raise UcError(status)
|
||||||
|
# internal mapping table to save callback & userdata
|
||||||
|
self._callbacks = {}
|
||||||
|
self._callback_count = 0
|
||||||
|
|
||||||
|
|
||||||
|
# destructor to be called automatically when object is destroyed.
|
||||||
|
def __del__(self):
|
||||||
|
if self._uch:
|
||||||
|
try:
|
||||||
|
status = _uc.uc_close(ctypes.byref(self._uch))
|
||||||
|
if status != UC_ERR_OK:
|
||||||
|
raise UcError(status)
|
||||||
|
except: # _uc might be pulled from under our feet
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# emulate from @begin, and stop when reaching address @until
|
||||||
|
def emu_start(self, begin, until, timeout=0, count=0):
|
||||||
|
status = _uc.uc_emu_start(self._uch, begin, until, timeout, count)
|
||||||
|
if status != UC_ERR_OK:
|
||||||
|
raise UcError(status)
|
||||||
|
|
||||||
|
|
||||||
|
# stop emulation
|
||||||
|
def emu_stop(self):
|
||||||
|
status = _uc.uc_emu_stop(self._uch)
|
||||||
|
if status != UC_ERR_OK:
|
||||||
|
raise UcError(status)
|
||||||
|
|
||||||
|
|
||||||
|
# return the value of a register
|
||||||
|
def reg_read(self, reg_id):
|
||||||
|
# read to 64bit number to be safe
|
||||||
|
reg = ctypes.c_int64(0)
|
||||||
|
status = _uc.uc_reg_read(self._uch, reg_id, ctypes.byref(reg))
|
||||||
|
if status != UC_ERR_OK:
|
||||||
|
raise UcError(status)
|
||||||
|
return reg.value
|
||||||
|
|
||||||
|
|
||||||
|
# write to a register
|
||||||
|
def reg_write(self, reg_id, value):
|
||||||
|
# convert to 64bit number to be safe
|
||||||
|
reg = ctypes.c_int64(value)
|
||||||
|
status = _uc.uc_reg_write(self._uch, reg_id, ctypes.byref(reg))
|
||||||
|
if status != UC_ERR_OK:
|
||||||
|
raise UcError(status)
|
||||||
|
|
||||||
|
|
||||||
|
# read data from memory
|
||||||
|
def mem_read(self, address, size):
|
||||||
|
data = ctypes.create_string_buffer(size)
|
||||||
|
status = _uc.uc_mem_read(self._uch, address, data, size)
|
||||||
|
if status != UC_ERR_OK:
|
||||||
|
raise UcError(status)
|
||||||
|
return bytearray(data)
|
||||||
|
|
||||||
|
|
||||||
|
# write to memory
|
||||||
|
def mem_write(self, address, data):
|
||||||
|
status = _uc.uc_mem_write(self._uch, address, data, len(data))
|
||||||
|
if status != UC_ERR_OK:
|
||||||
|
raise UcError(status)
|
||||||
|
|
||||||
|
|
||||||
|
# map a range of memory
|
||||||
|
def mem_map(self, address, size):
|
||||||
|
status = _uc.uc_mem_map(self._uch, address, size)
|
||||||
|
if status != UC_ERR_OK:
|
||||||
|
raise UcError(status)
|
||||||
|
|
||||||
|
|
||||||
|
def _hookcode_cb(self, handle, address, size, user_data):
|
||||||
|
# call user's callback with self object
|
||||||
|
(cb, data) = self._callbacks[user_data]
|
||||||
|
cb(self, address, size, data)
|
||||||
|
|
||||||
|
|
||||||
|
def _hook_mem_invalid_cb(self, handle, access, address, size, value, user_data):
|
||||||
|
# call user's callback with self object
|
||||||
|
(cb, data) = self._callbacks[user_data]
|
||||||
|
return cb(self, access, address, size, value, data)
|
||||||
|
|
||||||
|
|
||||||
|
def _hook_mem_access_cb(self, handle, access, address, size, value, user_data):
|
||||||
|
# call user's callback with self object
|
||||||
|
(cb, data) = self._callbacks[user_data]
|
||||||
|
cb(self, access, address, size, value, data)
|
||||||
|
|
||||||
|
|
||||||
|
def _hook_intr_cb(self, handle, intno, user_data):
|
||||||
|
# call user's callback with self object
|
||||||
|
(cb, data) = self._callbacks[user_data]
|
||||||
|
cb(self, intno, data)
|
||||||
|
|
||||||
|
|
||||||
|
def _hook_insn_in_cb(self, handle, port, size, user_data):
|
||||||
|
# call user's callback with self object
|
||||||
|
(cb, data) = self._callbacks[user_data]
|
||||||
|
return cb(self, port, size, data)
|
||||||
|
|
||||||
|
|
||||||
|
def _hook_insn_out_cb(self, handle, port, size, value, user_data):
|
||||||
|
# call user's callback with self object
|
||||||
|
(cb, data) = self._callbacks[user_data]
|
||||||
|
cb(self, port, size, value, data)
|
||||||
|
|
||||||
|
|
||||||
|
def _hook_insn_syscall_cb(self, handle, user_data):
|
||||||
|
# call user's callback with self object
|
||||||
|
(cb, data) = self._callbacks[user_data]
|
||||||
|
cb(self, data)
|
||||||
|
|
||||||
|
|
||||||
|
# add a hook
|
||||||
|
def hook_add(self, htype, callback, user_data=None, arg1=1, arg2=0):
|
||||||
|
_h2 = ctypes.c_size_t()
|
||||||
|
|
||||||
|
# save callback & user_data
|
||||||
|
self._callback_count += 1
|
||||||
|
self._callbacks[self._callback_count] = (callback, user_data)
|
||||||
|
|
||||||
|
if htype in (UC_HOOK_BLOCK, UC_HOOK_CODE):
|
||||||
|
begin = ctypes.c_uint64(arg1)
|
||||||
|
end = ctypes.c_uint64(arg2)
|
||||||
|
# set callback with wrapper, so it can be called
|
||||||
|
# with this object as param
|
||||||
|
cb = ctypes.cast(UC_HOOK_CODE_CB(self._hookcode_cb), UC_HOOK_CODE_CB)
|
||||||
|
status = _uc.uc_hook_add(self._uch, ctypes.byref(_h2), htype, cb, \
|
||||||
|
ctypes.cast(self._callback_count, ctypes.c_void_p), begin, end)
|
||||||
|
elif htype == UC_HOOK_MEM_INVALID:
|
||||||
|
cb = ctypes.cast(UC_HOOK_MEM_INVALID_CB(self._hook_mem_invalid_cb), UC_HOOK_MEM_INVALID_CB)
|
||||||
|
status = _uc.uc_hook_add(self._uch, ctypes.byref(_h2), htype, \
|
||||||
|
cb, ctypes.cast(self._callback_count, ctypes.c_void_p))
|
||||||
|
elif htype in (UC_HOOK_MEM_READ, UC_HOOK_MEM_WRITE, UC_HOOK_MEM_READ_WRITE):
|
||||||
|
cb = ctypes.cast(UC_HOOK_MEM_ACCESS_CB(self._hook_mem_access_cb), UC_HOOK_MEM_ACCESS_CB)
|
||||||
|
status = _uc.uc_hook_add(self._uch, ctypes.byref(_h2), htype, \
|
||||||
|
cb, ctypes.cast(self._callback_count, ctypes.c_void_p))
|
||||||
|
elif htype == UC_HOOK_INSN:
|
||||||
|
insn = ctypes.c_int(arg1)
|
||||||
|
if arg1 == x86_const.UC_X86_INS_IN: # IN instruction
|
||||||
|
cb = ctypes.cast(UC_HOOK_INSN_IN_CB(self._hook_insn_in_cb), UC_HOOK_INSN_IN_CB)
|
||||||
|
if arg1 == x86_const.UC_X86_INS_OUT: # OUT instruction
|
||||||
|
cb = ctypes.cast(UC_HOOK_INSN_OUT_CB(self._hook_insn_out_cb), UC_HOOK_INSN_OUT_CB)
|
||||||
|
if arg1 in (x86_const.UC_X86_INS_SYSCALL, x86_const.UC_X86_INS_SYSENTER): # SYSCALL/SYSENTER instruction
|
||||||
|
cb = ctypes.cast(UC_HOOK_INSN_SYSCALL_CB(self._hook_insn_syscall_cb), UC_HOOK_INSN_SYSCALL_CB)
|
||||||
|
status = _uc.uc_hook_add(self._uch, ctypes.byref(_h2), htype, \
|
||||||
|
cb, ctypes.cast(self._callback_count, ctypes.c_void_p), insn)
|
||||||
|
elif htype == UC_HOOK_INTR:
|
||||||
|
cb = ctypes.cast(UC_HOOK_INTR_CB(self._hook_intr_cb), UC_HOOK_INTR_CB)
|
||||||
|
status = _uc.uc_hook_add(self._uch, ctypes.byref(_h2), htype, \
|
||||||
|
cb, ctypes.cast(self._callback_count, ctypes.c_void_p))
|
||||||
|
|
||||||
|
if status != UC_ERR_OK:
|
||||||
|
raise UcError(status)
|
||||||
|
|
||||||
|
return _h2.value
|
||||||
|
|
||||||
|
|
||||||
|
# delete a hook
|
||||||
|
def hook_del(self, h):
|
||||||
|
_h = ctypes.c_size_t(h)
|
||||||
|
status = _uc.uc_hook_del(self._uch, ctypes.byref(_h))
|
||||||
|
if status != UC_ERR_OK:
|
||||||
|
raise UcError(status)
|
||||||
|
h = 0
|
||||||
|
|
||||||
|
|
||||||
|
# print out debugging info
|
||||||
|
def debug():
|
||||||
|
archs = { "arm": UC_ARCH_ARM, "arm64": UC_ARCH_ARM64, \
|
||||||
|
"mips": UC_ARCH_MIPS, "sparc": UC_ARCH_SPARC, \
|
||||||
|
"m68k": UC_ARCH_M68K, "x86": UC_ARCH_X86 }
|
||||||
|
|
||||||
|
all_archs = ""
|
||||||
|
keys = archs.keys()
|
||||||
|
keys.sort()
|
||||||
|
for k in keys:
|
||||||
|
if uc_arch_supported(archs[k]):
|
||||||
|
all_archs += "-%s" % k
|
||||||
|
|
||||||
|
(major, minor, _combined) = uc_version()
|
||||||
|
|
||||||
|
return "python-%s-c%u.%u-b%u.%u" % (all_archs, major, minor, UC_API_MAJOR, UC_API_MINOR)
|
63
bindings/python/unicorn/unicorn_const.py
Normal file
63
bindings/python/unicorn/unicorn_const.py
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [unicorn_const.py]
|
||||||
|
|
||||||
|
UC_API_MAJOR = 0
|
||||||
|
UC_API_MINOR = 9
|
||||||
|
UC_SECOND_SCALE = 1000000
|
||||||
|
UC_MILISECOND_SCALE = 1000
|
||||||
|
UC_ARCH_ARM = 1
|
||||||
|
UC_ARCH_ARM64 = 2
|
||||||
|
UC_ARCH_MIPS = 3
|
||||||
|
UC_ARCH_X86 = 4
|
||||||
|
UC_ARCH_PPC = 5
|
||||||
|
UC_ARCH_SPARC = 6
|
||||||
|
UC_ARCH_M68K = 7
|
||||||
|
UC_ARCH_MAX = 8
|
||||||
|
|
||||||
|
UC_MODE_LITTLE_ENDIAN = 0
|
||||||
|
|
||||||
|
UC_MODE_ARM = 0
|
||||||
|
UC_MODE_16 = 2
|
||||||
|
UC_MODE_32 = 4
|
||||||
|
UC_MODE_64 = 8
|
||||||
|
UC_MODE_THUMB = 16
|
||||||
|
UC_MODE_MCLASS = 32
|
||||||
|
UC_MODE_V8 = 64
|
||||||
|
UC_MODE_MICRO = 16
|
||||||
|
UC_MODE_MIPS3 = 32
|
||||||
|
UC_MODE_MIPS32R6 = 64
|
||||||
|
UC_MODE_V9 = 16
|
||||||
|
UC_MODE_QPX = 16
|
||||||
|
UC_MODE_BIG_ENDIAN = 2147483648
|
||||||
|
UC_MODE_MIPS32 = 4
|
||||||
|
UC_MODE_MIPS64 = 8
|
||||||
|
|
||||||
|
UC_ERR_OK = 0
|
||||||
|
UC_ERR_OOM = 1
|
||||||
|
UC_ERR_ARCH = 2
|
||||||
|
UC_ERR_HANDLE = 3
|
||||||
|
UC_ERR_UCH = 4
|
||||||
|
UC_ERR_MODE = 5
|
||||||
|
UC_ERR_VERSION = 6
|
||||||
|
UC_ERR_MEM_READ = 7
|
||||||
|
UC_ERR_MEM_WRITE = 8
|
||||||
|
UC_ERR_CODE_INVALID = 9
|
||||||
|
UC_ERR_HOOK = 10
|
||||||
|
UC_ERR_INSN_INVALID = 11
|
||||||
|
UC_ERR_MAP = 12
|
||||||
|
UC_ERR_MEM_WRITE_NW = 13
|
||||||
|
UC_ERR_MEM_READ_NR = 14
|
||||||
|
UC_MEM_READ = 16
|
||||||
|
UC_MEM_WRITE = 17
|
||||||
|
UC_MEM_READ_WRITE = 18
|
||||||
|
UC_MEM_WRITE_NW = 19
|
||||||
|
UC_MEM_READ_NR = 20
|
||||||
|
UC_HOOK_INTR = 32
|
||||||
|
UC_HOOK_INSN = 33
|
||||||
|
UC_HOOK_CODE = 34
|
||||||
|
UC_HOOK_BLOCK = 35
|
||||||
|
UC_HOOK_MEM_INVALID = 36
|
||||||
|
UC_HOOK_MEM_READ = 37
|
||||||
|
UC_HOOK_MEM_WRITE = 38
|
||||||
|
UC_HOOK_MEM_READ_WRITE = 39
|
||||||
|
UC_PROT_READ = 1
|
||||||
|
UC_PROT_WRITE = 2
|
0
include/uc_priv.h
Executable file → Normal file
0
include/uc_priv.h
Executable file → Normal file
0
include/unicorn/unicorn.h
Executable file → Normal file
0
include/unicorn/unicorn.h
Executable file → Normal file
0
qemu/softmmu_template.h
Executable file → Normal file
0
qemu/softmmu_template.h
Executable file → Normal file
13
regress/emu_stop_segfault.py
Executable file
13
regress/emu_stop_segfault.py
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
"""See https://github.com/unicorn-engine/unicorn/issues/65"""
|
||||||
|
|
||||||
|
import unicorn
|
||||||
|
ADDR = 0x10101000
|
||||||
|
mu = unicorn.Uc(unicorn.UC_ARCH_X86, unicorn.UC_MODE_32)
|
||||||
|
mu.mem_map(ADDR, 1024 * 4)
|
||||||
|
mu.mem_write(ADDR, b'\x41')
|
||||||
|
mu.emu_start(ADDR, ADDR + 1, count=1)
|
||||||
|
# The following should not trigger a null pointer dereference
|
||||||
|
mu.emu_stop()
|
||||||
|
|
@ -17,6 +17,8 @@ if test -e $DIR/sample_x86; then
|
|||||||
$DIR/sample_x86 -64
|
$DIR/sample_x86 -64
|
||||||
echo "=========================="
|
echo "=========================="
|
||||||
$DIR/sample_x86 -16
|
$DIR/sample_x86 -16
|
||||||
|
echo "=========================="
|
||||||
|
$DIR/shellcode -32
|
||||||
fi
|
fi
|
||||||
if test -e $DIR/sample_arm; then
|
if test -e $DIR/sample_arm; then
|
||||||
echo "=========================="
|
echo "=========================="
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
//#define X86_CODE64 "\x41\xBC\x3B\xB0\x28\x2A\x49\x0F\xC9\x90\x4D\x0F\xAD\xCF\x49\x87\xFD\x90\x48\x81\xD2\x8A\xCE\x77\x35\x48\xF7\xD9"
|
//#define X86_CODE64 "\x41\xBC\x3B\xB0\x28\x2A\x49\x0F\xC9\x90\x4D\x0F\xAD\xCF\x49\x87\xFD\x90\x48\x81\xD2\x8A\xCE\x77\x35\x48\xF7\xD9"
|
||||||
#define X86_CODE64 "\x41\xBC\x3B\xB0\x28\x2A\x49\x0F\xC9\x90\x4D\x0F\xAD\xCF\x49\x87\xFD\x90\x48\x81\xD2\x8A\xCE\x77\x35\x48\xF7\xD9\x4D\x29\xF4\x49\x81\xC9\xF6\x8A\xC6\x53\x4D\x87\xED\x48\x0F\xAD\xD2\x49\xF7\xD4\x48\xF7\xE1\x4D\x19\xC5\x4D\x89\xC5\x48\xF7\xD6\x41\xB8\x4F\x8D\x6B\x59\x4D\x87\xD0\x68\x6A\x1E\x09\x3C\x59"
|
#define X86_CODE64 "\x41\xBC\x3B\xB0\x28\x2A\x49\x0F\xC9\x90\x4D\x0F\xAD\xCF\x49\x87\xFD\x90\x48\x81\xD2\x8A\xCE\x77\x35\x48\xF7\xD9\x4D\x29\xF4\x49\x81\xC9\xF6\x8A\xC6\x53\x4D\x87\xED\x48\x0F\xAD\xD2\x49\xF7\xD4\x48\xF7\xE1\x4D\x19\xC5\x4D\x89\xC5\x48\xF7\xD6\x41\xB8\x4F\x8D\x6B\x59\x4D\x87\xD0\x68\x6A\x1E\x09\x3C\x59"
|
||||||
#define X86_CODE16 "\x00\x00" // add byte ptr [bx + si], al
|
#define X86_CODE16 "\x00\x00" // add byte ptr [bx + si], al
|
||||||
|
#define X86_CODE64_SYSCALL "\x0f\x05" // SYSCALL
|
||||||
|
|
||||||
// memory address where emulation starts
|
// memory address where emulation starts
|
||||||
#define ADDRESS 0x1000000
|
#define ADDRESS 0x1000000
|
||||||
@ -152,6 +153,19 @@ static void hook_out(uch handle, uint32_t port, int size, uint32_t value, void *
|
|||||||
printf("--- register value = 0x%x\n", tmp);
|
printf("--- register value = 0x%x\n", tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// callback for SYSCALL instruction (X86).
|
||||||
|
static void hook_syscall(uch handle, void *user_data)
|
||||||
|
{
|
||||||
|
uint64_t rax;
|
||||||
|
|
||||||
|
uc_reg_read(handle, UC_X86_REG_RAX, &rax);
|
||||||
|
if (rax == 0x100) {
|
||||||
|
rax = 0x200;
|
||||||
|
uc_reg_write(handle, UC_X86_REG_RAX, &rax);
|
||||||
|
} else
|
||||||
|
printf("ERROR: was not expecting rax=0x%"PRIx64 " in syscall\n", rax);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_i386(void)
|
static void test_i386(void)
|
||||||
{
|
{
|
||||||
uch handle;
|
uch handle;
|
||||||
@ -673,6 +687,57 @@ static void test_x86_64(void)
|
|||||||
uc_close(&handle);
|
uc_close(&handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_x86_64_syscall(void)
|
||||||
|
{
|
||||||
|
uch handle;
|
||||||
|
uch trace1;
|
||||||
|
uc_err err;
|
||||||
|
|
||||||
|
int64_t rax = 0x100;
|
||||||
|
|
||||||
|
printf("===================================\n");
|
||||||
|
printf("Emulate x86_64 code with 'syscall' instruction\n");
|
||||||
|
|
||||||
|
// Initialize emulator in X86-64bit mode
|
||||||
|
err = uc_open(UC_ARCH_X86, UC_MODE_64, &handle);
|
||||||
|
if (err) {
|
||||||
|
printf("Failed on uc_open() with error returned: %u\n", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// map 2MB memory for this emulation
|
||||||
|
uc_mem_map(handle, ADDRESS, 2 * 1024 * 1024);
|
||||||
|
|
||||||
|
// write machine code to be emulated to memory
|
||||||
|
if (uc_mem_write(handle, ADDRESS, (uint8_t *)X86_CODE64_SYSCALL, sizeof(X86_CODE64_SYSCALL) - 1)) {
|
||||||
|
printf("Failed to write emulation code to memory, quit!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// hook interrupts for syscall
|
||||||
|
uc_hook_add(handle, &trace1, UC_HOOK_INSN, hook_syscall, NULL, UC_X86_INS_SYSCALL);
|
||||||
|
|
||||||
|
// initialize machine registers
|
||||||
|
uc_reg_write(handle, UC_X86_REG_RAX, &rax);
|
||||||
|
|
||||||
|
// emulate machine code in infinite time (last param = 0), or when
|
||||||
|
// finishing all the code.
|
||||||
|
err = uc_emu_start(handle, ADDRESS, ADDRESS + sizeof(X86_CODE64_SYSCALL) - 1, 0, 0);
|
||||||
|
if (err) {
|
||||||
|
printf("Failed on uc_emu_start() with error returned %u: %s\n",
|
||||||
|
err, uc_strerror(err));
|
||||||
|
}
|
||||||
|
|
||||||
|
// now print out some registers
|
||||||
|
printf(">>> Emulation done. Below is the CPU context\n");
|
||||||
|
|
||||||
|
uc_reg_read(handle, UC_X86_REG_RAX, &rax);
|
||||||
|
|
||||||
|
printf(">>> RAX = 0x%" PRIx64 "\n", rax);
|
||||||
|
|
||||||
|
uc_close(&handle);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_x86_16(void)
|
static void test_x86_16(void)
|
||||||
{
|
{
|
||||||
uch handle;
|
uch handle;
|
||||||
@ -741,6 +806,7 @@ int main(int argc, char **argv, char **envp)
|
|||||||
|
|
||||||
if (!strcmp(argv[1], "-64")) {
|
if (!strcmp(argv[1], "-64")) {
|
||||||
test_x86_64();
|
test_x86_64();
|
||||||
|
test_x86_64_syscall();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strcmp(argv[1], "-16")) {
|
if (!strcmp(argv[1], "-16")) {
|
||||||
|
4
uc.c
Executable file → Normal file
4
uc.c
Executable file → Normal file
@ -429,6 +429,7 @@ uc_err uc_emu_start(uch handle, uint64_t begin, uint64_t until, uint64_t timeout
|
|||||||
uc->stop_request = false;
|
uc->stop_request = false;
|
||||||
uc->invalid_error = UC_ERR_OK;
|
uc->invalid_error = UC_ERR_OK;
|
||||||
uc->block_full = false;
|
uc->block_full = false;
|
||||||
|
uc->emulation_done = false;
|
||||||
|
|
||||||
switch(uc->arch) {
|
switch(uc->arch) {
|
||||||
default:
|
default:
|
||||||
@ -507,6 +508,9 @@ uc_err uc_emu_stop(uch handle)
|
|||||||
// invalid handle
|
// invalid handle
|
||||||
return UC_ERR_UCH;
|
return UC_ERR_UCH;
|
||||||
|
|
||||||
|
if (uc->emulation_done)
|
||||||
|
return UC_ERR_OK;
|
||||||
|
|
||||||
uc->stop_request = true;
|
uc->stop_request = true;
|
||||||
// exit the current TB
|
// exit the current TB
|
||||||
cpu_exit(uc->current_cpu);
|
cpu_exit(uc->current_cpu);
|
||||||
|
Loading…
Reference in New Issue
Block a user