Commit 86cdff44 authored by swift_gan's avatar swift_gan

[ReplaceHook]set x0

parent 5bc325a2
...@@ -85,6 +85,10 @@ bool doHookWithReplacement(JNIEnv* env, ...@@ -85,6 +85,10 @@ bool doHookWithReplacement(JNIEnv* env,
if (entryPointFormInterpreter != NULL) { if (entryPointFormInterpreter != NULL) {
originMethod->setInterpreterCodeEntry(entryPointFormInterpreter); originMethod->setInterpreterCodeEntry(entryPointFormInterpreter);
} }
if (hookTrampoline->callOrigin != nullptr) {
backupMethod->setQuickCodeEntry(hookTrampoline->callOrigin->getCode());
backupMethod->flushCache();
}
originMethod->flushCache(); originMethod->flushCache();
return true; return true;
} else { } else {
...@@ -144,17 +148,19 @@ Java_com_swift_sandhook_SandHook_hookMethod(JNIEnv *env, jclass type, jobject or ...@@ -144,17 +148,19 @@ Java_com_swift_sandhook_SandHook_hookMethod(JNIEnv *env, jclass type, jobject or
bool isInlineHook = false; bool isInlineHook = false;
int mode = reinterpret_cast<int>(hookMode); int mode = reinterpret_cast<int>(hookMode);
if (mode == INLINE) { if (mode == INLINE) {
if (!origin->isCompiled()) { if (!origin->isCompiled()) {
if (SDK_INT >= ANDROID_N) { if (SDK_INT >= ANDROID_N) {
Size threadId = getAddressFromJavaByCallMethod(env, "com/swift/sandhook/SandHook", "getThreadId"); isInlineHook = origin->compile(env);
isInlineHook = compileMethod(origin, reinterpret_cast<void *>(threadId));
} }
} else { } else {
isInlineHook = true; isInlineHook = true;
} }
goto label_hook;
} else if (mode == REPLACE) { } else if (mode == REPLACE) {
isInlineHook = false; isInlineHook = false;
goto label_hook;
} }
...@@ -174,6 +180,9 @@ Java_com_swift_sandhook_SandHook_hookMethod(JNIEnv *env, jclass type, jobject or ...@@ -174,6 +180,9 @@ Java_com_swift_sandhook_SandHook_hookMethod(JNIEnv *env, jclass type, jobject or
isInlineHook = true; isInlineHook = true;
} }
label_hook:
char *msg; char *msg;
if (isInlineHook && trampolineManager.canSafeInline(origin, msg)) { if (isInlineHook && trampolineManager.canSafeInline(origin, msg)) {
......
...@@ -69,7 +69,9 @@ namespace SandHook { ...@@ -69,7 +69,9 @@ namespace SandHook {
return getHookTrampoline(originMethod); return getHookTrampoline(originMethod);
HookTrampoline* hookTrampoline = new HookTrampoline(); HookTrampoline* hookTrampoline = new HookTrampoline();
ReplacementHookTrampoline* replacementHookTrampoline = nullptr; ReplacementHookTrampoline* replacementHookTrampoline = nullptr;
CallOriginTrampoline* callOriginTrampoline = nullptr;
Code replacementHookTrampolineSpace; Code replacementHookTrampolineSpace;
Code callOriginTrampolineSpace;
replacementHookTrampoline = new ReplacementHookTrampoline(); replacementHookTrampoline = new ReplacementHookTrampoline();
replacementHookTrampoline->init(); replacementHookTrampoline->init();
...@@ -81,12 +83,31 @@ namespace SandHook { ...@@ -81,12 +83,31 @@ namespace SandHook {
replacementHookTrampoline->setHookMethod(reinterpret_cast<Code>(hookMethod)); replacementHookTrampoline->setHookMethod(reinterpret_cast<Code>(hookMethod));
hookTrampoline->replacement = replacementHookTrampoline; hookTrampoline->replacement = replacementHookTrampoline;
if (backupMethod != nullptr) {
callOriginTrampoline = new CallOriginTrampoline();
checkThumbCode(callOriginTrampoline, getEntryCode(originMethod));
callOriginTrampoline->init();
callOriginTrampolineSpace = allocExecuteSpace(callOriginTrampoline->getCodeLen());
if (callOriginTrampolineSpace == 0)
goto label_error;
callOriginTrampoline->setExecuteSpace(callOriginTrampolineSpace);
callOriginTrampoline->setOriginMethod(reinterpret_cast<Code>(originMethod));
Code originCode = getEntryCode(originMethod);
if (callOriginTrampoline->isThumbCode()) {
originCode = callOriginTrampoline->getThumbCodePcAddress(originCode);
}
callOriginTrampoline->setOriginCode(originCode);
hookTrampoline->callOrigin = callOriginTrampoline;
}
trampolines[originMethod] = hookTrampoline; trampolines[originMethod] = hookTrampoline;
return hookTrampoline; return hookTrampoline;
label_error: label_error:
delete hookTrampoline; delete hookTrampoline;
delete replacementHookTrampoline; delete replacementHookTrampoline;
if (callOriginTrampoline != nullptr)
delete callOriginTrampoline;
return nullptr; return nullptr;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment