Commit 7a8cde98 authored by swift_gan's avatar swift_gan

add call origin trampoline

parent cfa2690d
......@@ -22,4 +22,7 @@ FUNCTION_END(DIRECT_JUMP_TRAMPOLINE)
FUNCTION_START(INLINE_HOOK_TRAMPOLINE)
FUNCTION_END(INLINE_HOOK_TRAMPOLINE)
FUNCTION_START(CALL_ORIGIN_TRAMPOLINE)
FUNCTION_END(CALL_ORIGIN_TRAMPOLINE)
#endif
\ No newline at end of file
......@@ -63,7 +63,7 @@ FUNCTION_END(INLINE_HOOK_TRAMPOLINE)
FUNCTION_START(CALL_ORIGIN_TRAMPOLINE)
ldr RegMethod, origin_art_method
ldr Reg0, addr_target
ldr Reg0, addr_origin
br Reg0
origin_art_method:
.long 0
......
......@@ -82,6 +82,27 @@ namespace SandHook {
}
};
class CallOriginTrampoline : public Trampoline {
public:
void setOriginMethod(Code originMethod) {
codeCopy(reinterpret_cast<Code>(&originMethod), OFFSET_CALL_ORIGIN_ART_METHOD, BYTE_POINT);
}
void setOriginCode(Code originCode) {
codeCopy(reinterpret_cast<Code>(&originCode), OFFSET_CALL_ORIGIN_JUMP_ADDR, BYTE_POINT);
}
protected:
Size codeLength() override {
return SIZE_CALL_ORIGIN_TRAMPOLINE;
}
Code templateCode() override {
return reinterpret_cast<Code>(CALL_ORIGIN_TRAMPOLINE);
}
};
}
#endif //SANDHOOK_TRAMPOLINE_CPP
......@@ -66,12 +66,17 @@
#define OFFSET_INLINE_ADDR_ORIGIN_METHOD 4 * 18
#define OFFSET_INLINE_OFFSET_ENTRY_CODE 4 * 20
#define OFFSET_INLINE_ADDR_HOOK_METHOD 4 * 22
#define SIZE_CALL_ORIGIN_TRAMPOLINE 4 * 7
#define OFFSET_CALL_ORIGIN_ART_METHOD 4 * 3
#define OFFSET_CALL_ORIGIN_JUMP_ADDR 4 * 5
#else
#endif
extern "C" void DIRECT_JUMP_TRAMPOLINE();
extern "C" void INLINE_HOOK_TRAMPOLINE();
extern "C" void REPLACEMENT_HOOK_TRAMPOLINE();
extern "C" void CALL_ORIGIN_TRAMPOLINE();
namespace SandHook {
......
......@@ -74,7 +74,7 @@ namespace SandHook {
HookTrampoline* hookTrampoline = new HookTrampoline();
InlineHookTrampoline* inlineHookTrampoline = nullptr;
DirectJumpTrampoline* directJumpTrampoline = nullptr;
DirectJumpTrampoline* callOriginTrampoline = nullptr;
CallOriginTrampoline* callOriginTrampoline = nullptr;
Code inlineHookTrampolineSpace;
Code callOriginTrampolineSpace;
Code originEntry;
......@@ -105,13 +105,14 @@ namespace SandHook {
//备份原始方法
if (backupMethod != nullptr) {
callOriginTrampoline = new DirectJumpTrampoline();
callOriginTrampoline = new CallOriginTrampoline();
callOriginTrampoline->init();
callOriginTrampolineSpace = allocExecuteSpace(callOriginTrampoline->getCodeLen());
if (callOriginTrampolineSpace == 0)
goto label_error;
callOriginTrampoline->setExecuteSpace(callOriginTrampolineSpace);
callOriginTrampoline->setJumpTarget(inlineHookTrampoline->getCallOriginCode());
callOriginTrampoline->setOriginMethod(reinterpret_cast<unsigned char *>(originMethod));
callOriginTrampoline->setOriginCode(inlineHookTrampoline->getCallOriginCode());
hookTrampoline->callOrigin = callOriginTrampoline;
}
......
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