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
c6f7398e
Commit
c6f7398e
authored
May 08, 2019
by
swift_gan
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
aefda1dd
417f1802
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
55 additions
and
86 deletions
+55
-86
CMakeLists.txt
hooklib/CMakeLists.txt
+0
-66
build.gradle
hooklib/build.gradle
+2
-2
CMakeLists.txt
hooklib/src/main/cpp/CMakeLists.txt
+32
-0
cast_art_method.cpp
hooklib/src/main/cpp/casts/cast_art_method.cpp
+2
-2
arch_base.h
hooklib/src/main/cpp/includes/arch_base.h
+1
-0
elf_util.h
hooklib/src/main/cpp/includes/elf_util.h
+1
-1
trampoline.h
hooklib/src/main/cpp/includes/trampoline.h
+1
-0
trampoline_manager.cpp
hooklib/src/main/cpp/trampoline/trampoline_manager.cpp
+1
-1
dlfcn_nougat.cpp
hooklib/src/main/cpp/utils/dlfcn_nougat.cpp
+1
-0
elf_util.cpp
hooklib/src/main/cpp/utils/elf_util.cpp
+7
-7
hide_api.cpp
hooklib/src/main/cpp/utils/hide_api.cpp
+7
-7
No files found.
hooklib/CMakeLists.txt
deleted
100644 → 0
View file @
aefda1dd
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required
(
VERSION 3.4.1
)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
add_library
(
# Sets the name of the library.
sandhook
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/sandhook.cpp
src/main/cpp/trampoline/trampoline.cpp
src/main/cpp/trampoline/trampoline_manager.cpp
src/main/cpp/utils/dlfcn_nougat.cpp
src/main/cpp/utils/hide_api.cpp
src/main/cpp/utils/utils.cpp
src/main/cpp/utils/offset.cpp
src/main/cpp/utils/elf_util.cpp
src/main/cpp/casts/cast_art_method.cpp
src/main/cpp/casts/cast_compiler_options.cpp
src/main/cpp/art/art_method.cpp
src/main/cpp/art/art_compiler_options.cpp
src/main/cpp/trampoline/arch/arm32.S
src/main/cpp/trampoline/arch/arm64.S
src/main/cpp/inst/insts_arm32.cpp
src/main/cpp/inst/insts_arm64.cpp
src/main/cpp/nativehook/native_hook.cpp
)
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
find_library
(
# Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log
)
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries
(
# Specifies the target library.
sandhook
# Links the target library to the log library
# included in the NDK.
${
log-lib
}
)
add_definitions
(
-std=c++11
)
ENABLE_LANGUAGE
(
ASM
)
\ No newline at end of file
hooklib/build.gradle
View file @
c6f7398e
...
@@ -13,7 +13,7 @@ android {
...
@@ -13,7 +13,7 @@ android {
externalNativeBuild
{
externalNativeBuild
{
cmake
{
cmake
{
arguments
'-DBUILD_TESTING=OFF'
,
'-DANDROID_TOOLCHAIN=gcc'
arguments
'-DBUILD_TESTING=OFF'
cppFlags
"-frtti -fexceptions"
cppFlags
"-frtti -fexceptions"
abiFilters
'armeabi-v7a'
,
'arm64-v8a'
abiFilters
'armeabi-v7a'
,
'arm64-v8a'
}
}
...
@@ -22,7 +22,7 @@ android {
...
@@ -22,7 +22,7 @@ android {
externalNativeBuild
{
externalNativeBuild
{
cmake
{
cmake
{
path
"CMakeLists.txt"
path
"
src/main/cpp/
CMakeLists.txt"
}
}
}
}
...
...
hooklib/src/main/cpp/CMakeLists.txt
0 → 100644
View file @
c6f7398e
cmake_minimum_required
(
VERSION 3.4.1
)
project
(
sandhook
)
ENABLE_LANGUAGE
(
ASM
)
set
(
${
PROJECT_NAME
}
_SOURCES
sandhook.cpp
trampoline/trampoline.cpp
trampoline/trampoline_manager.cpp
utils/dlfcn_nougat.cpp
utils/hide_api.cpp
utils/utils.cpp
utils/offset.cpp
utils/elf_util.cpp
casts/cast_art_method.cpp
casts/cast_compiler_options.cpp
art/art_method.cpp
art/art_compiler_options.cpp
trampoline/arch/arm32.S
trampoline/arch/arm64.S
inst/insts_arm32.cpp
inst/insts_arm64.cpp
nativehook/native_hook.cpp
)
add_definitions
(
-std=c++11
)
add_library
(
${
PROJECT_NAME
}
SHARED
${${
PROJECT_NAME
}
_SOURCES
}
)
target_link_libraries
(
${
PROJECT_NAME
}
log
)
\ No newline at end of file
hooklib/src/main/cpp/casts/cast_art_method.cpp
View file @
c6f7398e
...
@@ -215,7 +215,7 @@ namespace SandHook {
...
@@ -215,7 +215,7 @@ namespace SandHook {
bool
beAot
=
entryPointQuickCompiled
->
get
(
neverCall
)
!=
entryPointQuickCompiled
->
get
(
neverCall2
);
bool
beAot
=
entryPointQuickCompiled
->
get
(
neverCall
)
!=
entryPointQuickCompiled
->
get
(
neverCall2
);
if
(
beAot
)
{
if
(
beAot
)
{
quickToInterpreterBridge
=
getInterpreterBridge
(
false
);
quickToInterpreterBridge
=
getInterpreterBridge
(
false
);
if
(
quickToInterpreterBridge
==
nullptr
||
quickToInterpreterBridge
<=
0
)
{
if
(
quickToInterpreterBridge
==
nullptr
)
{
quickToInterpreterBridge
=
entryPointQuickCompiled
->
get
(
neverCall
);
quickToInterpreterBridge
=
entryPointQuickCompiled
->
get
(
neverCall
);
canGetInterpreterBridge
=
false
;
canGetInterpreterBridge
=
false
;
}
}
...
@@ -232,7 +232,7 @@ namespace SandHook {
...
@@ -232,7 +232,7 @@ namespace SandHook {
beAot
=
entryPointQuickCompiled
->
get
(
neverCallNative
)
!=
entryPointQuickCompiled
->
get
(
neverCallNative2
);
beAot
=
entryPointQuickCompiled
->
get
(
neverCallNative
)
!=
entryPointQuickCompiled
->
get
(
neverCallNative2
);
if
(
beAot
)
{
if
(
beAot
)
{
genericJniStub
=
getInterpreterBridge
(
true
);
genericJniStub
=
getInterpreterBridge
(
true
);
if
(
genericJniStub
==
nullptr
||
genericJniStub
<=
0
)
{
if
(
genericJniStub
==
nullptr
)
{
genericJniStub
=
entryPointQuickCompiled
->
get
(
neverCallNative
);
genericJniStub
=
entryPointQuickCompiled
->
get
(
neverCallNative
);
canGetJniBridge
=
false
;
canGetJniBridge
=
false
;
}
}
...
...
hooklib/src/main/cpp/includes/arch_base.h
View file @
c6f7398e
...
@@ -15,6 +15,7 @@ x: \
...
@@ -15,6 +15,7 @@ x: \
.syntax unified; \
.syntax unified; \
.text; \
.text; \
.align 4; \
.align 4; \
.thumb; \
.thumb_func; \
.thumb_func; \
.global x; \
.global x; \
x: \
x: \
...
...
hooklib/src/main/cpp/includes/elf_util.h
View file @
c6f7398e
...
@@ -45,7 +45,7 @@ namespace SandHook {
...
@@ -45,7 +45,7 @@ namespace SandHook {
private
:
private
:
const
char
*
elf
=
nullptr
;
const
char
*
elf
=
nullptr
;
void
*
base
=
nullptr
;
uint8_t
*
base
=
nullptr
;
char
*
buffer
=
nullptr
;
char
*
buffer
=
nullptr
;
off_t
size
=
0
;
off_t
size
=
0
;
off_t
bias
=
-
4396
;
off_t
bias
=
-
4396
;
...
...
hooklib/src/main/cpp/includes/trampoline.h
View file @
c6f7398e
...
@@ -90,6 +90,7 @@ extern "C" void REPLACEMENT_HOOK_TRAMPOLINE();
...
@@ -90,6 +90,7 @@ extern "C" void REPLACEMENT_HOOK_TRAMPOLINE();
extern
"C"
void
CALL_ORIGIN_TRAMPOLINE
();
extern
"C"
void
CALL_ORIGIN_TRAMPOLINE
();
#if defined(__arm__)
#if defined(__arm__)
#include <unistd.h>
extern
"C"
void
DIRECT_JUMP_TRAMPOLINE_T
();
extern
"C"
void
DIRECT_JUMP_TRAMPOLINE_T
();
extern
"C"
void
INLINE_HOOK_TRAMPOLINE_T
();
extern
"C"
void
INLINE_HOOK_TRAMPOLINE_T
();
extern
"C"
void
CALL_ORIGIN_TRAMPOLINE_T
();
extern
"C"
void
CALL_ORIGIN_TRAMPOLINE_T
();
...
...
hooklib/src/main/cpp/trampoline/trampoline_manager.cpp
View file @
c6f7398e
...
@@ -14,7 +14,7 @@ namespace SandHook {
...
@@ -14,7 +14,7 @@ namespace SandHook {
uint32_t
TrampolineManager
::
sizeOfEntryCode
(
mirror
::
ArtMethod
*
method
)
{
uint32_t
TrampolineManager
::
sizeOfEntryCode
(
mirror
::
ArtMethod
*
method
)
{
Code
codeEntry
=
getEntryCode
(
method
);
Code
codeEntry
=
getEntryCode
(
method
);
if
(
codeEntry
==
nullptr
||
codeEntry
<=
0
)
if
(
codeEntry
==
nullptr
)
return
0
;
return
0
;
#if defined(__arm__)
#if defined(__arm__)
if
(
isThumbCode
(
reinterpret_cast
<
Size
>
(
codeEntry
)))
{
if
(
isThumbCode
(
reinterpret_cast
<
Size
>
(
codeEntry
)))
{
...
...
hooklib/src/main/cpp/utils/dlfcn_nougat.cpp
View file @
c6f7398e
...
@@ -260,6 +260,7 @@ void *getSymCompat(const char *filename, const char *name) {
...
@@ -260,6 +260,7 @@ void *getSymCompat(const char *filename, const char *name) {
return
dlsym
(
handle
,
name
);
return
dlsym
(
handle
,
name
);
}
}
}
}
return
nullptr
;
}
}
}
}
\ No newline at end of file
hooklib/src/main/cpp/utils/elf_util.cpp
View file @
c6f7398e
...
@@ -31,10 +31,10 @@ ElfImg::ElfImg(const char *elf) {
...
@@ -31,10 +31,10 @@ ElfImg::ElfImg(const char *elf) {
Elf_Off
symtab_entsize
=
0
;
Elf_Off
symtab_entsize
=
0
;
section_header
=
reinterpret_cast
<
Elf_Shdr
*>
(((
void
*
)
header
)
+
header
->
e_shoff
);
section_header
=
reinterpret_cast
<
Elf_Shdr
*>
(((
uint8_t
*
)
header
)
+
header
->
e_shoff
);
void
*
shoff
=
section_header
;
uint8_t
*
shoff
=
reinterpret_cast
<
uint8_t
*>
(
section_header
)
;
char
*
section_str
=
reinterpret_cast
<
char
*>
(
section_header
[
header
->
e_shstrndx
].
sh_offset
+
((
void
*
)
header
));
char
*
section_str
=
reinterpret_cast
<
char
*>
(
section_header
[
header
->
e_shstrndx
].
sh_offset
+
((
uint8_t
*
)
header
));
bool
has_strtab
=
false
;
bool
has_strtab
=
false
;
bool
has_dynsym
=
false
;
bool
has_dynsym
=
false
;
...
@@ -75,10 +75,10 @@ ElfImg::ElfImg(const char *elf) {
...
@@ -75,10 +75,10 @@ ElfImg::ElfImg(const char *elf) {
LOGW
(
"can't find symtab from sections
\n
"
);
LOGW
(
"can't find symtab from sections
\n
"
);
}
}
sym_start
=
reinterpret_cast
<
Elf_Sym
*>
(((
void
*
)
header
)
+
symtab_offset
);
sym_start
=
reinterpret_cast
<
Elf_Sym
*>
(((
uint8_t
*
)
header
)
+
symtab_offset
);
//load module base
//load module base
base
=
getModuleBase
(
elf
);
base
=
reinterpret_cast
<
uint8_t
*>
(
getModuleBase
(
elf
)
);
}
}
ElfImg
::~
ElfImg
()
{
ElfImg
::~
ElfImg
()
{
...
@@ -97,7 +97,7 @@ Elf_Addr ElfImg::getSymbOffset(const char *name) {
...
@@ -97,7 +97,7 @@ Elf_Addr ElfImg::getSymbOffset(const char *name) {
Elf_Addr
_offset
=
0
;
Elf_Addr
_offset
=
0
;
for
(
int
i
=
0
;
i
<
symtab_count
;
i
++
)
{
for
(
int
i
=
0
;
i
<
symtab_count
;
i
++
)
{
unsigned
int
st_type
=
ELF_ST_TYPE
(
sym_start
[
i
].
st_info
);
unsigned
int
st_type
=
ELF_ST_TYPE
(
sym_start
[
i
].
st_info
);
char
*
st_name
=
static_cast
<
char
*>
(((
void
*
)
header
)
+
symstr_offset
+
sym_start
[
i
].
st_name
);
char
*
st_name
=
reinterpret_cast
<
char
*>
(((
uint8_t
*
)
header
)
+
symstr_offset
+
sym_start
[
i
].
st_name
);
if
(
st_type
==
STT_FUNC
&&
sym_start
[
i
].
st_size
)
{
if
(
st_type
==
STT_FUNC
&&
sym_start
[
i
].
st_size
)
{
if
(
strcmp
(
st_name
,
name
)
==
0
)
{
if
(
strcmp
(
st_name
,
name
)
==
0
)
{
_offset
=
sym_start
[
i
].
st_value
;
_offset
=
sym_start
[
i
].
st_value
;
...
@@ -111,7 +111,7 @@ Elf_Addr ElfImg::getSymbOffset(const char *name) {
...
@@ -111,7 +111,7 @@ Elf_Addr ElfImg::getSymbOffset(const char *name) {
Elf_Addr
ElfImg
::
getSymbAddress
(
const
char
*
name
)
{
Elf_Addr
ElfImg
::
getSymbAddress
(
const
char
*
name
)
{
Elf_Addr
offset
=
getSymbOffset
(
name
);
Elf_Addr
offset
=
getSymbOffset
(
name
);
if
(
offset
>
0
&&
base
>
0
)
{
if
(
offset
>
0
&&
base
!=
nullptr
)
{
return
reinterpret_cast
<
Elf_Addr
>
(
base
+
offset
-
bias
);
return
reinterpret_cast
<
Elf_Addr
>
(
base
+
offset
-
bias
);
}
else
{
}
else
{
return
0
;
return
0
;
...
...
hooklib/src/main/cpp/utils/hide_api.cpp
View file @
c6f7398e
...
@@ -60,7 +60,7 @@ extern "C" {
...
@@ -60,7 +60,7 @@ extern "C" {
bool
generate_debug_info
=
false
;
bool
generate_debug_info
=
false
;
jitCompilerHandle
=
(
jitLoad
)(
&
generate_debug_info
);
jitCompilerHandle
=
(
jitLoad
)(
&
generate_debug_info
);
if
(
jitCompilerHandle
!=
nullptr
&&
jitCompilerHandle
>
0
)
{
if
(
jitCompilerHandle
!=
nullptr
)
{
art
::
CompilerOptions
*
compilerOptions
=
getCompilerOptions
(
art
::
CompilerOptions
*
compilerOptions
=
getCompilerOptions
(
reinterpret_cast
<
art
::
jit
::
JitCompiler
*>
(
jitCompilerHandle
));
reinterpret_cast
<
art
::
jit
::
JitCompiler
*>
(
jitCompilerHandle
));
disableJitInline
(
compilerOptions
);
disableJitInline
(
compilerOptions
);
...
@@ -106,7 +106,7 @@ extern "C" {
...
@@ -106,7 +106,7 @@ extern "C" {
}
}
bool
canCompile
()
{
bool
canCompile
()
{
if
(
getGlobalJitCompiler
()
==
nullptr
||
getGlobalJitCompiler
()
<=
0
)
{
if
(
getGlobalJitCompiler
()
==
nullptr
)
{
LOGE
(
"JIT not init!"
);
LOGE
(
"JIT not init!"
);
return
false
;
return
false
;
}
}
...
@@ -165,7 +165,7 @@ extern "C" {
...
@@ -165,7 +165,7 @@ extern "C" {
art
::
jit
::
JitCompiler
*
getGlobalJitCompiler
()
{
art
::
jit
::
JitCompiler
*
getGlobalJitCompiler
()
{
if
(
SDK_INT
<
ANDROID_N
)
if
(
SDK_INT
<
ANDROID_N
)
return
nullptr
;
return
nullptr
;
if
(
globalJitCompileHandlerAddr
==
nullptr
||
globalJitCompileHandlerAddr
<=
0
)
if
(
globalJitCompileHandlerAddr
==
nullptr
)
return
nullptr
;
return
nullptr
;
return
*
globalJitCompileHandlerAddr
;
return
*
globalJitCompileHandlerAddr
;
}
}
...
@@ -181,7 +181,7 @@ extern "C" {
...
@@ -181,7 +181,7 @@ extern "C" {
}
}
bool
disableJitInline
(
art
::
CompilerOptions
*
compilerOptions
)
{
bool
disableJitInline
(
art
::
CompilerOptions
*
compilerOptions
)
{
if
(
compilerOptions
==
nullptr
||
compilerOptions
<=
0
)
if
(
compilerOptions
==
nullptr
)
return
false
;
return
false
;
size_t
originOptions
=
compilerOptions
->
getInlineMaxCodeUnits
();
size_t
originOptions
=
compilerOptions
->
getInlineMaxCodeUnits
();
//maybe a real inlineMaxCodeUnits
//maybe a real inlineMaxCodeUnits
...
@@ -213,17 +213,17 @@ extern "C" {
...
@@ -213,17 +213,17 @@ extern "C" {
if
(
SDK_INT
<
ANDROID_Q
)
if
(
SDK_INT
<
ANDROID_Q
)
return
false
;
return
false
;
if
(
origin_jit_update_options
==
nullptr
if
(
origin_jit_update_options
==
nullptr
||
origin_jit_update_options
<=
0
||
*
origin_jit_update_options
==
nullptr
)
||
*
origin_jit_update_options
==
nullptr
||
*
origin_jit_update_options
<=
0
)
return
false
;
return
false
;
*
origin_jit_update_options
=
fake_jit_update_options
;
*
origin_jit_update_options
=
fake_jit_update_options
;
return
true
;
}
}
bool
forceProcessProfiles
()
{
bool
forceProcessProfiles
()
{
if
(
profileSaver_ForceProcessProfiles
==
nullptr
)
if
(
profileSaver_ForceProcessProfiles
==
nullptr
)
return
false
;
return
false
;
profileSaver_ForceProcessProfiles
();
profileSaver_ForceProcessProfiles
();
return
true
;
}
}
}
}
...
...
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