Commit 6ab163a8 authored by swift_gan's avatar swift_gan

add trampoline manager

parent d70a536b
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Created by SwiftGan on 2019/1/17. // Created by SwiftGan on 2019/1/17.
// //
#include "trampoline.h" #include "trampoline.h"
#include "stdlib.h"
#include "map"
namespace SandHook { namespace SandHook {
...@@ -13,7 +11,7 @@ namespace SandHook { ...@@ -13,7 +11,7 @@ namespace SandHook {
DirectJumpTrampoline() : Trampoline::Trampoline() {} DirectJumpTrampoline() : Trampoline::Trampoline() {}
void setJumpTarget(Code target) { void setJumpTarget(Code target) {
codeCopy(reinterpret_cast<char *>(&target), OFFSET_JUMP_ADDR_TARGET, BYTE_POINT); codeCopy(reinterpret_cast<Code>(&target), OFFSET_JUMP_ADDR_TARGET, BYTE_POINT);
} }
protected: protected:
...@@ -22,7 +20,7 @@ namespace SandHook { ...@@ -22,7 +20,7 @@ namespace SandHook {
} }
Code templateCode() override { Code templateCode() override {
return reinterpret_cast<char*>(DIRECT_JUMP_TRAMPOLINE); return reinterpret_cast<Code>(DIRECT_JUMP_TRAMPOLINE);
} }
}; };
...@@ -30,11 +28,11 @@ namespace SandHook { ...@@ -30,11 +28,11 @@ namespace SandHook {
public: public:
void setHookMethod(Code hookMethod) { void setHookMethod(Code hookMethod) {
codeCopy(reinterpret_cast<char*>(&hookMethod), OFFSET_REPLACEMENT_ADDR_ART_METHOD, BYTE_POINT); codeCopy(reinterpret_cast<Code>(&hookMethod), OFFSET_REPLACEMENT_ADDR_ART_METHOD, BYTE_POINT);
} }
void setEntryCodeOffset(Size offSet) { void setEntryCodeOffset(Size offSet) {
codeCopy(reinterpret_cast<char*>(&offSet), OFFSET_REPLACEMENT_OFFSET_ENTRY_CODE, BYTE_POINT); codeCopy(reinterpret_cast<Code>(&offSet), OFFSET_REPLACEMENT_OFFSET_ENTRY_CODE, BYTE_POINT);
} }
protected: protected:
...@@ -43,7 +41,7 @@ namespace SandHook { ...@@ -43,7 +41,7 @@ namespace SandHook {
} }
Code templateCode() override { Code templateCode() override {
return reinterpret_cast<char*>(REPLACEMENT_HOOK_TRAMPOLINE); return reinterpret_cast<Code>(REPLACEMENT_HOOK_TRAMPOLINE);
} }
}; };
...@@ -51,15 +49,15 @@ namespace SandHook { ...@@ -51,15 +49,15 @@ namespace SandHook {
public: public:
void setOriginMethod(Code originMethod) { void setOriginMethod(Code originMethod) {
codeCopy(reinterpret_cast<char*>(&originMethod), OFFSET_INLINE_ADDR_ORIGIN_METHOD, BYTE_POINT); codeCopy(reinterpret_cast<Code>(&originMethod), OFFSET_INLINE_ADDR_ORIGIN_METHOD, BYTE_POINT);
} }
void setHookMethod(Code hookMethod) { void setHookMethod(Code hookMethod) {
codeCopy(reinterpret_cast<char*>(&hookMethod), OFFSET_INLINE_ADDR_HOOK_METHOD, BYTE_POINT); codeCopy(reinterpret_cast<Code>(&hookMethod), OFFSET_INLINE_ADDR_HOOK_METHOD, BYTE_POINT);
} }
void setEntryCodeOffset(Size offSet) { void setEntryCodeOffset(Size offSet) {
codeCopy(reinterpret_cast<char*>(&offSet), OFFSET_INLINE_OFFSET_ENTRY_CODE, BYTE_POINT); codeCopy(reinterpret_cast<Code>(&offSet), OFFSET_INLINE_OFFSET_ENTRY_CODE, BYTE_POINT);
} }
void setOriginCode(Code originCode) { void setOriginCode(Code originCode) {
...@@ -72,7 +70,7 @@ namespace SandHook { ...@@ -72,7 +70,7 @@ namespace SandHook {
} }
Code templateCode() override { Code templateCode() override {
return reinterpret_cast<char*>(REPLACEMENT_HOOK_TRAMPOLINE); return reinterpret_cast<Code>(REPLACEMENT_HOOK_TRAMPOLINE);
} }
}; };
......
...@@ -9,8 +9,9 @@ ...@@ -9,8 +9,9 @@
#include <string.h> #include <string.h>
#include "../includes/arch.h" #include "../includes/arch.h"
#include "./arch/base.h" #include "./arch/base.h"
#include "stdlib.h"
#define Code char* #define Code unsigned char *
#if defined(__i386__) #if defined(__i386__)
#define SIZE_REPLACEMENT_HOOK_TRAMPOLINE 4 * 9 #define SIZE_REPLACEMENT_HOOK_TRAMPOLINE 4 * 9
...@@ -67,9 +68,9 @@ ...@@ -67,9 +68,9 @@
#else #else
#endif #endif
extern void DIRECT_JUMP_TRAMPOLINE(); extern "C" void DIRECT_JUMP_TRAMPOLINE();
extern void INLINE_HOOK_TRAMPOLINE(); extern "C" void INLINE_HOOK_TRAMPOLINE();
extern void REPLACEMENT_HOOK_TRAMPOLINE(); extern "C" void REPLACEMENT_HOOK_TRAMPOLINE();
namespace SandHook { namespace SandHook {
...@@ -82,7 +83,7 @@ namespace SandHook { ...@@ -82,7 +83,7 @@ namespace SandHook {
codeLen = codeLength(); codeLen = codeLength();
tempCode = templateCode(); tempCode = templateCode();
} }
const void setExcuteSpace(Code start) { const void setExecuteSpace(Code start) {
code = start; code = start;
memcpy(code, tempCode, codeLen); memcpy(code, tempCode, codeLen);
} }
......
...@@ -3,4 +3,57 @@ ...@@ -3,4 +3,57 @@
// //
#include "trampoline_manager.h" #include "trampoline_manager.h"
namespace SandHook {
void TrampolineManager::init() {
}
Code TrampolineManager::allocExecuteSpace(Size size) {
if (size > MMAP_PAGE_SIZE)
return 0;
AutoLock autoLock(allocSpaceLock);
void* mmapRes;
Code exeSpace = 0;
if (executeSpaceList.size() == 0) {
goto label_alloc_new_space;
} else if (executePageOffset + size > MMAP_PAGE_SIZE) {
goto label_alloc_new_space;
} else {
exeSpace = executeSpaceList.back();
Code retSpace = exeSpace + executePageOffset;
executePageOffset += size;
return retSpace;
}
label_alloc_new_space:
mmapRes = mmap(NULL, MMAP_PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_ANON | MAP_PRIVATE, -1, 0);
if (mmapRes == MAP_FAILED) {
return 0;
}
exeSpace = static_cast<Code>(mmapRes);
executeSpaceList.push_back(exeSpace);
executePageOffset = size;
return exeSpace;
}
HookTrampoline* TrampolineManager::installReplacementTrampoline(void *originMethod,
void *hookMethod,
void *backupMethod) {
if (trampolines.count(originMethod) != 0)
return getHookTrampoline(originMethod);
HookTrampoline* hookTrampoline = new HookTrampoline();
}
HookTrampoline* TrampolineManager::installInlineTrampoline(void *originMethod, void *hookMethod,
void *backupMethod) {
if (trampolines.count(originMethod) != 0)
return getHookTrampoline(originMethod);
HookTrampoline* hookTrampoline = new HookTrampoline();
DirectJumpTrampoline* directJumpTrampoline = new DirectJumpTrampoline();
}
}
...@@ -8,16 +8,45 @@ ...@@ -8,16 +8,45 @@
#include "map" #include "map"
#include "list" #include "list"
#include "trampoline.cpp" #include "trampoline.cpp"
#include "../utils/lock.h"
#include <sys/mman.h>
namespace SandHook { namespace SandHook {
#define MMAP_PAGE_SIZE 4 * 1024
class HookTrampoline {
public:
HookTrampoline() = default;
Trampoline* replacement;
Trampoline* inlineJump;
Trampoline* inlineSecondory;
Trampoline* callOrigin;
};
class TrampolineManager { class TrampolineManager {
public: public:
TrampolineManager() { TrampolineManager() = default;
trampolines = {}; void init();
Code allocExecuteSpace(Size size);
HookTrampoline* installReplacementTrampoline(void* originMethod, void* hookMethod, void* backupMethod);
HookTrampoline* installInlineTrampoline(void* originMethod, void* hookMethod, void* backupMethod);
HookTrampoline* getHookTrampoline(void* method) {
return trampolines[method];
} }
private: private:
std::map<void*,Trampoline*> trampolines; std::map<void*,HookTrampoline*> trampolines = {};
std::list<Code> executeSpaceList = std::list<Code>();
std::mutex allocSpaceLock;
std::mutex installLock;
Size executePageOffset = 0;
}; };
} }
......
//
// Created by SwiftGan on 2019/1/21.
//
#ifndef SANDHOOK_LOCK_H
#define SANDHOOK_LOCK_H
#include "mutex"
namespace SandHook {
class AutoLock {
public:
inline AutoLock(std::mutex& mutex) : mLock(mutex) { mLock.lock(); }
inline AutoLock(std::mutex* mutex) : mLock(*mutex) { mLock.lock(); }
inline ~AutoLock() { mLock.unlock(); }
private:
std::mutex& mLock;
};
}
#endif //SANDHOOK_LOCK_H
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