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