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
a294625b
Commit
a294625b
authored
Jul 10, 2019
by
swift_gan
Committed by
swift_gan
Jul 10, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[Reconstitution]typo
parent
8eac60f2
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
112 additions
and
245 deletions
+112
-245
assembler_arm32.cpp
...rc/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp
+7
-7
assembler_arm32.h
.../src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.h
+1
-1
decoder_arm32.cpp
...ok/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp
+2
-2
decoder_arm32.h
...hook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.h
+2
-2
hook_arm32.cpp
nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp
+4
-4
code_relocate_arm32.cpp
...main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp
+20
-20
assembler_arm64.cpp
...rc/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp
+7
-7
assembler_arm64.h
.../src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h
+1
-1
decoder_arm64.cpp
...ok/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp
+2
-2
decoder_arm64.h
...hook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.h
+2
-2
hook_arm64.cpp
nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp
+2
-2
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
+1
-1
instruction.h
nativehook/src/main/cpp/asm/instruction.h
+1
-1
label.h
nativehook/src/main/cpp/asm/label.h
+1
-1
assembler.cpp
nativehook/src/main/cpp/assembler/assembler.cpp
+20
-20
decoder.cpp
nativehook/src/main/cpp/decoder/decoder.cpp
+2
-2
assembler.h
nativehook/src/main/cpp/includes/assembler.h
+11
-11
decoder.h
nativehook/src/main/cpp/includes/decoder.h
+6
-5
sandhook_native.cpp
nativehook/src/main/cpp/sandhook_native.cpp
+0
-134
No files found.
nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp
View file @
a294625b
...
...
@@ -10,24 +10,24 @@ using namespace SandHook::RegistersA32;
using
namespace
SandHook
::
AsmA32
;
AssemblerA32
::
AssemblerA32
(
CodeBuffer
*
codeBuffer
)
{
code_container
.
s
etCodeBuffer
(
codeBuffer
);
code_container
.
S
etCodeBuffer
(
codeBuffer
);
}
void
*
AssemblerA32
::
GetPC
()
{
return
reinterpret_cast
<
void
*>
(
code_container
.
cur
P
c
);
return
reinterpret_cast
<
void
*>
(
code_container
.
cur
_p
c
);
}
void
*
AssemblerA32
::
GetStartPC
()
{
return
reinterpret_cast
<
void
*>
(
code_container
.
start
P
c
);
return
reinterpret_cast
<
void
*>
(
code_container
.
start
_p
c
);
}
void
AssemblerA32
::
AllocBufferFirst
(
U32
size
)
{
code_container
.
a
llocBufferFirst
(
size
);
code_container
.
A
llocBufferFirst
(
size
);
}
void
*
AssemblerA32
::
Finish
()
{
code_container
.
c
ommit
();
return
reinterpret_cast
<
void
*>
(
code_container
.
start
P
c
);
code_container
.
C
ommit
();
return
reinterpret_cast
<
void
*>
(
code_container
.
start
_p
c
);
}
void
AssemblerA32
::
Emit
(
U32
data32
)
{
...
...
@@ -39,7 +39,7 @@ void AssemblerA32::Emit(U16 data16) {
}
void
AssemblerA32
::
Emit
(
BaseUnit
*
unit
)
{
code_container
.
a
ppend
(
unit
);
code_container
.
A
ppend
(
unit
);
}
void
AssemblerA32
::
Mov
(
RegisterA32
&
rd
,
U16
imm16
)
{
...
...
nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.h
View file @
a294625b
...
...
@@ -31,7 +31,7 @@ namespace SandHook {
void
Emit
(
U32
data32
);
void
Emit
(
U16
data16
);
void
Emit
(
Unit
<
Base
>
*
unit
);
void
Emit
(
BaseUnit
*
unit
);
void
Mov
(
RegisterA32
&
rd
,
U16
imm16
);
...
...
nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp
View file @
a294625b
...
...
@@ -22,8 +22,8 @@ goto label_matched; \
Arm32Decoder
*
Arm32Decoder
::
instant
=
new
Arm32Decoder
();
void
Arm32Decoder
::
Disassemble
r
(
void
*
codeStart
,
Addr
codeLen
,
InstVisitor
&
visitor
,
bool
onlyPcRelInst
)
{
void
Arm32Decoder
::
Disassemble
(
void
*
codeStart
,
Addr
codeLen
,
InstVisitor
&
visitor
,
bool
onlyPcRelInst
)
{
bool
thumb
=
IsThumbCode
(
reinterpret_cast
<
Addr
>
(
codeStart
));
if
(
thumb
)
{
codeStart
=
GetThumbCodeAddress
(
codeStart
);
...
...
nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.h
View file @
a294625b
...
...
@@ -12,8 +12,8 @@ namespace SandHook {
class
Arm32Decoder
:
public
InstDecoder
{
public
:
void
Disassemble
r
(
void
*
codeStart
,
Addr
codeLen
,
InstVisitor
&
visitor
,
bool
onlyPcRelInst
)
override
;
void
Disassemble
(
void
*
codeStart
,
Addr
codeLen
,
InstVisitor
&
visitor
,
bool
onlyPcRelInst
)
override
;
public
:
static
Arm32Decoder
*
instant
;
};
...
...
nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp
View file @
a294625b
...
...
@@ -28,7 +28,7 @@ void *InlineHookArm32Android::Hook(void *origin, void *replace) {
return
nullptr
;
}
bool
change
M
ode
=
IsThumbCode
((
Addr
)
origin
)
!=
IsThumbCode
((
Addr
)
replace
);
bool
change
_m
ode
=
IsThumbCode
((
Addr
)
origin
)
!=
IsThumbCode
((
Addr
)
replace
);
void
*
backup
=
nullptr
;
AssemblerA32
assembler_backup
(
backup_buffer
);
...
...
@@ -39,7 +39,7 @@ void *InlineHookArm32Android::Hook(void *origin, void *replace) {
//build inline trampoline
#define __ assembler_inline.
if
(
!
change
M
ode
)
{
if
(
!
change
_m
ode
)
{
Label
*
target_addr_label
=
new
Label
();
ALIGN_FOR_LDR
__
Ldr
(
PC
,
target_addr_label
);
...
...
@@ -54,7 +54,7 @@ void *InlineHookArm32Android::Hook(void *origin, void *replace) {
//build backup method
CodeRelocateA32
relocate
=
CodeRelocateA32
(
assembler_backup
);
backup
=
relocate
.
Relocate
(
origin
,
code_container_inline
->
s
ize
(),
nullptr
);
backup
=
relocate
.
Relocate
(
origin
,
code_container_inline
->
S
ize
(),
nullptr
);
#define __ assembler_backup.
Label
*
origin_addr_label
=
new
Label
();
ALIGN_FOR_LDR
...
...
@@ -107,7 +107,7 @@ bool InlineHookArm32Android::BreakPoint(void *origin, void (*callback)(REG *)) {
//build trampoline
origin_addr_s
=
(
Addr
)
GetThumbPC
(
backup
);
callback_addr_s
=
(
Addr
)
callback
;
void
*
trampoline
=
backup_buffer
->
c
opy
((
void
*
)
BP_SHELLCODE
,
SHELLCODE_LEN
(
BP_SHELLCODE
));
void
*
trampoline
=
backup_buffer
->
C
opy
((
void
*
)
BP_SHELLCODE
,
SHELLCODE_LEN
(
BP_SHELLCODE
));
//build inline trampoline
#define __ assembler_inline.
...
...
nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp
View file @
a294625b
...
...
@@ -44,7 +44,7 @@ void* CodeRelocateA32::Relocate(void *startPc, Addr len, void *toPc = nullptr) t
__
AllocBufferFirst
(
static_cast
<
U32
>
(
len
*
8
));
void
*
curPc
=
__
GetPC
();
if
(
toPc
==
nullptr
)
{
Disassembler
::
Get
()
->
Disassemble
r
(
startPc
,
len
,
*
this
,
true
);
Disassembler
::
Get
()
->
Disassemble
(
startPc
,
len
,
*
this
,
true
);
}
else
{
//TODO
}
...
...
@@ -52,7 +52,7 @@ void* CodeRelocateA32::Relocate(void *startPc, Addr len, void *toPc = nullptr) t
}
void
*
CodeRelocateA32
::
Relocate
(
BaseInst
*
instruction
,
void
*
toPc
)
throw
(
ErrorCodeException
)
{
void
*
cur
P
c
=
__
GetPC
();
void
*
cur
_p
c
=
__
GetPC
();
//insert later AddBind labels
__
Emit
(
GetLaterBindLabel
(
cur_offset
));
...
...
@@ -60,7 +60,7 @@ void* CodeRelocateA32::Relocate(BaseInst *instruction, void *toPc) throw(ErrorCo
if
(
!
instruction
->
PcRelate
())
{
__
Emit
(
instruction
);
instruction
->
Ref
();
return
cur
P
c
;
return
cur
_p
c
;
}
if
(
instruction
->
InstType
()
==
thumb32
)
{
...
...
@@ -88,7 +88,7 @@ void* CodeRelocateA32::Relocate(BaseInst *instruction, void *toPc) throw(ErrorCo
__
Emit
(
instruction
);
instruction
->
Ref
();
}
return
cur
P
c
;
return
cur
_p
c
;
}
...
...
@@ -99,14 +99,14 @@ IMPL_RELOCATE(T16, B_COND) {
return
;
}
Addr
target
A
ddr
=
inst
->
GetImmPCOffsetTarget
();
Addr
target
_a
ddr
=
inst
->
GetImmPCOffsetTarget
();
if
(
inst
->
condition
==
al
)
{
Label
*
target_label
=
new
Label
;
ALIGN_FOR_LDR
__
Ldr
(
PC
,
target_label
);
__
Emit
(
target_label
);
__
Emit
(
target
A
ddr
);
__
Emit
(
target
_a
ddr
);
}
else
{
Label
*
true_label
=
new
Label
();
Label
*
false_label
=
new
Label
();
...
...
@@ -117,7 +117,7 @@ IMPL_RELOCATE(T16, B_COND) {
ALIGN_FOR_LDR
__
Ldr
(
PC
,
target_label
);
__
Emit
(
target_label
);
__
Emit
(
target
A
ddr
);
__
Emit
(
target
_a
ddr
);
__
Emit
(
false_label
);
}
...
...
@@ -130,13 +130,13 @@ IMPL_RELOCATE(T16, B) {
return
;
}
Addr
target
A
ddr
=
inst
->
GetImmPCOffsetTarget
();
Addr
target
_a
ddr
=
inst
->
GetImmPCOffsetTarget
();
Label
*
target_label
=
new
Label
();
ALIGN_FOR_LDR
__
Ldr
(
PC
,
target_label
);
__
Emit
(
target_label
);
__
Emit
((
Addr
)
GetThumbPC
(
reinterpret_cast
<
void
*>
(
target
A
ddr
)));
__
Emit
((
Addr
)
GetThumbPC
(
reinterpret_cast
<
void
*>
(
target
_a
ddr
)));
}
...
...
@@ -155,7 +155,7 @@ IMPL_RELOCATE(T16, CBZ_CBNZ) {
return
;
}
Addr
target
A
ddr
=
inst
->
GetImmPCOffsetTarget
();
Addr
target
_a
ddr
=
inst
->
GetImmPCOffsetTarget
();
Label
*
true_label
=
new
Label
;
Label
*
false_label
=
new
Label
;
...
...
@@ -168,7 +168,7 @@ IMPL_RELOCATE(T16, CBZ_CBNZ) {
ALIGN_FOR_LDR
__
Ldr
(
PC
,
target_label
);
__
Emit
(
target_label
);
__
Emit
((
Addr
)
GetThumbPC
(
reinterpret_cast
<
void
*>
(
target
A
ddr
)));
__
Emit
((
Addr
)
GetThumbPC
(
reinterpret_cast
<
void
*>
(
target
_a
ddr
)));
__
Emit
(
false_label
);
}
...
...
@@ -182,9 +182,9 @@ IMPL_RELOCATE(T16, LDR_LIT) {
return
;
}
Addr
target
A
ddr
=
inst
->
GetImmPCOffsetTarget
();
Addr
target
_a
ddr
=
inst
->
GetImmPCOffsetTarget
();
__
Mov
(
*
inst
->
rt
,
target
A
ddr
);
__
Mov
(
*
inst
->
rt
,
target
_a
ddr
);
__
Ldr
(
*
inst
->
rt
,
MemOperand
(
inst
->
rt
,
0
));
}
...
...
@@ -197,9 +197,9 @@ IMPL_RELOCATE(T16, ADR) {
return
;
}
Addr
target
A
ddr
=
inst
->
GetImmPCOffsetTarget
();
Addr
target
_a
ddr
=
inst
->
GetImmPCOffsetTarget
();
__
Mov
(
*
inst
->
rd
,
target
A
ddr
);
__
Mov
(
*
inst
->
rd
,
target
_a
ddr
);
}
...
...
@@ -229,14 +229,14 @@ IMPL_RELOCATE(T32, B32) {
return
;
}
Addr
target
A
ddr
=
inst
->
GetImmPCOffsetTarget
();
Addr
target
_a
ddr
=
inst
->
GetImmPCOffsetTarget
();
if
(
inst
->
x
==
T32_B32
::
thumb
)
{
//Thumb mode
target
Addr
=
reinterpret_cast
<
Addr
>
(
GetThumbPC
(
reinterpret_cast
<
void
*>
(
targetA
ddr
)));
target
_addr
=
reinterpret_cast
<
Addr
>
(
GetThumbPC
(
reinterpret_cast
<
void
*>
(
target_a
ddr
)));
}
__
Mov
(
IP
,
target
A
ddr
);
__
Mov
(
IP
,
target
_a
ddr
);
if
(
inst
->
op
==
T32_B32
::
BL
)
{
__
Blx
(
IP
);
}
else
{
...
...
@@ -254,9 +254,9 @@ IMPL_RELOCATE(T32, LDR_LIT) {
return
;
}
Addr
target
A
ddr
=
inst
->
GetImmPCOffsetTarget
();
Addr
target
_a
ddr
=
inst
->
GetImmPCOffsetTarget
();
__
Mov
(
*
inst
->
rt
,
target
A
ddr
);
__
Mov
(
*
inst
->
rt
,
target
_a
ddr
);
switch
(
inst
->
op
)
{
case
T32_LDR_LIT
:
:
LDR
:
__
Ldr
(
*
inst
->
rt
,
MemOperand
(
inst
->
rt
,
0
));
...
...
nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp
View file @
a294625b
...
...
@@ -9,24 +9,24 @@ using namespace SandHook::RegistersA64;
using
namespace
SandHook
::
AsmA64
;
AssemblerA64
::
AssemblerA64
(
CodeBuffer
*
codeBuffer
)
{
code_container
.
s
etCodeBuffer
(
codeBuffer
);
code_container
.
S
etCodeBuffer
(
codeBuffer
);
}
void
*
AssemblerA64
::
GetPC
()
{
return
reinterpret_cast
<
void
*>
(
code_container
.
cur
P
c
);
return
reinterpret_cast
<
void
*>
(
code_container
.
cur
_p
c
);
}
void
*
AssemblerA64
::
GetStartPC
()
{
return
reinterpret_cast
<
void
*>
(
code_container
.
start
P
c
);
return
reinterpret_cast
<
void
*>
(
code_container
.
start
_p
c
);
}
void
AssemblerA64
::
AllocBufferFirst
(
U32
size
)
{
code_container
.
a
llocBufferFirst
(
size
);
code_container
.
A
llocBufferFirst
(
size
);
}
void
*
AssemblerA64
::
Finish
()
{
code_container
.
c
ommit
();
return
reinterpret_cast
<
void
*>
(
code_container
.
start
P
c
);
code_container
.
C
ommit
();
return
reinterpret_cast
<
void
*>
(
code_container
.
start
_p
c
);
}
...
...
@@ -39,7 +39,7 @@ void AssemblerA64::Emit(U32 data32) {
}
void
AssemblerA64
::
Emit
(
BaseUnit
*
unit
)
{
code_container
.
a
ppend
(
unit
);
code_container
.
A
ppend
(
unit
);
}
void
AssemblerA64
::
MoveWide
(
RegisterA64
&
rd
,
INST_A64
(
MOV_WIDE
)
::
OP
op
,
U64
imme
,
...
...
nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h
View file @
a294625b
...
...
@@ -25,7 +25,7 @@ namespace SandHook {
void
Emit
(
U32
data32
);
void
Emit
(
U64
data64
);
void
Emit
(
Unit
<
Base
>
*
unit
);
void
Emit
(
BaseUnit
*
unit
);
void
MoveWide
(
RegisterA64
&
rd
,
INST_A64
(
MOV_WIDE
)
::
OP
op
,
U64
imme
,
INST_A64
(
MOV_WIDE
)
::
Shift
shift
);
...
...
nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp
View file @
a294625b
...
...
@@ -16,8 +16,8 @@ goto label_matched; \
Arm64Decoder
*
Arm64Decoder
::
instant
=
new
Arm64Decoder
();
void
Arm64Decoder
::
Disassemble
r
(
void
*
codeStart
,
Addr
codeLen
,
InstVisitor
&
visitor
,
bool
onlyPcRelInst
)
{
void
Arm64Decoder
::
Disassemble
(
void
*
codeStart
,
Addr
codeLen
,
InstVisitor
&
visitor
,
bool
onlyPcRelInst
)
{
InstA64
*
pc
=
reinterpret_cast
<
InstA64
*>
(
codeStart
);
Addr
end_addr
=
(
Addr
)
codeStart
+
codeLen
;
BaseUnit
*
unit
=
nullptr
;
...
...
nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.h
View file @
a294625b
...
...
@@ -11,8 +11,8 @@ namespace SandHook {
class
Arm64Decoder
:
public
InstDecoder
{
public
:
void
Disassemble
r
(
void
*
codeStart
,
Addr
codeLen
,
InstVisitor
&
visitor
,
bool
onlyPcRelInst
)
override
;
void
Disassemble
(
void
*
codeStart
,
Addr
codeLen
,
InstVisitor
&
visitor
,
bool
onlyPcRelInst
)
override
;
public
:
static
Arm64Decoder
*
instant
;
};
...
...
nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp
View file @
a294625b
...
...
@@ -36,13 +36,13 @@ void *InlineHookArm64Android::Hook(void *origin, void *replace) {
//build backup method
CodeRelocateA64
relocate
=
CodeRelocateA64
(
assembler_backup
);
backup
=
relocate
.
Relocate
(
origin
,
code_container_inline
->
s
ize
(),
nullptr
);
backup
=
relocate
.
Relocate
(
origin
,
code_container_inline
->
S
ize
(),
nullptr
);
#define __ assembler_backup.
Label
*
origin_addr_label
=
new
Label
();
__
Ldr
(
IP1
,
origin_addr_label
);
__
Br
(
IP1
);
__
Emit
(
origin_addr_label
);
__
Emit
((
Addr
)
origin
+
code_container_inline
->
s
ize
());
__
Emit
((
Addr
)
origin
+
code_container_inline
->
S
ize
());
__
Finish
();
#undef __
...
...
nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp
View file @
a294625b
...
...
@@ -24,7 +24,7 @@ CodeRelocateA64::CodeRelocateA64(AssemblerA64 &assembler) : CodeRelocate(assembl
assemblerA64
=
&
assembler
;
}
bool
CodeRelocateA64
::
Visit
(
Unit
<
Base
>
*
unit
,
void
*
pc
)
{
bool
CodeRelocateA64
::
Visit
(
BaseUnit
*
unit
,
void
*
pc
)
{
Relocate
(
reinterpret_cast
<
BaseInst
*>
(
unit
),
__
GetPC
());
cur_offset
+=
unit
->
Size
();
if
(
unit
->
RefCount
()
==
0
)
{
...
...
@@ -39,17 +39,17 @@ void* CodeRelocateA64::Relocate(void *startPc, Addr len, void *toPc = nullptr) t
length
=
len
;
cur_offset
=
0
;
__
AllocBufferFirst
(
static_cast
<
U32
>
(
len
*
8
));
void
*
cur
P
c
=
__
GetPC
();
void
*
cur
_p
c
=
__
GetPC
();
if
(
toPc
==
nullptr
)
{
Disassembler
::
Get
()
->
Disassemble
r
(
startPc
,
len
,
*
this
,
true
);
Disassembler
::
Get
()
->
Disassemble
(
startPc
,
len
,
*
this
,
true
);
}
else
{
//TODO
}
return
cur
P
c
;
return
cur
_p
c
;
}
void
*
CodeRelocateA64
::
Relocate
(
BaseInst
*
instruction
,
void
*
toPc
)
throw
(
ErrorCodeException
)
{
void
*
cur
P
c
=
__
GetPC
();
void
*
cur
_p
c
=
__
GetPC
();
//insert later AddBind labels
__
Emit
(
GetLaterBindLabel
(
cur_offset
));
...
...
@@ -57,7 +57,7 @@ void* CodeRelocateA64::Relocate(BaseInst *instruction, void *toPc) throw(ErrorCo
if
(
!
instruction
->
PcRelate
())
{
__
Emit
(
instruction
);
instruction
->
Ref
();
return
cur
P
c
;
return
cur
_p
c
;
}
switch
(
instruction
->
InstCode
())
{
CASE
(
B_BL
)
...
...
@@ -70,7 +70,7 @@ void* CodeRelocateA64::Relocate(BaseInst *instruction, void *toPc) throw(ErrorCo
__
Emit
(
instruction
);
instruction
->
Ref
();
}
return
cur
P
c
;
return
cur
_p
c
;
}
IMPL_RELOCATE
(
B_BL
)
{
...
...
@@ -82,7 +82,7 @@ IMPL_RELOCATE(B_BL) {
return
;
}
Addr
target
A
ddr
=
inst
->
GetImmPCOffsetTarget
();
Addr
target
_a
ddr
=
inst
->
GetImmPCOffsetTarget
();
if
(
inst
->
op
==
inst
->
BL
)
{
Addr
lr
=
reinterpret_cast
<
Addr
>
(
toPc
);
...
...
@@ -91,7 +91,7 @@ IMPL_RELOCATE(B_BL) {
lr
+=
4
;
// Br
__
Mov
(
LR
,
lr
);
}
__
Mov
(
IP1
,
target
A
ddr
);
__
Mov
(
IP1
,
target
_a
ddr
);
__
Br
(
IP1
);
}
...
...
@@ -104,7 +104,7 @@ IMPL_RELOCATE(B_COND) {
return
;
}
Addr
target
A
ddr
=
inst
->
GetImmPCOffsetTarget
();
Addr
target
_a
ddr
=
inst
->
GetImmPCOffsetTarget
();
Label
*
true_label
=
new
Label
();
Label
*
false_label
=
new
Label
();
...
...
@@ -113,7 +113,7 @@ IMPL_RELOCATE(B_COND) {
__
B
(
false_label
);
__
Emit
(
true_label
);
__
Mov
(
IP1
,
target
A
ddr
);
__
Mov
(
IP1
,
target
_a
ddr
);
__
Br
(
IP1
);
__
Emit
(
false_label
);
...
...
@@ -128,7 +128,7 @@ IMPL_RELOCATE(TBZ_TBNZ) {
return
;
}
Addr
target
A
ddr
=
inst
->
GetImmPCOffsetTarget
();
Addr
target
_a
ddr
=
inst
->
GetImmPCOffsetTarget
();
Label
*
true_label
=
new
Label
();
Label
*
false_label
=
new
Label
();
...
...
@@ -141,7 +141,7 @@ IMPL_RELOCATE(TBZ_TBNZ) {
__
B
(
false_label
);
__
Emit
(
true_label
);
__
Mov
(
IP1
,
target
A
ddr
);
__
Mov
(
IP1
,
target
_a
ddr
);
__
Br
(
IP1
);
__
Emit
(
false_label
);
...
...
@@ -156,7 +156,7 @@ IMPL_RELOCATE(CBZ_CBNZ) {
return
;
}
Addr
target
A
ddr
=
inst
->
GetImmPCOffsetTarget
();
Addr
target
_a
ddr
=
inst
->
GetImmPCOffsetTarget
();
Label
*
true_label
=
new
Label
();
Label
*
false_label
=
new
Label
();
...
...
@@ -170,14 +170,14 @@ IMPL_RELOCATE(CBZ_CBNZ) {
__
B
(
false_label
);
__
Emit
(
true_label
);
__
Mov
(
IP1
,
target
A
ddr
);
__
Mov
(
IP1
,
target
_a
ddr
);
__
Br
(
IP1
);
__
Emit
(
false_label
);
}
IMPL_RELOCATE
(
LDR_LIT
)
{
Addr
target
A
ddr
=
inst
->
GetImmPCOffsetTarget
();
Addr
target
_a
ddr
=
inst
->
GetImmPCOffsetTarget
();
XRegister
*
rtX
=
XReg
(
inst
->
rt
->
Code
());
WRegister
*
rtW
=
WReg
(
inst
->
rt
->
Code
());
...
...
@@ -190,20 +190,20 @@ IMPL_RELOCATE(LDR_LIT) {
switch
(
inst
->
op
)
{
case
INST_A64
(
LDR_LIT
):
:
LDR_X
:
__
Mov
(
*
rtX
,
target
A
ddr
);
__
Mov
(
*
rtX
,
target
_a
ddr
);
__
Ldr
(
*
rtX
,
MemOperand
(
rtX
,
0
,
Offset
));
break
;
case
INST_A64
(
LDR_LIT
):
:
LDR_W
:
__
Mov
(
*
rtX
,
target
A
ddr
);
__
Mov
(
*
rtX
,
target
_a
ddr
);
__
Ldr
(
*
rtW
,
MemOperand
(
rtX
,
0
,
Offset
));
break
;
case
INST_A64
(
LDR_LIT
):
:
LDR_SW
:
__
Mov
(
*
rtX
,
target
A
ddr
);
__
Mov
(
*
rtX
,
target
_a
ddr
);
__
Ldrsw
(
*
rtX
,
MemOperand
(
rtX
,
0
,
Offset
));
break
;
case
INST_A64
(
LDR_LIT
):
:
LDR_PRFM
:
__
Push
(
X0
);
__
Mov
(
X0
,
target
A
ddr
);
__
Mov
(
X0
,
target
_a
ddr
);
__
Ldrsw
(
X0
,
MemOperand
(
rtX
,
0
,
Offset
));
__
Pop
(
X0
);
break
;
...
...
nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h
View file @
a294625b
...
...
@@ -26,7 +26,7 @@ namespace SandHook {
void
*
Relocate
(
void
*
startPc
,
Addr
len
,
void
*
toPc
)
throw
(
ErrorCodeException
)
override
;
bool
Visit
(
Unit
<
Base
>
*
unit
,
void
*
pc
)
override
;
bool
Visit
(
BaseUnit
*
unit
,
void
*
pc
)
override
;
DEFINE_RELOCATE
(
B_BL
)
...
...
nativehook/src/main/cpp/asm/instruction.h
View file @
a294625b
...
...
@@ -99,7 +99,7 @@ namespace SandHook {
S
backup_
;
};
class
Void
:
public
Unit
<
Base
>
{
class
Void
:
public
BaseUnit
{
public
:
Void
(
U32
size
)
:
size_
(
size
)
{}
...
...
nativehook/src/main/cpp/asm/label.h
View file @
a294625b
...
...
@@ -20,7 +20,7 @@ namespace SandHook {
Label
()
{}
Label
(
void
*
pc
)
:
Unit
<
Base
>
(
pc
)
{}
Label
(
void
*
pc
)
:
BaseUnit
(
pc
)
{}
enum
UnitTypeDef
UnitType
()
override
{
return
UnitTypeDef
::
UnitLabel
;
...
...
nativehook/src/main/cpp/assembler/assembler.cpp
View file @
a294625b
...
...
@@ -8,32 +8,32 @@
using
namespace
SandHook
::
Assembler
;
using
namespace
SandHook
::
Asm
;
CodeContainer
::
CodeContainer
(
CodeBuffer
*
codeBuffer
)
:
code
B
uffer
(
codeBuffer
)
{}
CodeContainer
::
CodeContainer
(
CodeBuffer
*
codeBuffer
)
:
code
_b
uffer
(
codeBuffer
)
{}
void
CodeContainer
::
s
etCodeBuffer
(
CodeBuffer
*
codeBuffer
)
{
this
->
code
B
uffer
=
codeBuffer
;
void
CodeContainer
::
S
etCodeBuffer
(
CodeBuffer
*
codeBuffer
)
{
this
->
code
_b
uffer
=
codeBuffer
;
}
void
CodeContainer
::
append
(
Unit
<
Base
>
*
unit
)
{
void
CodeContainer
::
Append
(
BaseUnit
*
unit
)
{
units
.
push_back
(
unit
);
unit
->
SetVPC
(
cur
P
c
);
unit
->
SetVPC
(
cur
_p
c
);
switch
(
unit
->
UnitType
())
{
case
UnitLabel
:
labels
.
push_back
((
Label
*
)
unit
);
break
;
default
:
cur
P
c
+=
unit
->
Size
();
cur
_p
c
+=
unit
->
Size
();
}
}
void
CodeContainer
::
c
ommit
()
{
U32
bufferSize
=
static_cast
<
U32
>
(
cur
Pc
-
startP
c
);
void
CodeContainer
::
C
ommit
()
{
U32
bufferSize
=
static_cast
<
U32
>
(
cur
_pc
-
start_p
c
);
void
*
bufferStart
;
if
(
start
P
c
>
0
)
{
bufferStart
=
reinterpret_cast
<
void
*>
(
start
P
c
);
code
B
uffer
->
ResetLastBufferSize
(
bufferSize
);
if
(
start
_p
c
>
0
)
{
bufferStart
=
reinterpret_cast
<
void
*>
(
start
_p
c
);
code
_b
uffer
->
ResetLastBufferSize
(
bufferSize
);
}
else
{
bufferStart
=
code
B
uffer
->
GetBuffer
(
bufferSize
);
bufferStart
=
code
_b
uffer
->
GetBuffer
(
bufferSize
);
}
Addr
pcNow
=
reinterpret_cast
<
Addr
>
(
bufferStart
);
...
...
@@ -61,23 +61,23 @@ void CodeContainer::commit() {
FlushCache
(
reinterpret_cast
<
Addr
>
(
bufferStart
),
pcNow
-
reinterpret_cast
<
Addr
>
(
bufferStart
));
//Set pc
start
P
c
=
reinterpret_cast
<
Addr
>
(
bufferStart
);
cur
P
c
=
pcNow
;
start
_p
c
=
reinterpret_cast
<
Addr
>
(
bufferStart
);
cur
_p
c
=
pcNow
;
}
void
CodeContainer
::
a
llocBufferFirst
(
U32
size
)
{
start
Pc
=
reinterpret_cast
<
Addr
>
(
codeB
uffer
->
GetBuffer
(
size
));
cur
Pc
=
startP
c
;
void
CodeContainer
::
A
llocBufferFirst
(
U32
size
)
{
start
_pc
=
reinterpret_cast
<
Addr
>
(
code_b
uffer
->
GetBuffer
(
size
));
cur
_pc
=
start_p
c
;
}
CodeContainer
::~
CodeContainer
()
{
std
::
list
<
Unit
<
Base
>
*>::
iterator
unit
;
std
::
list
<
BaseUnit
*>::
iterator
unit
;
for
(
unit
=
units
.
begin
();
unit
!=
units
.
end
();
++
unit
)
{
delete
(
*
unit
);
}
}
Addr
CodeContainer
::
s
ize
()
{
return
cur
Pc
-
startP
c
;
Addr
CodeContainer
::
S
ize
()
{
return
cur
_pc
-
start_p
c
;
}
nativehook/src/main/cpp/decoder/decoder.cpp
View file @
a294625b
...
...
@@ -11,13 +11,13 @@
using
namespace
SandHook
::
Decoder
;
bool
DefaultVisitor
::
Visit
(
Unit
<
Base
>
*
unit
,
void
*
pc
)
{
bool
DefaultVisitor
::
Visit
(
BaseUnit
*
unit
,
void
*
pc
)
{
bool
res
=
visitor
(
unit
,
pc
);
delete
unit
;
return
res
;
}
DefaultVisitor
::
DefaultVisitor
(
bool
(
*
visitor
)(
Unit
<
Base
>
*
,
void
*
))
:
visitor
(
visitor
)
{}
DefaultVisitor
::
DefaultVisitor
(
bool
(
*
visitor
)(
BaseUnit
*
,
void
*
))
:
visitor
(
visitor
)
{}
//do not support now
InstDecoder
*
Disassembler
::
Get
(
Arch
arch
)
{
...
...
nativehook/src/main/cpp/includes/assembler.h
View file @
a294625b
...
...
@@ -23,7 +23,7 @@ namespace SandHook {
public
:
virtual
void
*
GetBuffer
(
U32
size
)
=
0
;
virtual
void
ResetLastBufferSize
(
U32
size
){};
virtual
void
*
c
opy
(
void
*
start
,
U32
size
)
{
virtual
void
*
C
opy
(
void
*
start
,
U32
size
)
{
void
*
bufferStart
=
GetBuffer
(
size
);
if
(
bufferStart
==
nullptr
)
return
nullptr
;
...
...
@@ -38,26 +38,26 @@ namespace SandHook {
CodeContainer
(
CodeBuffer
*
codeBuffer
);
void
s
etCodeBuffer
(
CodeBuffer
*
codeBuffer
);
void
S
etCodeBuffer
(
CodeBuffer
*
codeBuffer
);
//allow code Relocate to Get new pc first
void
a
llocBufferFirst
(
U32
size
);
void
append
(
Unit
<
Base
>*
unit
);
void
c
ommit
();
void
A
llocBufferFirst
(
U32
size
);
void
Append
(
BaseUnit
*
unit
);
void
C
ommit
();
Addr
s
ize
();
Addr
S
ize
();
virtual
~
CodeContainer
();
public
:
//before commit is virtual address so = 0, after commit is real address
Addr
start
P
c
=
0
;
Addr
cur
P
c
=
0
;
Addr
start
_p
c
=
0
;
Addr
cur
_p
c
=
0
;
private
:
Addr
max
S
ize
=
0
;
std
::
list
<
Unit
<
Base
>*>
units
=
std
::
list
<
Unit
<
Base
>
*>
();
Addr
max
_s
ize
=
0
;
std
::
list
<
BaseUnit
*>
units
=
std
::
list
<
BaseUnit
*>
();
std
::
list
<
Label
*>
labels
=
std
::
list
<
Label
*>
();
CodeBuffer
*
code
B
uffer
=
nullptr
;
CodeBuffer
*
code
_b
uffer
=
nullptr
;
};
...
...
nativehook/src/main/cpp/includes/decoder.h
View file @
a294625b
...
...
@@ -15,7 +15,7 @@ namespace SandHook {
class
InstVisitor
{
public
:
//need free unit
virtual
bool
Visit
(
Unit
<
Base
>
*
unit
,
void
*
pc
)
{
virtual
bool
Visit
(
BaseUnit
*
unit
,
void
*
pc
)
{
delete
unit
;
return
false
;
};
...
...
@@ -32,11 +32,12 @@ namespace SandHook {
class
InstDecoder
{
public
:
virtual
void
Disassembler
(
void
*
code_start
,
Addr
code_len
,
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
)
{
virtual
void
Disassemble
(
void
*
code_start
,
Addr
code_len
,
InstVisitor
&
visitor
,
bool
only_pc_rel
=
false
)
=
0
;
inline
void
Disassemble
(
void
*
codeStart
,
Addr
codeLen
,
bool
(
*
visitor
)(
BaseUnit
*
,
void
*
),
bool
only_pc_rel
=
false
)
{
InstVisitor
vis
=
DefaultVisitor
(
visitor
);
Disassemble
r
(
codeStart
,
codeLen
,
vis
,
only_pc_rel
);
Disassemble
(
codeStart
,
codeLen
,
vis
,
only_pc_rel
);
};
};
...
...
nativehook/src/main/cpp/sandhook_native.cpp
View file @
a294625b
...
...
@@ -3,8 +3,6 @@
//
#include <jni.h>
#include <sys/mman.h>
#include <log.h>
#include "sandhook_native.h"
#include "hook.h"
#include "elf.h"
...
...
@@ -12,138 +10,6 @@
using
namespace
SandHook
::
Hook
;
using
namespace
SandHook
::
Elf
;
int
m1
=
5
;
int
m3
=
1036
;
int
m2
=
1035
;
int
m4
=
5
;
void
(
*
dosth3Backup
)(
int
,
int
)
=
nullptr
;
void
(
*
dosth4Backup
)()
=
nullptr
;
void
(
*
dosth4Backup2
)()
=
nullptr
;
void
(
*
innerSuspendVM
)()
=
nullptr
;
static
void
(
*
heapPreForkBackup
)(
void
*
)
=
nullptr
;
static
void
myHeapPreFork
(
void
*
heap
)
{
heapPreForkBackup
(
heap
);
}
void
SuspendVMReplace
()
{
LOGE
(
"VM Suspend!"
);
innerSuspendVM
();
}
void
do2
()
{
int
a
=
1
+
1
;
int
b
=
1
+
1
;
int
c
=
1
+
1
;
int
d
=
1
+
1
;
}
void
do3
(
int
x
,
int
y
)
{
do2
();
int
a
=
1
+
1
;
int
b
=
1
+
1
;
int
c
=
1
+
1
;
int
d
=
a
+
b
+
c
;
LOGE
(
"do3 = %d"
,
y
);
}
void
do5
()
{
LOGE
(
"x = %d"
,
5
);
}
void
do4
()
{
int
a
=
1
+
1
;
int
b
=
a
+
1
;
int
d
=
a
+
1
;
int
e
=
a
+
1
;
LOGE
(
"x = %d"
,
7
);
}
void
do4replace
()
{
int
a
=
1
+
1
;
int
b
=
1
+
1
;
int
c
=
1
+
1
;
int
d
=
1
+
1
;
dosth4Backup
();
}
void
do4replace2
()
{
int
a
=
1
+
1
;
int
c
=
1
+
1
;
int
d
=
1
+
1
;
dosth4Backup2
();
}
void
do3replace
(
int
x
,
int
y
)
{
int
a
=
1
+
1
;
int
b
=
1
+
1
;
int
c
=
1
+
1
;
int
d
=
1
+
1
;
dosth3Backup
(
x
,
y
);
}
void
do1
()
{
do2
();
}
void
breakCallback
(
REG
regs
[])
{
LOGE
(
"breakCallback = %d SP = %d"
,
regs
[
0
],
regs
);
}
class
Visitor
:
public
InstVisitor
{
bool
Visit
(
Unit
<
Base
>
*
unit
,
void
*
pc
)
override
{
BaseInst
*
instruction
=
reinterpret_cast
<
BaseInst
*>
(
unit
);
instruction
->
Assemble
();
return
true
;
}
};
extern
"C"
JNIEXPORT
void
JNICALL
Java_com_swift_sandhook_nativehook_NativeHook_test
(
JNIEnv
*
env
,
jclass
jclass1
)
{
dosth4Backup
=
reinterpret_cast
<
void
(
*
)()
>
(
InlineHook
::
instance
->
Hook
(
reinterpret_cast
<
void
*>
(
do4
),
reinterpret_cast
<
void
*>
(
do4replace
)));
dosth4Backup2
=
reinterpret_cast
<
void
(
*
)()
>
(
InlineHook
::
instance
->
Hook
(
reinterpret_cast
<
void
*>
(
do4
),
reinterpret_cast
<
void
*>
(
do4replace2
)));
do4
();
if
(
sizeof
(
void
*
)
==
8
)
{
heapPreForkBackup
=
reinterpret_cast
<
void
(
*
)(
void
*
)
>
(
SandInlineHookSym
(
"/system/lib64/libart.so"
,
"_ZN3art2gc4Heap13PreZygoteForkEv"
,
reinterpret_cast
<
void
*>
(
myHeapPreFork
)));
innerSuspendVM
=
reinterpret_cast
<
void
(
*
)()
>
(
SandInlineHookSym
(
"/system/lib64/libart.so"
,
"_ZN3art3Dbg9SuspendVMEv"
,
reinterpret_cast
<
void
*>
(
SuspendVMReplace
)));
}
else
{
heapPreForkBackup
=
reinterpret_cast
<
void
(
*
)(
void
*
)
>
(
SandInlineHookSym
(
"/system/lib/libart.so"
,
"_ZN3art2gc4Heap13PreZygoteForkEv"
,
reinterpret_cast
<
void
*>
(
myHeapPreFork
)));
innerSuspendVM
=
reinterpret_cast
<
void
(
*
)()
>
(
SandInlineHookSym
(
"/system/lib/libart.so"
,
"_ZN3art3Dbg9SuspendVMEv"
,
reinterpret_cast
<
void
*>
(
SuspendVMReplace
)));
}
void
*
do3P
=
reinterpret_cast
<
void
*>
(
do3
);
InlineHook
::
instance
->
BreakPoint
(
reinterpret_cast
<
void
*>
((
Addr
)
do3
),
breakCallback
);
LOGE
(
"ok"
);
do3
(
100
,
2
);
}
extern
"C"
EXPORT
void
*
SandGetSym
(
const
char
*
so
,
const
char
*
symb
)
{
...
...
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