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
4ec00964
Commit
4ec00964
authored
Mar 29, 2019
by
swift_gan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
try disable jit/aot profile
parent
c00a32aa
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
242 additions
and
0 deletions
+242
-0
MyApp.java
app/src/main/java/com/swift/sandhook/MyApp.java
+1
-0
SandHook.java
hooklib/src/main/java/com/swift/sandhook/SandHook.java
+20
-0
SandHookConfig.java
hooklib/src/main/java/com/swift/sandhook/SandHookConfig.java
+1
-0
ArtDexOptimizer.java
...c/main/java/com/swift/sandhook/utils/ArtDexOptimizer.java
+101
-0
FileUtils.java
...lib/src/main/java/com/swift/sandhook/utils/FileUtils.java
+119
-0
No files found.
app/src/main/java/com/swift/sandhook/MyApp.java
View file @
4ec00964
...
...
@@ -36,6 +36,7 @@ public class MyApp extends Application {
}
SandHook
.
disableVMInline
();
SandHook
.
tryDisableProfile
(
getPackageName
());
if
(
SandHookConfig
.
SDK_INT
>=
Build
.
VERSION_CODES
.
P
)
{
SandHook
.
passApiCheck
();
...
...
hooklib/src/main/java/com/swift/sandhook/SandHook.java
View file @
4ec00964
...
...
@@ -4,11 +4,13 @@ import android.os.Build;
import
com.swift.sandhook.annotation.HookMode
;
import
com.swift.sandhook.blacklist.HookBlackList
;
import
com.swift.sandhook.utils.FileUtils
;
import
com.swift.sandhook.utils.ReflectionUtils
;
import
com.swift.sandhook.utils.Unsafe
;
import
com.swift.sandhook.wrapper.HookErrorException
;
import
com.swift.sandhook.wrapper.HookWrapper
;
import
java.io.File
;
import
java.lang.reflect.Field
;
import
java.lang.reflect.InvocationTargetException
;
import
java.lang.reflect.Member
;
...
...
@@ -320,6 +322,24 @@ public class SandHook {
return
ReflectionUtils
.
passApiCheck
();
}
//disable JIT/AOT Profile
public
static
boolean
tryDisableProfile
(
String
selfPackageName
)
{
if
(
SandHookConfig
.
SDK_INT
<=
Build
.
VERSION_CODES
.
N
)
return
false
;
try
{
File
profile
=
new
File
(
"/data/misc/profiles/cur/"
+
SandHookConfig
.
curUse
+
"/"
+
selfPackageName
+
"/primary.prof"
);
if
(!
profile
.
getParentFile
().
exists
())
return
false
;
try
{
profile
.
delete
();
profile
.
createNewFile
();
}
catch
(
Throwable
throwable
)
{}
FileUtils
.
chmod
(
profile
.
getAbsolutePath
(),
FileUtils
.
FileMode
.
MODE_IRUSR
);
return
true
;
}
catch
(
Throwable
throwable
)
{
return
false
;
}
}
private
static
native
boolean
initNative
(
int
sdk
,
boolean
debug
);
public
static
native
void
setHookMode
(
int
hookMode
);
...
...
hooklib/src/main/java/com/swift/sandhook/SandHookConfig.java
View file @
4ec00964
...
...
@@ -11,6 +11,7 @@ public class SandHookConfig {
public
volatile
static
boolean
DEBUG
=
BuildConfig
.
DEBUG
;
public
volatile
static
boolean
compiler
=
true
;
public
volatile
static
ClassLoader
initClassLoader
;
public
volatile
static
int
curUse
=
0
;
public
volatile
static
String
libSandHookPath
;
public
volatile
static
LibLoader
libLoader
=
new
LibLoader
()
{
...
...
hooklib/src/main/java/com/swift/sandhook/utils/ArtDexOptimizer.java
0 → 100644
View file @
4ec00964
package
com
.
swift
.
sandhook
.
utils
;
import
android.os.Build
;
import
com.swift.sandhook.SandHook
;
import
com.swift.sandhook.SandHookConfig
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.concurrent.Executor
;
import
java.util.concurrent.Executors
;
/**
* @author Lody
*/
public
class
ArtDexOptimizer
{
/**
* Optimize the dex in compile mode.
*
* @param dexFilePath dex file path
* @param oatFilePath oat file path
* @throws IOException
*/
public
static
void
dexoatAndDisableInline
(
String
dexFilePath
,
String
oatFilePath
)
throws
IOException
{
final
File
oatFile
=
new
File
(
oatFilePath
);
if
(!
oatFile
.
exists
())
{
oatFile
.
getParentFile
().
mkdirs
();
}
final
List
<
String
>
commandAndParams
=
new
ArrayList
<>();
commandAndParams
.
add
(
"dex2oat"
);
// for 7.1.1, duplicate class fix
if
(
SandHookConfig
.
SDK_INT
>=
24
)
{
commandAndParams
.
add
(
"--runtime-arg"
);
commandAndParams
.
add
(
"-classpath"
);
commandAndParams
.
add
(
"--runtime-arg"
);
commandAndParams
.
add
(
"&"
);
}
commandAndParams
.
add
(
"--dex-file="
+
dexFilePath
);
commandAndParams
.
add
(
"--oat-file="
+
oatFilePath
);
commandAndParams
.
add
(
"--instruction-set="
+
(
SandHook
.
is64Bit
()
?
"arm64"
:
"arm"
));
commandAndParams
.
add
(
"--compiler-filter=everything"
);
if
(
SandHookConfig
.
SDK_INT
>=
22
&&
SandHookConfig
.
SDK_INT
<
29
)
{
commandAndParams
.
add
(
"--compile-pic"
);
}
if
(
SandHookConfig
.
SDK_INT
>
25
)
{
commandAndParams
.
add
(
"--inline-max-code-units=0"
);
}
else
{
if
(
Build
.
VERSION
.
SDK_INT
>=
23
)
{
commandAndParams
.
add
(
"--inline-depth-limit=0"
);
}
}
final
ProcessBuilder
pb
=
new
ProcessBuilder
(
commandAndParams
);
pb
.
redirectErrorStream
(
true
);
final
Process
dex2oatProcess
=
pb
.
start
();
StreamConsumer
.
consumeInputStream
(
dex2oatProcess
.
getInputStream
());
StreamConsumer
.
consumeInputStream
(
dex2oatProcess
.
getErrorStream
());
try
{
final
int
ret
=
dex2oatProcess
.
waitFor
();
if
(
ret
!=
0
)
{
throw
new
IOException
(
"dex2oat works unsuccessfully, exit code: "
+
ret
);
}
}
catch
(
InterruptedException
e
)
{
throw
new
IOException
(
"dex2oat is interrupted, msg: "
+
e
.
getMessage
(),
e
);
}
}
private
static
class
StreamConsumer
{
static
final
Executor
STREAM_CONSUMER
=
Executors
.
newSingleThreadExecutor
();
static
void
consumeInputStream
(
final
InputStream
is
)
{
STREAM_CONSUMER
.
execute
(
new
Runnable
()
{
@Override
public
void
run
()
{
if
(
is
==
null
)
{
return
;
}
final
byte
[]
buffer
=
new
byte
[
256
];
try
{
while
((
is
.
read
(
buffer
))
>
0
)
{
// To satisfy checkstyle rules.
}
}
catch
(
IOException
ignored
)
{
// Ignored.
}
finally
{
try
{
is
.
close
();
}
catch
(
Exception
ignored
)
{
// Ignored.
}
}
}
});
}
}
}
hooklib/src/main/java/com/swift/sandhook/utils/FileUtils.java
0 → 100644
View file @
4ec00964
package
com
.
swift
.
sandhook
.
utils
;
import
android.os.Build
;
import
android.system.Os
;
import
android.text.TextUtils
;
import
com.swift.sandhook.HookLog
;
import
com.swift.sandhook.SandHookConfig
;
import
java.io.BufferedReader
;
import
java.io.BufferedWriter
;
import
java.io.File
;
import
java.io.FileReader
;
import
java.io.FileWriter
;
import
java.io.IOException
;
public
class
FileUtils
{
public
static
final
boolean
IS_USING_PROTECTED_STORAGE
=
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
N
;
/**
* Delete a file or a directory and its children.
*
* @param file The directory to delete.
* @throws IOException Exception when problem occurs during deleting the directory.
*/
public
static
void
delete
(
File
file
)
throws
IOException
{
for
(
File
childFile
:
file
.
listFiles
())
{
if
(
childFile
.
isDirectory
())
{
delete
(
childFile
);
}
else
{
if
(!
childFile
.
delete
())
{
throw
new
IOException
();
}
}
}
if
(!
file
.
delete
())
{
throw
new
IOException
();
}
}
public
static
String
readLine
(
File
file
)
{
try
(
BufferedReader
reader
=
new
BufferedReader
(
new
FileReader
(
file
)))
{
return
reader
.
readLine
();
}
catch
(
Throwable
throwable
)
{
return
""
;
}
}
public
static
void
writeLine
(
File
file
,
String
line
)
{
try
{
file
.
createNewFile
();
}
catch
(
IOException
ex
)
{
}
try
(
BufferedWriter
writer
=
new
BufferedWriter
(
new
FileWriter
(
file
)))
{
writer
.
write
(
line
);
writer
.
flush
();
}
catch
(
Throwable
throwable
)
{
HookLog
.
e
(
"error writing line to file "
+
file
+
": "
+
throwable
.
getMessage
());
}
}
public
static
String
getPackageName
(
String
dataDir
)
{
if
(
TextUtils
.
isEmpty
(
dataDir
))
{
HookLog
.
e
(
"getPackageName using empty dataDir"
);
return
""
;
}
int
lastIndex
=
dataDir
.
lastIndexOf
(
"/"
);
if
(
lastIndex
<
0
)
{
return
dataDir
;
}
return
dataDir
.
substring
(
lastIndex
+
1
);
}
public
static
void
chmod
(
String
path
,
int
mode
)
throws
Exception
{
if
(
SandHookConfig
.
SDK_INT
>=
Build
.
VERSION_CODES
.
LOLLIPOP
)
{
try
{
Os
.
chmod
(
path
,
mode
);
return
;
}
catch
(
Exception
e
)
{
// ignore
}
}
File
file
=
new
File
(
path
);
String
cmd
=
"chmod "
;
if
(
file
.
isDirectory
())
{
cmd
+=
" -R "
;
}
String
cmode
=
String
.
format
(
"%o"
,
mode
);
Runtime
.
getRuntime
().
exec
(
cmd
+
cmode
+
" "
+
path
).
waitFor
();
}
public
interface
FileMode
{
int
MODE_ISUID
=
04000
;
int
MODE_ISGID
=
02000
;
int
MODE_ISVTX
=
01000
;
int
MODE_IRUSR
=
00400
;
int
MODE_IWUSR
=
00200
;
int
MODE_IXUSR
=
00100
;
int
MODE_IRGRP
=
00040
;
int
MODE_IWGRP
=
00020
;
int
MODE_IXGRP
=
00010
;
int
MODE_IROTH
=
00004
;
int
MODE_IWOTH
=
00002
;
int
MODE_IXOTH
=
00001
;
int
MODE_755
=
MODE_IRUSR
|
MODE_IWUSR
|
MODE_IXUSR
|
MODE_IRGRP
|
MODE_IXGRP
|
MODE_IROTH
|
MODE_IXOTH
;
}
public
static
String
getDataPathPrefix
()
{
return
IS_USING_PROTECTED_STORAGE
?
"/data/user_de/0/"
:
"/data/data/"
;
}
}
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