Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
S
SandHook
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
SandHook
Commits
a1112fb6
Commit
a1112fb6
authored
Jul 03, 2019
by
swift_gan
Committed by
swift_gan
Jul 03, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[Reconstitution]tweak code
parent
612980be
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
285 additions
and
292 deletions
+285
-292
assembler_arm32.cpp
...rc/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp
+43
-43
assembler_arm32.h
.../src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.h
+6
-6
hook_arm32.cpp
nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp
+28
-29
code_relocate_arm32.cpp
...main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp
+29
-29
code_relocate_arm32.h
...c/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h
+2
-2
assembler_arm64.cpp
...rc/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp
+48
-48
assembler_arm64.h
.../src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h
+2
-2
decoder_arm64.cpp
...ok/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp
+2
-2
hook_arm64.cpp
nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp
+23
-23
code_relocate_arm64.cpp
...main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp
+20
-20
code_relocate_arm64.h
...c/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h
+2
-2
assembler.cpp
nativehook/src/main/cpp/assembler/assembler.cpp
+4
-4
code_buffer.cpp
nativehook/src/main/cpp/buffer/code_buffer.cpp
+22
-22
code_buffer.h
nativehook/src/main/cpp/buffer/code_buffer.h
+10
-10
decoder.cpp
nativehook/src/main/cpp/decoder/decoder.cpp
+4
-4
hook.cpp
nativehook/src/main/cpp/hook/hook.cpp
+1
-1
assembler.h
nativehook/src/main/cpp/includes/assembler.h
+5
-5
code_relocate.h
nativehook/src/main/cpp/includes/code_relocate.h
+12
-12
decoder.h
nativehook/src/main/cpp/includes/decoder.h
+6
-6
exception.h
nativehook/src/main/cpp/includes/exception.h
+2
-5
hook.h
nativehook/src/main/cpp/includes/hook.h
+4
-7
code_relocate.cpp
nativehook/src/main/cpp/relocate/code_relocate.cpp
+6
-6
platform.cpp
nativehook/src/main/cpp/utils/platform.cpp
+2
-2
platform.h
nativehook/src/main/cpp/utils/platform.h
+2
-2
No files found.
nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp
View file @
a1112fb6
...
...
@@ -10,44 +10,44 @@ using namespace SandHook::RegistersA32;
using
namespace
SandHook
::
AsmA32
;
AssemblerA32
::
AssemblerA32
(
CodeBuffer
*
codeBuffer
)
{
code
C
ontainer
.
setCodeBuffer
(
codeBuffer
);
code
_c
ontainer
.
setCodeBuffer
(
codeBuffer
);
}
void
*
AssemblerA32
::
g
etPC
()
{
return
reinterpret_cast
<
void
*>
(
code
C
ontainer
.
curPc
);
void
*
AssemblerA32
::
G
etPC
()
{
return
reinterpret_cast
<
void
*>
(
code
_c
ontainer
.
curPc
);
}
void
*
AssemblerA32
::
g
etStartPC
()
{
return
reinterpret_cast
<
void
*>
(
code
C
ontainer
.
startPc
);
void
*
AssemblerA32
::
G
etStartPC
()
{
return
reinterpret_cast
<
void
*>
(
code
_c
ontainer
.
startPc
);
}
void
AssemblerA32
::
a
llocBufferFirst
(
U32
size
)
{
code
C
ontainer
.
allocBufferFirst
(
size
);
void
AssemblerA32
::
A
llocBufferFirst
(
U32
size
)
{
code
_c
ontainer
.
allocBufferFirst
(
size
);
}
void
*
AssemblerA32
::
f
inish
()
{
code
C
ontainer
.
commit
();
return
reinterpret_cast
<
void
*>
(
code
C
ontainer
.
startPc
);
void
*
AssemblerA32
::
F
inish
()
{
code
_c
ontainer
.
commit
();
return
reinterpret_cast
<
void
*>
(
code
_c
ontainer
.
startPc
);
}
void
AssemblerA32
::
Emit
(
U32
data32
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
Data32
(
data32
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
Data32
(
data32
)));
}
void
AssemblerA32
::
Emit
(
U16
data16
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
Data16
(
data16
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
Data16
(
data16
)));
}
void
AssemblerA32
::
Emit
(
Unit
<
Base
>
*
unit
)
{
code
C
ontainer
.
append
(
unit
);
void
AssemblerA32
::
Emit
(
BaseUnit
*
unit
)
{
code
_c
ontainer
.
append
(
unit
);
}
void
AssemblerA32
::
Mov
(
RegisterA32
&
rd
,
U16
imm16
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
MOV_MOVT_IMM
)(
INST_T32
(
MOV_MOVT_IMM
)
::
MOV
,
rd
,
imm16
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
MOV_MOVT_IMM
)(
INST_T32
(
MOV_MOVT_IMM
)
::
MOV
,
rd
,
imm16
)));
}
void
AssemblerA32
::
Movt
(
RegisterA32
&
rd
,
U16
imm16
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
MOV_MOVT_IMM
)(
INST_T32
(
MOV_MOVT_IMM
)
::
MOVT
,
rd
,
imm16
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
MOV_MOVT_IMM
)(
INST_T32
(
MOV_MOVT_IMM
)
::
MOVT
,
rd
,
imm16
)));
}
void
AssemblerA32
::
Mov
(
RegisterA32
&
rd
,
U32
imm32
)
{
...
...
@@ -58,104 +58,104 @@ void AssemblerA32::Mov(RegisterA32 &rd, U32 imm32) {
}
void
AssemblerA32
::
Ldr
(
RegisterA32
&
rt
,
Off
offset
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
LDR_LIT
)(
INST_T32
(
LDR_LIT
)
::
LDR
,
INST_T32
(
LDR_LIT
)
::
UnSign
,
rt
,
offset
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
LDR_LIT
)(
INST_T32
(
LDR_LIT
)
::
LDR
,
INST_T32
(
LDR_LIT
)
::
UnSign
,
rt
,
offset
)));
}
void
AssemblerA32
::
Ldr
(
RegisterA32
&
rt
,
Label
*
label
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
LDR_LIT
)(
INST_T32
(
LDR_LIT
)
::
LDR
,
INST_T32
(
LDR_LIT
)
::
UnSign
,
rt
,
label
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
LDR_LIT
)(
INST_T32
(
LDR_LIT
)
::
LDR
,
INST_T32
(
LDR_LIT
)
::
UnSign
,
rt
,
label
)));
}
void
AssemblerA32
::
Ldrb
(
RegisterA32
&
rt
,
Label
*
label
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
LDR_LIT
)(
INST_T32
(
LDR_LIT
)
::
LDRB
,
INST_T32
(
LDR_LIT
)
::
UnSign
,
rt
,
label
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
LDR_LIT
)(
INST_T32
(
LDR_LIT
)
::
LDRB
,
INST_T32
(
LDR_LIT
)
::
UnSign
,
rt
,
label
)));
}
void
AssemblerA32
::
Ldrh
(
RegisterA32
&
rt
,
Label
*
label
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
LDR_LIT
)(
INST_T32
(
LDR_LIT
)
::
LDRH
,
INST_T32
(
LDR_LIT
)
::
UnSign
,
rt
,
label
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
LDR_LIT
)(
INST_T32
(
LDR_LIT
)
::
LDRH
,
INST_T32
(
LDR_LIT
)
::
UnSign
,
rt
,
label
)));
}
void
AssemblerA32
::
Ldrsb
(
RegisterA32
&
rt
,
Label
*
label
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
LDR_LIT
)(
INST_T32
(
LDR_LIT
)
::
LDRB
,
INST_T32
(
LDR_LIT
)
::
Sign
,
rt
,
label
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
LDR_LIT
)(
INST_T32
(
LDR_LIT
)
::
LDRB
,
INST_T32
(
LDR_LIT
)
::
Sign
,
rt
,
label
)));
}
void
AssemblerA32
::
Ldrsh
(
RegisterA32
&
rt
,
Label
*
label
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
LDR_LIT
)(
INST_T32
(
LDR_LIT
)
::
LDRH
,
INST_T32
(
LDR_LIT
)
::
Sign
,
rt
,
label
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
LDR_LIT
)(
INST_T32
(
LDR_LIT
)
::
LDRH
,
INST_T32
(
LDR_LIT
)
::
Sign
,
rt
,
label
)));
}
void
AssemblerA32
::
Ldr
(
RegisterA32
&
rt
,
const
MemOperand
&
operand
)
{
if
(
operand
.
addr_mode
==
Offset
&&
operand
.
offset
>=
0
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
LDR_UIMM
)(
rt
,
*
operand
.
rn
,
operand
.
addr_mode
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
LDR_UIMM
)(
rt
,
*
operand
.
rn
,
operand
.
addr_mode
)));
}
else
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
LDR_IMM
)(
INST_T32
(
LDR_IMM
)
::
LDR
,
rt
,
operand
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
LDR_IMM
)(
INST_T32
(
LDR_IMM
)
::
LDR
,
rt
,
operand
)));
}
}
void
AssemblerA32
::
Ldrb
(
RegisterA32
&
rt
,
const
MemOperand
&
operand
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
LDR_IMM
)(
INST_T32
(
LDR_IMM
)
::
LDRB
,
rt
,
operand
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
LDR_IMM
)(
INST_T32
(
LDR_IMM
)
::
LDRB
,
rt
,
operand
)));
}
void
AssemblerA32
::
Ldrh
(
RegisterA32
&
rt
,
const
MemOperand
&
operand
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
LDR_IMM
)(
INST_T32
(
LDR_IMM
)
::
LDRH
,
rt
,
operand
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
LDR_IMM
)(
INST_T32
(
LDR_IMM
)
::
LDRH
,
rt
,
operand
)));
}
void
AssemblerA32
::
Ldrsb
(
RegisterA32
&
rt
,
const
MemOperand
&
operand
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
LDR_IMM
)(
INST_T32
(
LDR_IMM
)
::
LDRSB
,
rt
,
operand
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
LDR_IMM
)(
INST_T32
(
LDR_IMM
)
::
LDRSB
,
rt
,
operand
)));
}
void
AssemblerA32
::
Ldrsh
(
RegisterA32
&
rt
,
const
MemOperand
&
operand
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
LDR_IMM
)(
INST_T32
(
LDR_IMM
)
::
LDRSH
,
rt
,
operand
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
LDR_IMM
)(
INST_T32
(
LDR_IMM
)
::
LDRSH
,
rt
,
operand
)));
}
void
AssemblerA32
::
B
(
Label
*
label
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T16
(
B
)(
label
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T16
(
B
)(
label
)));
}
void
AssemblerA32
::
Bl
(
Label
*
label
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
B32
)(
INST_T32
(
B32
)
::
BL
,
INST_T32
(
B32
)
::
arm
,
label
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
B32
)(
INST_T32
(
B32
)
::
BL
,
INST_T32
(
B32
)
::
arm
,
label
)));
}
void
AssemblerA32
::
Blx
(
Label
*
label
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
B32
)(
INST_T32
(
B32
)
::
BL
,
INST_T32
(
B32
)
::
thumb
,
label
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
B32
)(
INST_T32
(
B32
)
::
BL
,
INST_T32
(
B32
)
::
thumb
,
label
)));
}
void
AssemblerA32
::
Bx
(
Label
*
label
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T32
(
B32
)(
INST_T32
(
B32
)
::
B
,
INST_T32
(
B32
)
::
thumb
,
label
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T32
(
B32
)(
INST_T32
(
B32
)
::
B
,
INST_T32
(
B32
)
::
thumb
,
label
)));
}
void
AssemblerA32
::
Mov
(
RegisterA32
&
rd
,
RegisterA32
&
rm
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T16
(
MOV_REG
)(
rd
,
rm
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T16
(
MOV_REG
)(
rd
,
rm
)));
}
void
AssemblerA32
::
Bx
(
RegisterA32
&
rm
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T16
(
BX_BLX
)(
INST_T16
(
BX_BLX
)
::
BX
,
rm
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T16
(
BX_BLX
)(
INST_T16
(
BX_BLX
)
::
BX
,
rm
)));
}
void
AssemblerA32
::
Blx
(
RegisterA32
&
rm
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T16
(
BX_BLX
)(
INST_T16
(
BX_BLX
)
::
BLX
,
rm
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T16
(
BX_BLX
)(
INST_T16
(
BX_BLX
)
::
BLX
,
rm
)));
}
void
AssemblerA32
::
B
(
Condition
condition
,
Label
*
label
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T16
(
B_COND
)(
condition
,
label
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T16
(
B_COND
)(
condition
,
label
)));
}
void
AssemblerA32
::
Add
(
RegisterA32
&
rdn
,
U8
imm8
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T16
(
ADD_IMM_RDN
)(
&
rdn
,
imm8
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T16
(
ADD_IMM_RDN
)(
&
rdn
,
imm8
)));
}
void
AssemblerA32
::
Add
(
RegisterA32
&
rd
,
RegisterA32
&
rn
,
RegisterA32
&
rm
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T16
(
ADD_REG
)(
&
rd
,
&
rn
,
&
rm
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T16
(
ADD_REG
)(
&
rd
,
&
rn
,
&
rm
)));
}
void
AssemblerA32
::
Cmp
(
RegisterA32
&
rd
,
RegisterA32
&
rn
)
{
if
(
rd
.
Code
()
<
8
&&
rn
.
Code
()
<
8
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T16
(
CMP_REG
)(
rd
,
rn
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T16
(
CMP_REG
)(
rd
,
rn
)));
}
else
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T16
(
CMP_REG_EXT
)(
rd
,
rn
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T16
(
CMP_REG_EXT
)(
rd
,
rn
)));
}
}
void
AssemblerA32
::
Pop
(
RegisterA32
&
rt
)
{
if
(
rt
.
Code
()
<
8
||
rt
==
PC
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T16
(
POP
)(
RegisterList
(
rt
))));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T16
(
POP
)(
RegisterList
(
rt
))));
}
else
{
throw
ErrorCodeException
(
"error pop inst"
);
}
...
...
@@ -163,14 +163,14 @@ void AssemblerA32::Pop(RegisterA32 &rt) {
void
AssemblerA32
::
Push
(
RegisterA32
&
rt
)
{
if
(
rt
.
Code
()
<
8
||
rt
==
PC
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T16
(
PUSH
)(
RegisterList
(
rt
))));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T16
(
PUSH
)(
RegisterList
(
rt
))));
}
else
{
throw
ErrorCodeException
(
"error pop inst"
);
}
}
void
AssemblerA32
::
Adr
(
RegisterA32
&
rd
,
Label
*
label
)
{
Emit
(
reinterpret_cast
<
Unit
<
Base
>
*>
(
new
INST_T16
(
ADR
)(
rd
,
label
)));
Emit
(
reinterpret_cast
<
BaseUnit
*>
(
new
INST_T16
(
ADR
)(
rd
,
label
)));
}
void
AssemblerA32
::
Nop16
()
{
...
...
nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.h
View file @
a1112fb6
...
...
@@ -11,7 +11,7 @@
#include "inst_t32.h"
#define ALIGN_FOR_LDR \
if ((Addr) __
g
etPC() % 4 != 0) { \
if ((Addr) __
G
etPC() % 4 != 0) { \
__ Nop16(); \
}
...
...
@@ -24,10 +24,10 @@ namespace SandHook {
public
:
AssemblerA32
(
CodeBuffer
*
codeBuffer
);
void
a
llocBufferFirst
(
U32
size
);
void
*
g
etStartPC
();
void
*
g
etPC
();
void
*
f
inish
();
void
A
llocBufferFirst
(
U32
size
);
void
*
G
etStartPC
();
void
*
G
etPC
();
void
*
F
inish
();
void
Emit
(
U32
data32
);
void
Emit
(
U16
data16
);
...
...
@@ -78,7 +78,7 @@ namespace SandHook {
void
Nop16
();
public
:
CodeContainer
code
C
ontainer
=
CodeContainer
(
nullptr
);
CodeContainer
code
_c
ontainer
=
CodeContainer
(
nullptr
);
};
}
}
...
...
nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp
View file @
a1112fb6
...
...
@@ -20,9 +20,9 @@ using namespace SandHook::RegistersA32;
void
*
InlineHookArm32Android
::
Hook
(
void
*
origin
,
void
*
replace
)
{
AutoLock
lock
(
hookLock
);
void
*
origin
C
ode
;
void
*
origin
_c
ode
;
if
(
IsThumbCode
((
Addr
)
origin
))
{
origin
C
ode
=
GetThumbCodeAddress
(
origin
);
origin
_c
ode
=
GetThumbCodeAddress
(
origin
);
}
else
{
LOGE
(
"hook %d error!, only support thumb2 now!"
,
origin
);
return
nullptr
;
...
...
@@ -31,14 +31,14 @@ void *InlineHookArm32Android::Hook(void *origin, void *replace) {
bool
changeMode
=
IsThumbCode
((
Addr
)
origin
)
!=
IsThumbCode
((
Addr
)
replace
);
void
*
backup
=
nullptr
;
AssemblerA32
assembler
Backup
(
backupB
uffer
);
AssemblerA32
assembler
_backup
(
backup_b
uffer
);
StaticCodeBuffer
inline
Buffer
=
StaticCodeBuffer
(
reinterpret_cast
<
Addr
>
(
originC
ode
));
AssemblerA32
assembler
Inline
(
&
inlineB
uffer
);
CodeContainer
*
code
ContainerInline
=
&
assemblerInline
.
codeC
ontainer
;
StaticCodeBuffer
inline
_buffer
=
StaticCodeBuffer
(
reinterpret_cast
<
Addr
>
(
origin_c
ode
));
AssemblerA32
assembler
_inline
(
&
inline_b
uffer
);
CodeContainer
*
code
_container_inline
=
&
assembler_inline
.
code_c
ontainer
;
//build inline trampoline
#define __ assembler
I
nline.
#define __ assembler
_i
nline.
if
(
!
changeMode
)
{
Label
*
target_addr_label
=
new
Label
();
ALIGN_FOR_LDR
...
...
@@ -53,20 +53,20 @@ void *InlineHookArm32Android::Hook(void *origin, void *replace) {
#undef __
//build backup method
CodeRelocateA32
relocate
=
CodeRelocateA32
(
assembler
B
ackup
);
backup
=
relocate
.
relocate
(
origin
,
codeContainerI
nline
->
size
(),
nullptr
);
#define __ assembler
B
ackup.
CodeRelocateA32
relocate
=
CodeRelocateA32
(
assembler
_b
ackup
);
backup
=
relocate
.
Relocate
(
origin
,
code_container_i
nline
->
size
(),
nullptr
);
#define __ assembler
_b
ackup.
Label
*
origin_addr_label
=
new
Label
();
ALIGN_FOR_LDR
__
Ldr
(
PC
,
origin_addr_label
);
__
Emit
(
origin_addr_label
);
__
Emit
((
Addr
)
GetThumbPC
(
reinterpret_cast
<
void
*>
(
reinterpret_cast
<
Addr
>
(
origin
Code
)
+
relocate
.
curO
ffset
)));
__
f
inish
();
reinterpret_cast
<
void
*>
(
reinterpret_cast
<
Addr
>
(
origin
_code
)
+
relocate
.
cur_o
ffset
)));
__
F
inish
();
#undef __
//commit inline trampoline
assembler
Inline
.
f
inish
();
assembler
_inline
.
F
inish
();
return
GetThumbPC
(
backup
);
}
...
...
@@ -77,43 +77,42 @@ IMPORT_LABEL(origin_addr_s, Addr)
bool
InlineHookArm32Android
::
BreakPoint
(
void
*
origin
,
void
(
*
callback
)(
REG
*
))
{
AutoLock
lock
(
hookLock
);
void
*
origin
C
ode
;
void
*
origin
_c
ode
;
if
(
IsThumbCode
((
Addr
)
origin
))
{
origin
C
ode
=
GetThumbCodeAddress
(
origin
);
origin
_c
ode
=
GetThumbCodeAddress
(
origin
);
}
else
{
LOGE
(
"hook %d error!, only support thumb2 now!"
,
origin
);
return
false
;
}
bool
change
M
ode
=
IsThumbCode
((
Addr
)
origin
)
!=
IsThumbCode
((
Addr
)
callback
);
bool
change
_m
ode
=
IsThumbCode
((
Addr
)
origin
)
!=
IsThumbCode
((
Addr
)
callback
);
void
*
backup
=
nullptr
;
AssemblerA32
assembler
Backup
(
backupB
uffer
);
AssemblerA32
assembler
_backup
(
backup_b
uffer
);
StaticCodeBuffer
inline
Buffer
=
StaticCodeBuffer
(
reinterpret_cast
<
Addr
>
(
originC
ode
));
AssemblerA32
assembler
Inline
(
&
inlineB
uffer
);
StaticCodeBuffer
inline
_buffer
=
StaticCodeBuffer
(
reinterpret_cast
<
Addr
>
(
origin_c
ode
));
AssemblerA32
assembler
_inline
(
&
inline_b
uffer
);
//build backup method
CodeRelocateA32
relocate
=
CodeRelocateA32
(
assembler
B
ackup
);
backup
=
relocate
.
relocate
(
origin
,
changeM
ode
?
(
4
*
2
+
2
)
:
(
4
*
2
),
nullptr
);
#define __ assembler
B
ackup.
CodeRelocateA32
relocate
=
CodeRelocateA32
(
assembler
_b
ackup
);
backup
=
relocate
.
Relocate
(
origin
,
change_m
ode
?
(
4
*
2
+
2
)
:
(
4
*
2
),
nullptr
);
#define __ assembler
_b
ackup.
Label
*
origin_addr_label
=
new
Label
();
ALIGN_FOR_LDR
__
Ldr
(
PC
,
origin_addr_label
);
__
Emit
(
origin_addr_label
);
__
Emit
((
Addr
)
GetThumbPC
(
reinterpret_cast
<
void
*>
(
reinterpret_cast
<
Addr
>
(
originCode
)
+
relocate
.
curOffset
)));
__
finish
();
__
Emit
((
Addr
)
GetThumbPC
(
reinterpret_cast
<
void
*>
(
reinterpret_cast
<
Addr
>
(
origin_code
)
+
relocate
.
cur_offset
)));
__
Finish
();
#undef __
//build trampoline
origin_addr_s
=
(
Addr
)
GetThumbPC
(
backup
);
callback_addr_s
=
(
Addr
)
callback
;
void
*
trampoline
=
backup
B
uffer
->
copy
((
void
*
)
BP_SHELLCODE
,
SHELLCODE_LEN
(
BP_SHELLCODE
));
void
*
trampoline
=
backup
_b
uffer
->
copy
((
void
*
)
BP_SHELLCODE
,
SHELLCODE_LEN
(
BP_SHELLCODE
));
//build inline trampoline
#define __ assembler
I
nline.
if
(
!
change
M
ode
)
{
#define __ assembler
_i
nline.
if
(
!
change
_m
ode
)
{
Label
*
target_addr_label
=
new
Label
();
ALIGN_FOR_LDR
__
Ldr
(
PC
,
target_addr_label
);
...
...
@@ -123,7 +122,7 @@ bool InlineHookArm32Android::BreakPoint(void *origin, void (*callback)(REG *)) {
__
Mov
(
IP
,
(
Addr
)
trampoline
);
__
Bx
(
IP
);
}
__
f
inish
();
__
F
inish
();
#undef __
return
true
;
...
...
nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp
View file @
a1112fb6
...
...
@@ -20,42 +20,42 @@ case ENUM_VALUE(InstCode##T, InstCode##T::X): \
relocate_##T##_##X(reinterpret_cast<INST_##T(X)*>(instruction), toPc); \
break;
CodeRelocateA32
::
CodeRelocateA32
(
AssemblerA32
&
assembler
)
:
CodeRelocate
(
assembler
.
code
C
ontainer
)
{
CodeRelocateA32
::
CodeRelocateA32
(
AssemblerA32
&
assembler
)
:
CodeRelocate
(
assembler
.
code
_c
ontainer
)
{
this
->
assemblerA32
=
&
assembler
;
}
bool
CodeRelocateA32
::
Visit
(
BaseUnit
*
unit
,
void
*
pc
)
{
relocate
(
reinterpret_cast
<
BaseInst
*>
(
unit
),
__
g
etPC
());
cur
O
ffset
+=
unit
->
Size
();
Relocate
(
reinterpret_cast
<
BaseInst
*>
(
unit
),
__
G
etPC
());
cur
_o
ffset
+=
unit
->
Size
();
if
(
unit
->
RefCount
()
==
0
)
{
delete
unit
;
}
return
true
;
}
void
*
CodeRelocateA32
::
r
elocate
(
void
*
startPc
,
Addr
len
,
void
*
toPc
=
nullptr
)
throw
(
ErrorCodeException
)
{
AutoLock
autoLock
(
relocate
L
ock
);
start
A
ddr
=
reinterpret_cast
<
Addr
>
(
startPc
);
if
(
IsThumbCode
(
start
A
ddr
))
{
start
A
ddr
=
reinterpret_cast
<
Addr
>
(
GetThumbCodeAddress
(
startPc
));
void
*
CodeRelocateA32
::
R
elocate
(
void
*
startPc
,
Addr
len
,
void
*
toPc
=
nullptr
)
throw
(
ErrorCodeException
)
{
AutoLock
autoLock
(
relocate
_l
ock
);
start
_a
ddr
=
reinterpret_cast
<
Addr
>
(
startPc
);
if
(
IsThumbCode
(
start
_a
ddr
))
{
start
_a
ddr
=
reinterpret_cast
<
Addr
>
(
GetThumbCodeAddress
(
startPc
));
}
length
=
len
;
cur
O
ffset
=
0
;
__
a
llocBufferFirst
(
static_cast
<
U32
>
(
len
*
8
));
void
*
curPc
=
__
g
etPC
();
cur
_o
ffset
=
0
;
__
A
llocBufferFirst
(
static_cast
<
U32
>
(
len
*
8
));
void
*
curPc
=
__
G
etPC
();
if
(
toPc
==
nullptr
)
{
Disassembler
::
g
et
()
->
Disassembler
(
startPc
,
len
,
*
this
,
true
);
Disassembler
::
G
et
()
->
Disassembler
(
startPc
,
len
,
*
this
,
true
);
}
else
{
//TODO
}
return
curPc
;
}
void
*
CodeRelocateA32
::
r
elocate
(
BaseInst
*
instruction
,
void
*
toPc
)
throw
(
ErrorCodeException
)
{
void
*
curPc
=
__
g
etPC
();
void
*
CodeRelocateA32
::
R
elocate
(
BaseInst
*
instruction
,
void
*
toPc
)
throw
(
ErrorCodeException
)
{
void
*
curPc
=
__
G
etPC
();
//insert later AddBind labels
__
Emit
(
getLaterBindLabel
(
curO
ffset
));
__
Emit
(
GetLaterBindLabel
(
cur_o
ffset
));
if
(
!
instruction
->
PcRelate
())
{
__
Emit
(
instruction
);
...
...
@@ -94,8 +94,8 @@ void* CodeRelocateA32::relocate(BaseInst *instruction, void *toPc) throw(ErrorCo
IMPL_RELOCATE
(
T16
,
B_COND
)
{
if
(
i
nRelocateRange
(
CODE_OFFSET
(
inst
),
sizeof
(
InstT16
)))
{
__
B
(
inst
->
condition
,
getLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
curO
ffset
));
if
(
I
nRelocateRange
(
CODE_OFFSET
(
inst
),
sizeof
(
InstT16
)))
{
__
B
(
inst
->
condition
,
GetLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
cur_o
ffset
));
return
;
}
...
...
@@ -125,8 +125,8 @@ IMPL_RELOCATE(T16, B_COND) {
IMPL_RELOCATE
(
T16
,
B
)
{
if
(
i
nRelocateRange
(
CODE_OFFSET
(
inst
),
sizeof
(
InstT16
)))
{
__
B
(
getLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
curO
ffset
));
if
(
I
nRelocateRange
(
CODE_OFFSET
(
inst
),
sizeof
(
InstT16
)))
{
__
B
(
GetLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
cur_o
ffset
));
return
;
}
...
...
@@ -149,8 +149,8 @@ IMPL_RELOCATE(T16, CBZ_CBNZ) {
inst
->
Ref
();
if
(
i
nRelocateRange
(
CODE_OFFSET
(
inst
),
sizeof
(
InstT16
)))
{
inst
->
BindLabel
(
getLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
curO
ffset
));
if
(
I
nRelocateRange
(
CODE_OFFSET
(
inst
),
sizeof
(
InstT16
)))
{
inst
->
BindLabel
(
GetLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
cur_o
ffset
));
__
Emit
(
reinterpret_cast
<
BaseInst
*>
(
inst
));
return
;
}
...
...
@@ -175,9 +175,9 @@ IMPL_RELOCATE(T16, CBZ_CBNZ) {
IMPL_RELOCATE
(
T16
,
LDR_LIT
)
{
if
(
i
nRelocateRange
(
CODE_OFFSET
(
inst
),
inst
->
rt
->
Wide
()))
{
if
(
I
nRelocateRange
(
CODE_OFFSET
(
inst
),
inst
->
rt
->
Wide
()))
{
inst
->
Ref
();
inst
->
BindLabel
(
getLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
curO
ffset
));
inst
->
BindLabel
(
GetLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
cur_o
ffset
));
__
Emit
(
reinterpret_cast
<
BaseInst
*>
(
inst
));
return
;
}
...
...
@@ -190,9 +190,9 @@ IMPL_RELOCATE(T16, LDR_LIT) {
IMPL_RELOCATE
(
T16
,
ADR
)
{
if
(
i
nRelocateRange
(
CODE_OFFSET
(
inst
),
inst
->
rd
->
Wide
()))
{
if
(
I
nRelocateRange
(
CODE_OFFSET
(
inst
),
inst
->
rd
->
Wide
()))
{
inst
->
Ref
();
inst
->
BindLabel
(
getLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
curO
ffset
));
inst
->
BindLabel
(
GetLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
cur_o
ffset
));
__
Emit
(
reinterpret_cast
<
BaseInst
*>
(
inst
));
return
;
}
...
...
@@ -222,9 +222,9 @@ IMPL_RELOCATE(T16, ADD_REG_RDN) {
IMPL_RELOCATE
(
T32
,
B32
)
{
if
(
i
nRelocateRange
(
CODE_OFFSET
(
inst
),
sizeof
(
InstT16
)))
{
if
(
I
nRelocateRange
(
CODE_OFFSET
(
inst
),
sizeof
(
InstT16
)))
{
inst
->
Ref
();
inst
->
BindLabel
(
getLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
curO
ffset
));
inst
->
BindLabel
(
GetLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
cur_o
ffset
));
__
Emit
(
reinterpret_cast
<
BaseInst
*>
(
inst
));
return
;
}
...
...
@@ -247,9 +247,9 @@ IMPL_RELOCATE(T32, B32) {
IMPL_RELOCATE
(
T32
,
LDR_LIT
)
{
if
(
i
nRelocateRange
(
CODE_OFFSET
(
inst
),
sizeof
(
Addr
)))
{
if
(
I
nRelocateRange
(
CODE_OFFSET
(
inst
),
sizeof
(
Addr
)))
{
inst
->
Ref
();
inst
->
BindLabel
(
getLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
curO
ffset
));
inst
->
BindLabel
(
GetLaterBindLabel
(
CODE_OFFSET
(
inst
)
+
cur_o
ffset
));
__
Emit
(
reinterpret_cast
<
BaseInst
*>
(
inst
));
return
;
}
...
...
nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h
View file @
a1112fb6
...
...
@@ -22,9 +22,9 @@ namespace SandHook {
public
:
CodeRelocateA32
(
AssemblerA32
&
assembler
);
void
*
r
elocate
(
BaseInst
*
instruction
,
void
*
toPc
)
throw
(
ErrorCodeException
)
override
;
void
*
R
elocate
(
BaseInst
*
instruction
,
void
*
toPc
)
throw
(
ErrorCodeException
)
override
;
void
*
r
elocate
(
void
*
startPc
,
Addr
len
,
void
*
toPc
)
throw
(
ErrorCodeException
)
override
;
void
*
R
elocate
(
void
*
startPc
,
Addr
len
,
void
*
toPc
)
throw
(
ErrorCodeException
)
override
;
bool
Visit
(
BaseUnit
*
unit
,
void
*
pc
)
override
;
...
...
nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp
View file @
a1112fb6
This diff is collapsed.
Click to expand it.
nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h
View file @
a1112fb6
...
...
@@ -84,7 +84,7 @@ namespace SandHook {
void
Subs
(
RegisterA64
&
rd
,
const
Operand
&
operand
);
void
Msr
(
SystemRegister
&
sysReg
,
RegisterA64
&
rt
);
void
Mrs
(
SystemRegister
&
sys
R
eg
,
RegisterA64
&
rt
);
void
Mrs
(
SystemRegister
&
sys
_r
eg
,
RegisterA64
&
rt
);
void
Mov
(
RegisterA64
&
rd
,
RegisterA64
&
rt
);
...
...
@@ -94,7 +94,7 @@ namespace SandHook {
public
:
CodeContainer
code
C
ontainer
=
CodeContainer
(
nullptr
);
CodeContainer
code
_c
ontainer
=
CodeContainer
(
nullptr
);
};
}
...
...
nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp
View file @
a1112fb6
...
...
@@ -19,9 +19,9 @@ Arm64Decoder* Arm64Decoder::instant = new Arm64Decoder();
void
Arm64Decoder
::
Disassembler
(
void
*
codeStart
,
Addr
codeLen
,
InstVisitor
&
visitor
,
bool
onlyPcRelInst
)
{
InstA64
*
pc
=
reinterpret_cast
<
InstA64
*>
(
codeStart
);
Addr
end
A
ddr
=
(
Addr
)
codeStart
+
codeLen
;
Addr
end
_a
ddr
=
(
Addr
)
codeStart
+
codeLen
;
Unit
<
Base
>*
unit
=
nullptr
;
while
((
Addr
)
pc
<
end
A
ddr
)
{
while
((
Addr
)
pc
<
end
_a
ddr
)
{
// pc relate insts
CASE
(
B_BL
)
CASE
(
B_COND
)
...
...
nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp
View file @
a1112fb6
...
...
@@ -16,17 +16,17 @@ using namespace SandHook::Utils;
#include "code_relocate_arm64.h"
using
namespace
SandHook
::
RegistersA64
;
void
*
InlineHookArm64Android
::
Hook
(
void
*
origin
,
void
*
replace
)
{
AutoLock
lock
(
hook
L
ock
);
AutoLock
lock
(
hook
_l
ock
);
void
*
backup
=
nullptr
;
AssemblerA64
assembler
Backup
(
backupB
uffer
);
AssemblerA64
assembler
_backup
(
backup_b
uffer
);
StaticCodeBuffer
inline
B
uffer
=
StaticCodeBuffer
(
reinterpret_cast
<
Addr
>
(
origin
));
AssemblerA64
assembler
Inline
(
&
inlineB
uffer
);
CodeContainer
*
code
ContainerInline
=
&
assemblerInline
.
codeC
ontainer
;
StaticCodeBuffer
inline
_b
uffer
=
StaticCodeBuffer
(
reinterpret_cast
<
Addr
>
(
origin
));
AssemblerA64
assembler
_inline
(
&
inline_b
uffer
);
CodeContainer
*
code
_container_inline
=
&
assembler_inline
.
code_c
ontainer
;
//build inline trampoline
#define __ assembler
I
nline.
#define __ assembler
_i
nline.
Label
*
target_addr_label
=
new
Label
();
__
Ldr
(
IP1
,
target_addr_label
);
__
Br
(
IP1
);
...
...
@@ -35,37 +35,37 @@ void *InlineHookArm64Android::Hook(void *origin, void *replace) {
#undef __
//build backup method
CodeRelocateA64
relocate
=
CodeRelocateA64
(
assembler
B
ackup
);
backup
=
relocate
.
relocate
(
origin
,
codeContainerI
nline
->
size
(),
nullptr
);
#define __ assembler
B
ackup.
CodeRelocateA64
relocate
=
CodeRelocateA64
(
assembler
_b
ackup
);
backup
=
relocate
.
Relocate
(
origin
,
code_container_i
nline
->
size
(),
nullptr
);
#define __ assembler
_b
ackup.
Label
*
origin_addr_label
=
new
Label
();
__
Ldr
(
IP1
,
origin_addr_label
);
__
Br
(
IP1
);
__
Emit
(
origin_addr_label
);
__
Emit
((
Addr
)
origin
+
code
ContainerI
nline
->
size
());
__
Emit
((
Addr
)
origin
+
code
_container_i
nline
->
size
());
__
Finish
();
#undef __
//commit inline trampoline
assembler
I
nline
.
Finish
();
assembler
_i
nline
.
Finish
();
return
backup
;
}
bool
InlineHookArm64Android
::
BreakPoint
(
void
*
point
,
void
(
*
callback
)(
REG
regs
[]))
{
AutoLock
lock
(
hook
L
ock
);
AutoLock
lock
(
hook
_l
ock
);
void
*
backup
=
nullptr
;
AssemblerA64
assembler
Backup
(
backupB
uffer
);
AssemblerA64
assembler
Trampoline
(
backupB
uffer
);
AssemblerA64
assembler
_backup
(
backup_b
uffer
);
AssemblerA64
assembler
_trampoline
(
backup_b
uffer
);
StaticCodeBuffer
inline
B
uffer
=
StaticCodeBuffer
(
reinterpret_cast
<
Addr
>
(
point
));
AssemblerA64
assembler
Inline
(
&
inlineB
uffer
);
StaticCodeBuffer
inline
_b
uffer
=
StaticCodeBuffer
(
reinterpret_cast
<
Addr
>
(
point
));
AssemblerA64
assembler
_inline
(
&
inline_b
uffer
);
//build backup inst
CodeRelocateA64
relocate
=
CodeRelocateA64
(
assembler
B
ackup
);
backup
=
relocate
.
r
elocate
(
point
,
4
*
4
,
nullptr
);
#define __ assembler
B
ackup.
CodeRelocateA64
relocate
=
CodeRelocateA64
(
assembler
_b
ackup
);
backup
=
relocate
.
R
elocate
(
point
,
4
*
4
,
nullptr
);
#define __ assembler
_b
ackup.
Label
*
origin_addr_label
=
new
Label
();
__
Ldr
(
IP1
,
origin_addr_label
);
__
Br
(
IP1
);
...
...
@@ -76,7 +76,7 @@ bool InlineHookArm64Android::BreakPoint(void *point, void (*callback)(REG regs[]
//build shell code
#define __ assembler
T
rampoline.
#define __ assembler
_t
rampoline.
//backup NZCV
__
Sub
(
SP
,
Operand
(
&
SP
,
0x20
));
...
...
@@ -118,14 +118,14 @@ bool InlineHookArm64Android::BreakPoint(void *point, void (*callback)(REG regs[]
#undef __
void
*
second
Trampoline
=
assemblerT
rampoline
.
GetStartPC
();
void
*
second
_trampoline
=
assembler_t
rampoline
.
GetStartPC
();
//build inline trampoline
#define __ assembler
I
nline.
#define __ assembler
_i
nline.
Label
*
target_addr_label
=
new
Label
();
__
Ldr
(
IP1
,
target_addr_label
);
__
Br
(
IP1
);
__
Emit
(
target_addr_label
);
__
Emit
((
Addr
)
second
T
rampoline
);
__
Emit
((
Addr
)
second
_t
rampoline
);
__
Finish
();
#undef __
...
...
nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp
View file @
a1112fb6
...
...
@@ -20,39 +20,39 @@ case ENUM_VALUE(InstCodeA64, InstCodeA64::X): \
relocate_##X(reinterpret_cast<INST_A64(X)*>(instruction), toPc); \
break;
CodeRelocateA64
::
CodeRelocateA64
(
AssemblerA64
&
assembler
)
:
CodeRelocate
(
assembler
.
code
C
ontainer
)
{
CodeRelocateA64
::
CodeRelocateA64
(
AssemblerA64
&
assembler
)
:
CodeRelocate
(
assembler
.
code
_c
ontainer
)
{
assemblerA64
=
&
assembler
;
}
bool
CodeRelocateA64
::
Visit
(
Unit
<
Base
>
*
unit
,
void
*
pc
)
{
r
elocate
(
reinterpret_cast
<
BaseInst
*>
(
unit
),
__
GetPC
());
cur
O
ffset
+=
unit
->
Size
();
R
elocate
(
reinterpret_cast
<
BaseInst
*>
(
unit
),
__
GetPC
());
cur
_o
ffset
+=
unit
->
Size
();
if
(
unit
->
RefCount
()
==
0
)
{
delete
unit
;
}
return
true
;
}
void
*
CodeRelocateA64
::
r
elocate
(
void
*
startPc
,
Addr
len
,
void
*
toPc
=
nullptr
)
throw
(
ErrorCodeException
)
{
AutoLock
autoLock
(
relocate
L
ock
);
start
A
ddr
=
reinterpret_cast
<
Addr
>
(
startPc
);
void
*
CodeRelocateA64
::
R
elocate
(
void
*
startPc
,
Addr
len
,
void
*
toPc
=
nullptr
)
throw
(
ErrorCodeException
)
{
AutoLock
autoLock
(
relocate
_l
ock
);
start
_a
ddr
=
reinterpret_cast
<
Addr
>
(
startPc
);
length
=
len
;
cur
O
ffset
=
0
;
cur
_o
ffset
=
0
;
__
AllocBufferFirst
(
static_cast
<
U32
>
(
len
*
8
));
void
*
curPc
=
__
GetPC
();
if
(
toPc
==
nullptr
)
{
Disassembler
::
g
et
()
->
Disassembler
(
startPc
,
len
,
*
this
,
true
);
Disassembler
::
G
et
()
->
Disassembler
(
startPc
,
len
,
*
this
,
true
);
}
else
{
//TODO
}
return
curPc
;
}
void
*
CodeRelocateA64
::
r
elocate
(
BaseInst
*
instruction
,
void
*
toPc
)
throw
(
ErrorCodeException
)
{
void
*
CodeRelocateA64
::
R
elocate
(
BaseInst
*
instruction
,
void
*
toPc
)
throw
(
ErrorCodeException
)
{
void
*
curPc
=
__
GetPC
();
//insert later AddBind labels
__
Emit
(
getLaterBindLabel
(
curO
ffset
));
__
Emit
(
GetLaterBindLabel
(
cur_o
ffset
));
if
(
!
instruction
->
PcRelate
())
{
__
Emit
(
instruction
);
...
...
@@ -75,9 +75,9 @@ void* CodeRelocateA64::relocate(BaseInst *instruction, void *toPc) throw(ErrorCo
IMPL_RELOCATE
(
B_BL
)
{
if
(
i
nRelocateRange
(
inst
->
offset
,
sizeof
(
InstA64
)))
{
if
(
I
nRelocateRange
(
inst
->
offset
,
sizeof
(
InstA64
)))
{
inst
->
Ref
();
inst
->
BindLabel
(
getLaterBindLabel
(
inst
->
offset
+
curO
ffset
));
inst
->
BindLabel
(
GetLaterBindLabel
(
inst
->
offset
+
cur_o
ffset
));
__
Emit
(
reinterpret_cast
<
BaseInst
*>
(
inst
));
return
;
}
...
...
@@ -97,9 +97,9 @@ IMPL_RELOCATE(B_BL) {
IMPL_RELOCATE
(
B_COND
)
{
if
(
i
nRelocateRange
(
inst
->
offset
,
sizeof
(
InstA64
)))
{
if
(
I
nRelocateRange
(
inst
->
offset
,
sizeof
(
InstA64
)))
{
inst
->
Ref
();
inst
->
BindLabel
(
getLaterBindLabel
(
inst
->
offset
+
curO
ffset
));
inst
->
BindLabel
(
GetLaterBindLabel
(
inst
->
offset
+
cur_o
ffset
));
__
Emit
(
reinterpret_cast
<
BaseInst
*>
(
inst
));
return
;
}
...
...
@@ -121,9 +121,9 @@ IMPL_RELOCATE(B_COND) {
IMPL_RELOCATE
(
TBZ_TBNZ
)
{
if
(
i
nRelocateRange
(
inst
->
offset
,
sizeof
(
InstA64
)))
{
if
(
I
nRelocateRange
(
inst
->
offset
,
sizeof
(
InstA64
)))
{
inst
->
Ref
();
inst
->
BindLabel
(
getLaterBindLabel
(
inst
->
offset
+
curO
ffset
));
inst
->
BindLabel
(
GetLaterBindLabel
(
inst
->
offset
+
cur_o
ffset
));
__
Emit
(
reinterpret_cast
<
BaseInst
*>
(
inst
));
return
;
}
...
...
@@ -149,9 +149,9 @@ IMPL_RELOCATE(TBZ_TBNZ) {
IMPL_RELOCATE
(
CBZ_CBNZ
)
{
if
(
i
nRelocateRange
(
inst
->
offset
,
sizeof
(
InstA64
)))
{
if
(
I
nRelocateRange
(
inst
->
offset
,
sizeof
(
InstA64
)))
{
inst
->
Ref
();
inst
->
BindLabel
(
getLaterBindLabel
(
inst
->
offset
+
curO
ffset
));
inst
->
BindLabel
(
GetLaterBindLabel
(
inst
->
offset
+
cur_o
ffset
));
__
Emit
(
reinterpret_cast
<
BaseInst
*>
(
inst
));
return
;
}
...
...
@@ -181,9 +181,9 @@ IMPL_RELOCATE(LDR_LIT) {
XRegister
*
rtX
=
XReg
(
inst
->
rt
->
Code
());
WRegister
*
rtW
=
WReg
(
inst
->
rt
->
Code
());
if
(
i
nRelocateRange
(
inst
->
offset
,
sizeof
(
Addr
)))
{
if
(
I
nRelocateRange
(
inst
->
offset
,
sizeof
(
Addr
)))
{
inst
->
Ref
();
inst
->
BindLabel
(
getLaterBindLabel
(
inst
->
offset
+
curO
ffset
));
inst
->
BindLabel
(
GetLaterBindLabel
(
inst
->
offset
+
cur_o
ffset
));
__
Emit
(
reinterpret_cast
<
BaseInst
*>
(
inst
));
return
;
}
...
...
nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h
View file @
a1112fb6
...
...
@@ -22,9 +22,9 @@ namespace SandHook {
public
:
CodeRelocateA64
(
AssemblerA64
&
assembler
);
void
*
r
elocate
(
BaseInst
*
instruction
,
void
*
toPc
)
throw
(
ErrorCodeException
)
override
;
void
*
R
elocate
(
BaseInst
*
instruction
,
void
*
toPc
)
throw
(
ErrorCodeException
)
override
;
void
*
r
elocate
(
void
*
startPc
,
Addr
len
,
void
*
toPc
)
throw
(
ErrorCodeException
)
override
;
void
*
R
elocate
(
void
*
startPc
,
Addr
len
,
void
*
toPc
)
throw
(
ErrorCodeException
)
override
;
bool
Visit
(
Unit
<
Base
>
*
unit
,
void
*
pc
)
override
;
...
...
nativehook/src/main/cpp/assembler/assembler.cpp
View file @
a1112fb6
...
...
@@ -31,9 +31,9 @@ void CodeContainer::commit() {
void
*
bufferStart
;
if
(
startPc
>
0
)
{
bufferStart
=
reinterpret_cast
<
void
*>
(
startPc
);
codeBuffer
->
r
esetLastBufferSize
(
bufferSize
);
codeBuffer
->
R
esetLastBufferSize
(
bufferSize
);
}
else
{
bufferStart
=
codeBuffer
->
g
etBuffer
(
bufferSize
);
bufferStart
=
codeBuffer
->
G
etBuffer
(
bufferSize
);
}
Addr
pcNow
=
reinterpret_cast
<
Addr
>
(
bufferStart
);
...
...
@@ -58,7 +58,7 @@ void CodeContainer::commit() {
}
//flush I cache
f
lushCache
(
reinterpret_cast
<
Addr
>
(
bufferStart
),
pcNow
-
reinterpret_cast
<
Addr
>
(
bufferStart
));
F
lushCache
(
reinterpret_cast
<
Addr
>
(
bufferStart
),
pcNow
-
reinterpret_cast
<
Addr
>
(
bufferStart
));
//Set pc
startPc
=
reinterpret_cast
<
Addr
>
(
bufferStart
);
...
...
@@ -67,7 +67,7 @@ void CodeContainer::commit() {
}
void
CodeContainer
::
allocBufferFirst
(
U32
size
)
{
startPc
=
reinterpret_cast
<
Addr
>
(
codeBuffer
->
g
etBuffer
(
size
));
startPc
=
reinterpret_cast
<
Addr
>
(
codeBuffer
->
G
etBuffer
(
size
));
curPc
=
startPc
;
}
...
...
nativehook/src/main/cpp/buffer/code_buffer.cpp
View file @
a1112fb6
...
...
@@ -11,31 +11,31 @@
using
namespace
SandHook
::
Assembler
;
using
namespace
SandHook
::
Utils
;
void
*
AndroidCodeBuffer
::
g
etBuffer
(
U32
size
)
{
AutoLock
autoLock
(
alloc
SpaceL
ock
);
void
*
AndroidCodeBuffer
::
G
etBuffer
(
U32
size
)
{
AutoLock
autoLock
(
alloc
_space_l
ock
);
void
*
mmapRes
;
Addr
exeSpace
=
0
;
if
(
execute
SpaceL
ist
.
size
()
==
0
)
{
if
(
execute
_space_l
ist
.
size
()
==
0
)
{
goto
label_alloc_new_space
;
}
else
if
(
execute
PageOffset
+
size
+
4
>
currentExecutePageS
ize
)
{
}
else
if
(
execute
_page_offset
+
size
+
4
>
current_execute_page_s
ize
)
{
goto
label_alloc_new_space
;
}
else
{
exeSpace
=
reinterpret_cast
<
Addr
>
(
execute
SpaceL
ist
.
back
());
exeSpace
=
reinterpret_cast
<
Addr
>
(
execute
_space_l
ist
.
back
());
//4 字节对齐
Addr
retSpace
=
RoundUp
(
exeSpace
+
execute
PageO
ffset
,
4
);
execute
PageO
ffset
=
retSpace
+
size
-
exeSpace
;
Addr
retSpace
=
RoundUp
(
exeSpace
+
execute
_page_o
ffset
,
4
);
execute
_page_o
ffset
=
retSpace
+
size
-
exeSpace
;
return
reinterpret_cast
<
void
*>
(
retSpace
);
}
label_alloc_new_space
:
current
ExecutePageS
ize
=
static_cast
<
U32
>
(
FIT
(
size
,
P_SIZE
));
mmapRes
=
mmap
(
NULL
,
current
ExecutePageS
ize
,
PROT_READ
|
PROT_WRITE
|
PROT_EXEC
,
current
_execute_page_s
ize
=
static_cast
<
U32
>
(
FIT
(
size
,
P_SIZE
));
mmapRes
=
mmap
(
NULL
,
current
_execute_page_s
ize
,
PROT_READ
|
PROT_WRITE
|
PROT_EXEC
,
MAP_ANON
|
MAP_PRIVATE
,
-
1
,
0
);
if
(
mmapRes
==
MAP_FAILED
)
{
return
0
;
}
memset
(
mmapRes
,
0
,
current
ExecutePageS
ize
);
execute
SpaceL
ist
.
push_back
(
mmapRes
);
execute
PageO
ffset
=
size
;
memset
(
mmapRes
,
0
,
current
_execute_page_s
ize
);
execute
_space_l
ist
.
push_back
(
mmapRes
);
execute
_page_o
ffset
=
size
;
return
mmapRes
;
}
...
...
@@ -43,24 +43,24 @@ AndroidCodeBuffer::AndroidCodeBuffer() {}
StaticCodeBuffer
::
StaticCodeBuffer
(
Addr
pc
)
:
pc
(
pc
)
{}
void
*
StaticCodeBuffer
::
g
etBuffer
(
U32
bufferSize
)
{
if
(
!
m
emUnprotect
(
pc
,
bufferSize
))
{
LOGE
(
"error
m
emUnprotect!"
);
void
*
StaticCodeBuffer
::
G
etBuffer
(
U32
bufferSize
)
{
if
(
!
M
emUnprotect
(
pc
,
bufferSize
))
{
LOGE
(
"error
M
emUnprotect!"
);
}
return
reinterpret_cast
<
void
*>
(
pc
);
}
void
AndroidRe
llocBufferUnsafe
::
r
esetLastBufferSize
(
U32
size
)
{
if
(
execute
PageOffset
+
(
size
-
lastAllocSize
)
<=
currentExecutePageS
ize
)
{
execute
PageOffset
+=
size
-
lastAllocS
ize
;
last
AllocS
ize
=
size
;
void
AndroidRe
SizableBufferUnsafe
::
R
esetLastBufferSize
(
U32
size
)
{
if
(
execute
_page_offset
+
(
size
-
last_alloc_size
)
<=
current_execute_page_s
ize
)
{
execute
_page_offset
+=
size
-
last_alloc_s
ize
;
last
_alloc_s
ize
=
size
;
}
}
void
*
AndroidRe
llocBufferUnsafe
::
g
etBuffer
(
U32
bufferSize
)
{
void
*
res
=
AndroidCodeBuffer
::
g
etBuffer
(
bufferSize
);
void
*
AndroidRe
SizableBufferUnsafe
::
G
etBuffer
(
U32
bufferSize
)
{
void
*
res
=
AndroidCodeBuffer
::
G
etBuffer
(
bufferSize
);
if
(
res
)
{
last
AllocS
ize
=
bufferSize
;
last
_alloc_s
ize
=
bufferSize
;
}
return
res
;
}
nativehook/src/main/cpp/buffer/code_buffer.h
View file @
a1112fb6
...
...
@@ -14,25 +14,25 @@ namespace SandHook {
AndroidCodeBuffer
();
void
*
g
etBuffer
(
U32
bufferSize
)
override
;
void
*
G
etBuffer
(
U32
bufferSize
)
override
;
protected
:
std
::
list
<
void
*>
execute
SpaceL
ist
=
std
::
list
<
void
*>
();
std
::
mutex
alloc
SpaceL
ock
;
Addr
execute
PageO
ffset
=
0
;
U32
current
ExecutePageS
ize
=
0
;
std
::
list
<
void
*>
execute
_space_l
ist
=
std
::
list
<
void
*>
();
std
::
mutex
alloc
_space_l
ock
;
Addr
execute
_page_o
ffset
=
0
;
U32
current
_execute_page_s
ize
=
0
;
};
//thread unsafe
class
AndroidRe
lloc
BufferUnsafe
:
public
AndroidCodeBuffer
{
class
AndroidRe
Sizable
BufferUnsafe
:
public
AndroidCodeBuffer
{
public
:
public
:
void
r
esetLastBufferSize
(
U32
size
)
override
;
void
R
esetLastBufferSize
(
U32
size
)
override
;
void
*
g
etBuffer
(
U32
bufferSize
)
override
;
void
*
G
etBuffer
(
U32
bufferSize
)
override
;
private
:
U32
last
AllocS
ize
;
U32
last
_alloc_s
ize
;
};
class
StaticCodeBuffer
:
public
CodeBuffer
{
...
...
@@ -40,7 +40,7 @@ namespace SandHook {
StaticCodeBuffer
(
Addr
pc
);
void
*
g
etBuffer
(
U32
bufferSize
)
override
;
void
*
G
etBuffer
(
U32
bufferSize
)
override
;
private
:
Addr
pc
;
...
...
nativehook/src/main/cpp/decoder/decoder.cpp
View file @
a1112fb6
...
...
@@ -20,18 +20,18 @@ bool DefaultVisitor::Visit(Unit<Base> *unit, void *pc) {
DefaultVisitor
::
DefaultVisitor
(
bool
(
*
visitor
)(
Unit
<
Base
>
*
,
void
*
))
:
visitor
(
visitor
)
{}
//do not support now
InstDecoder
*
Disassembler
::
g
et
(
Arch
arch
)
{
InstDecoder
*
Disassembler
::
G
et
(
Arch
arch
)
{
switch
(
arch
)
{
case
arm32
:
return
g
et
();
return
G
et
();
case
arm64
:
return
g
et
();
return
G
et
();
default
:
return
nullptr
;
}
}
InstDecoder
*
Disassembler
::
g
et
()
{
InstDecoder
*
Disassembler
::
G
et
()
{
#if defined(__arm__)
return
Arm32Decoder
::
instant
;
#elif defined(__aarch64__)
...
...
nativehook/src/main/cpp/hook/hook.cpp
View file @
a1112fb6
...
...
@@ -12,7 +12,7 @@
using
namespace
SandHook
::
Hook
;
CodeBuffer
*
InlineHook
::
backup
B
uffer
=
new
AndroidCodeBuffer
();
CodeBuffer
*
InlineHook
::
backup
_b
uffer
=
new
AndroidCodeBuffer
();
#if defined(__arm__)
InlineHook
*
InlineHook
::
instance
=
new
InlineHookArm32Android
();
...
...
nativehook/src/main/cpp/includes/assembler.h
View file @
a1112fb6
...
...
@@ -21,14 +21,14 @@ namespace SandHook {
class
CodeBuffer
{
public
:
virtual
void
*
g
etBuffer
(
U32
size
)
=
0
;
virtual
void
r
esetLastBufferSize
(
U32
size
){};
virtual
void
*
G
etBuffer
(
U32
size
)
=
0
;
virtual
void
R
esetLastBufferSize
(
U32
size
){};
virtual
void
*
copy
(
void
*
start
,
U32
size
)
{
void
*
bufferStart
=
g
etBuffer
(
size
);
void
*
bufferStart
=
G
etBuffer
(
size
);
if
(
bufferStart
==
nullptr
)
return
nullptr
;
memcpy
(
bufferStart
,
start
,
size
);
flushCache
((
Addr
)
bufferStart
,
size
);
FlushCache
((
Addr
)
bufferStart
,
size
);
return
bufferStart
;
};
};
...
...
@@ -40,7 +40,7 @@ namespace SandHook {
void
setCodeBuffer
(
CodeBuffer
*
codeBuffer
);
//allow code
r
elocate to Get new pc first
//allow code
R
elocate to Get new pc first
void
allocBufferFirst
(
U32
size
);
void
append
(
Unit
<
Base
>*
unit
);
void
commit
();
...
...
nativehook/src/main/cpp/includes/code_relocate.h
View file @
a1112fb6
...
...
@@ -20,27 +20,27 @@ namespace SandHook {
class
CodeRelocate
:
public
InstVisitor
{
public
:
CodeRelocate
(
CodeContainer
&
codeContainer
)
:
code
C
ontainer
(
&
codeContainer
)
{}
CodeRelocate
(
CodeContainer
&
codeContainer
)
:
code
_c
ontainer
(
&
codeContainer
)
{}
virtual
void
*
relocate
(
BaseInst
*
instruction
,
void
*
toPc
)
throw
(
ErrorCodeException
)
=
0
;
virtual
void
*
r
elocate
(
void
*
startPc
,
Addr
len
,
void
*
toPc
)
throw
(
ErrorCodeException
)
=
0
;
virtual
void
*
Relocate
(
BaseInst
*
instruction
,
void
*
toPc
)
throw
(
ErrorCodeException
)
=
0
;
virtual
void
*
R
elocate
(
void
*
startPc
,
Addr
len
,
void
*
toPc
)
throw
(
ErrorCodeException
)
=
0
;
bool
i
nRelocateRange
(
Off
targetOffset
,
Addr
targetLen
);
bool
I
nRelocateRange
(
Off
targetOffset
,
Addr
targetLen
);
Label
*
g
etLaterBindLabel
(
Addr
offset
);
Label
*
G
etLaterBindLabel
(
Addr
offset
);
virtual
~
CodeRelocate
()
{
delete
relocate
L
ock
;
delete
later
Bind
labels
;
delete
relocate
_l
ock
;
delete
later
_bind_
labels
;
}
public
:
CodeContainer
*
code
C
ontainer
;
std
::
mutex
*
relocate
L
ock
=
new
std
::
mutex
();
std
::
map
<
Addr
,
Label
*>*
later
Bind
labels
=
new
std
::
map
<
Addr
,
Label
*>
();
Addr
start
A
ddr
=
0
;
CodeContainer
*
code
_c
ontainer
;
std
::
mutex
*
relocate
_l
ock
=
new
std
::
mutex
();
std
::
map
<
Addr
,
Label
*>*
later
_bind_
labels
=
new
std
::
map
<
Addr
,
Label
*>
();
Addr
start
_a
ddr
=
0
;
Addr
length
=
0
;
Addr
cur
O
ffset
=
0
;
Addr
cur
_o
ffset
=
0
;
};
}
...
...
nativehook/src/main/cpp/includes/decoder.h
View file @
a1112fb6
...
...
@@ -32,19 +32,19 @@ namespace SandHook {
class
InstDecoder
{
public
:
virtual
void
Disassembler
(
void
*
code
Start
,
Addr
codeL
en
,
InstVisitor
&
visitor
,
bool
only
PcRelInst
=
false
)
=
0
;
inline
void
Disassembler
(
void
*
codeStart
,
Addr
codeLen
,
bool
(
*
visitor
)(
Unit
<
Base
>*
,
void
*
),
bool
only
PcRelInst
=
false
)
{
virtual
void
Disassembler
(
void
*
code
_start
,
Addr
code_l
en
,
InstVisitor
&
visitor
,
bool
only
_pc_rel
=
false
)
=
0
;
inline
void
Disassembler
(
void
*
codeStart
,
Addr
codeLen
,
bool
(
*
visitor
)(
Unit
<
Base
>*
,
void
*
),
bool
only
_pc_rel
=
false
)
{
InstVisitor
vis
=
DefaultVisitor
(
visitor
);
Disassembler
(
codeStart
,
codeLen
,
vis
,
only
PcRelInst
);
Disassembler
(
codeStart
,
codeLen
,
vis
,
only
_pc_rel
);
};
};
class
Disassembler
{
public
:
static
InstDecoder
*
g
et
(
Arch
arch
);
static
InstDecoder
*
g
et
();
static
InstDecoder
*
G
et
(
Arch
arch
);
static
InstDecoder
*
G
et
();
};
}
}
nativehook/src/main/cpp/includes/exception.h
View file @
a1112fb6
//
// Created by swift on 2019/5/10.
//
#pragma once
#include "exception"
#ifndef SANDHOOK_NH_EXCEPTION_H
#define SANDHOOK_NH_EXCEPTION_H
namespace
SandHook
{
namespace
Asm
{
...
...
@@ -24,6 +23,4 @@ namespace SandHook {
};
}
}
#endif //SANDHOOK_NH_EXCEPTION_H
}
\ No newline at end of file
nativehook/src/main/cpp/includes/hook.h
View file @
a1112fb6
...
...
@@ -2,8 +2,7 @@
// Created by swift on 2019/5/14.
//
#ifndef SANDHOOK_NH_HOOK_H
#define SANDHOOK_NH_HOOK_H
#pragma once
#include <mutex>
...
...
@@ -25,13 +24,11 @@ namespace SandHook {
return
false
;
};
protected
:
static
CodeBuffer
*
backup
B
uffer
;
std
::
mutex
hook
L
ock
;
static
CodeBuffer
*
backup
_b
uffer
;
std
::
mutex
hook
_l
ock
;
public
:
static
InlineHook
*
instance
;
};
}
}
#endif //SANDHOOK_NH_HOOK_H
}
\ No newline at end of file
nativehook/src/main/cpp/relocate/code_relocate.cpp
View file @
a1112fb6
...
...
@@ -7,21 +7,21 @@
using
namespace
SandHook
::
Asm
;
//in range of Copy
bool
CodeRelocate
::
i
nRelocateRange
(
Off
targetOffset
,
Addr
targetLen
)
{
Off
startP
=
cur
O
ffset
+
targetOffset
;
bool
CodeRelocate
::
I
nRelocateRange
(
Off
targetOffset
,
Addr
targetLen
)
{
Off
startP
=
cur
_o
ffset
+
targetOffset
;
Off
endP
=
startP
+
targetLen
;
return
startP
>=
0
&&
endP
<=
length
;
}
Label
*
CodeRelocate
::
g
etLaterBindLabel
(
Addr
offset
)
{
Label
*
CodeRelocate
::
G
etLaterBindLabel
(
Addr
offset
)
{
Label
*
label_per_unit
=
nullptr
;
std
::
map
<
Addr
,
Label
*>::
iterator
it
=
later
Bind
labels
->
find
(
offset
);
if
(
it
!=
later
Bind
labels
->
end
())
{
std
::
map
<
Addr
,
Label
*>::
iterator
it
=
later
_bind_
labels
->
find
(
offset
);
if
(
it
!=
later
_bind_
labels
->
end
())
{
label_per_unit
=
it
->
second
;
}
if
(
label_per_unit
==
nullptr
)
{
label_per_unit
=
new
Label
();
later
Bind
labels
->
insert
(
std
::
map
<
Addr
,
Label
*>::
value_type
(
offset
,
label_per_unit
));
later
_bind_
labels
->
insert
(
std
::
map
<
Addr
,
Label
*>::
value_type
(
offset
,
label_per_unit
));
}
return
label_per_unit
;
}
\ No newline at end of file
nativehook/src/main/cpp/utils/platform.cpp
View file @
a1112fb6
...
...
@@ -6,7 +6,7 @@
#include <sys/mman.h>
#include "platform.h"
bool
f
lushCache
(
Addr
addr
,
Off
len
)
{
bool
F
lushCache
(
Addr
addr
,
Off
len
)
{
#if defined(__arm__)
int
i
=
cacheflush
(
addr
,
addr
+
len
,
0
);
if
(
i
==
-
1
)
{
...
...
@@ -21,7 +21,7 @@ bool flushCache(Addr addr, Off len) {
}
extern
"C"
bool
m
emUnprotect
(
Addr
addr
,
Addr
len
)
{
extern
"C"
bool
M
emUnprotect
(
Addr
addr
,
Addr
len
)
{
long
pagesize
=
P_SIZE
;
unsigned
alignment
=
(
unsigned
)((
unsigned
long
long
)
addr
%
pagesize
);
int
i
=
mprotect
((
void
*
)
(
addr
-
alignment
),
(
size_t
)
(
alignment
+
len
),
...
...
nativehook/src/main/cpp/utils/platform.h
View file @
a1112fb6
...
...
@@ -6,6 +6,6 @@
#include "base.h"
extern
"C"
bool
f
lushCache
(
Addr
addr
,
Off
len
);
extern
"C"
bool
F
lushCache
(
Addr
addr
,
Off
len
);
extern
"C"
bool
memUnprotect
(
Addr
addr
,
Addr
len
);
\ No newline at end of file
extern
"C"
bool
MemUnprotect
(
Addr
addr
,
Addr
len
);
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment