FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
pythoncode-tutorials/general/assembly-code/arm_assembly.py at master · popoting/pythoncode-tutorials · GitHub
popoting
/
pythoncode-tutorials
Public
forked from
x4nth055/pythoncode-tutorials
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Discussions
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Discussions
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
pythoncode-tutorials
/
general
/
assembly-code
/
arm_assembly.py
Copy path
More file actions
More file actions
Latest commit
History
History
History
56 lines (50 loc) · 1.78 KB
Breadcrumbs
pythoncode-tutorials
/
general
/
assembly-code
/
arm_assembly.py
Copy path
File metadata and controls
56 lines (50 loc) · 1.78 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# We need to emulate ARM
from
unicorn
import
Uc
,
UC_ARCH_ARM
,
UC_MODE_ARM
,
UcError
# for accessing the R0 and R1 registers
from
unicorn
.
arm_const
import
UC_ARM_REG_R0
,
UC_ARM_REG_R1
# We need to assemble ARM code
from
keystone
import
Ks
,
KS_ARCH_ARM
,
KS_MODE_ARM
,
KsError
ARM_CODE
=
"""
// n is r0, we will pass it from python, ans is r1
mov r1, 1 // ans = 1
loop:
cmp r0, 0 // while n >= 0:
mulgt r1, r1, r0 // ans *= n
subgt r0, r0, 1 // n = n - 1
bgt loop //
// answer is in r1
"""
print
(
"Assembling the ARM code"
)
try
:
# initialize the keystone object with the ARM architecture
ks
=
Ks
(
KS_ARCH_ARM
,
KS_MODE_ARM
)
# Assemble the ARM code
ARM_BYTECODE
,
_
=
ks
.
asm
(
ARM_CODE
)
# convert the array of integers into bytes
ARM_BYTECODE
=
bytes
(
ARM_BYTECODE
)
print
(
f"Code successfully assembled (length =
{
len
(
ARM_BYTECODE
)
}
)"
)
print
(
"ARM bytecode:"
,
ARM_BYTECODE
)
except
KsError
as
e
:
print
(
"Keystone Error: %s"
%
e
)
exit
(
1
)
# memory address where emulation starts
ADDRESS
=
0x1000000
print
(
"Emulating the ARM code"
)
try
:
# Initialize emulator in ARM mode
mu
=
Uc
(
UC_ARCH_ARM
,
UC_MODE_ARM
)
# map 2MB memory for this emulation
mu
.
mem_map
(
ADDRESS
,
2
*
1024
*
1024
)
# write machine code to be emulated to memory
mu
.
mem_write
(
ADDRESS
,
ARM_BYTECODE
)
# Set the r0 register in the code, let's calculate factorial(5)
mu
.
reg_write
(
UC_ARM_REG_R0
,
5
)
# emulate code in infinite time and unlimited instructions
mu
.
emu_start
(
ADDRESS
,
ADDRESS
+
len
(
ARM_BYTECODE
))
# now print out the R0 register
print
(
"Emulation done. Below is the result"
)
# retrieve the result from the R1 register
r1
=
mu
.
reg_read
(
UC_ARM_REG_R1
)
print
(
">> R1 = %u"
%
r1
)
except
UcError
as
e
:
print
(
"Unicorn Error: %s"
%
e
)
Back
|
FazBrowse Home
|
New Git URL