Commit d70a536b authored by swift_gan's avatar swift_gan

done trampoline

parent 812a4598
...@@ -19,6 +19,7 @@ add_library( # Sets the name of the library. ...@@ -19,6 +19,7 @@ add_library( # Sets the name of the library.
# Provides a relative path to your source file(s). # Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp src/main/cpp/native-lib.cpp
src/main/cpp/trampoline/trampoline.cpp src/main/cpp/trampoline/trampoline.cpp
src/main/cpp/trampoline/trampoline_manager.cpp
src/main/cpp/trampoline/arch/arm32.S src/main/cpp/trampoline/arch/arm32.S
src/main/cpp/trampoline/arch/arm64.S src/main/cpp/trampoline/arch/arm64.S
) )
......
...@@ -11,7 +11,6 @@ namespace SandHook { ...@@ -11,7 +11,6 @@ namespace SandHook {
#define BYTE_POINT sizeof(void*) #define BYTE_POINT sizeof(void*)
//32bit //32bit
#if defined(__i386__) || defined(__arm__) #if defined(__i386__) || defined(__arm__)
#define ADDR(addr) *((uint32_t *) addr) #define ADDR(addr) *((uint32_t *) addr)
......
...@@ -3,6 +3,78 @@ ...@@ -3,6 +3,78 @@
// //
#include "trampoline.h" #include "trampoline.h"
#include "stdlib.h" #include "stdlib.h"
#include "map"
namespace SandHook {
class DirectJumpTrampoline : public Trampoline {
public:
DirectJumpTrampoline() : Trampoline::Trampoline() {}
void setJumpTarget(Code target) {
codeCopy(reinterpret_cast<char *>(&target), OFFSET_JUMP_ADDR_TARGET, BYTE_POINT);
}
protected:
Size codeLength() override {
return SIZE_DIRECT_JUMP_TRAMPOLINE;
}
Code templateCode() override {
return reinterpret_cast<char*>(DIRECT_JUMP_TRAMPOLINE);
}
};
class ReplacementHookTrampoline : public Trampoline {
public:
void setHookMethod(Code hookMethod) {
codeCopy(reinterpret_cast<char*>(&hookMethod), OFFSET_REPLACEMENT_ADDR_ART_METHOD, BYTE_POINT);
}
void setEntryCodeOffset(Size offSet) {
codeCopy(reinterpret_cast<char*>(&offSet), OFFSET_REPLACEMENT_OFFSET_ENTRY_CODE, BYTE_POINT);
}
protected:
Size codeLength() override {
return SIZE_REPLACEMENT_HOOK_TRAMPOLINE;
}
Code templateCode() override {
return reinterpret_cast<char*>(REPLACEMENT_HOOK_TRAMPOLINE);
}
};
class InlineHookTrampoline : public Trampoline {
public:
void setOriginMethod(Code originMethod) {
codeCopy(reinterpret_cast<char*>(&originMethod), OFFSET_INLINE_ADDR_ORIGIN_METHOD, BYTE_POINT);
}
void setHookMethod(Code hookMethod) {
codeCopy(reinterpret_cast<char*>(&hookMethod), OFFSET_INLINE_ADDR_HOOK_METHOD, BYTE_POINT);
}
void setEntryCodeOffset(Size offSet) {
codeCopy(reinterpret_cast<char*>(&offSet), OFFSET_INLINE_OFFSET_ENTRY_CODE, BYTE_POINT);
}
void setOriginCode(Code originCode) {
codeCopy(originCode, OFFSET_INLINE_ORIGIN_CODE, SIZE_DIRECT_JUMP_TRAMPOLINE);
}
protected:
Size codeLength() override {
return SIZE_REPLACEMENT_HOOK_TRAMPOLINE;
}
Code templateCode() override {
return reinterpret_cast<char*>(REPLACEMENT_HOOK_TRAMPOLINE);
}
};
}
...@@ -5,24 +5,109 @@ ...@@ -5,24 +5,109 @@
#ifndef SANDHOOK_TRAMPOLINE_H #ifndef SANDHOOK_TRAMPOLINE_H
#define SANDHOOK_TRAMPOLINE_H #define SANDHOOK_TRAMPOLINE_H
#include <cstdint>
#include <string.h>
#include "../includes/arch.h"
#include "./arch/base.h"
#define Code char*
#if defined(__i386__) #if defined(__i386__)
#define SIZE_TRAMPOLINE = 4 * 7 #define SIZE_REPLACEMENT_HOOK_TRAMPOLINE 4 * 9
#define OFFSET_ADDR_ART_METHOD 4 * 3 #define OFFSET_REPLACEMENT_ADDR_ART_METHOD 4 * 5
#define OFFSET_ADDR_ENTRY_CODE 4 * 5 #define OFFSET_REPLACEMENT_OFFSET_ENTRY_CODE 4 * 7
#define SIZE_DIRECT_JUMP_TRAMPOLINE 4 * 4
#define OFFSET_JUMP_ADDR_TARGET 4 * 2
#define SIZE_INLINE_HOOK_TRAMPOLINE 4 * 24
#define OFFSET_INLINE_ADDR_ORIGIN_METHOD 4 * 10
#define OFFSET_INLINE_ORIGIN_CODE 4 * 12
#define OFFSET_INLINE_OFFSET_ENTRY_CODE 4 * 20
#define OFFSET_INLINE_ADDR_HOOK_METHOD 4 * 22
#elif defined(__x86_64__) #elif defined(__x86_64__)
#define SIZE_TRAMPOLINE = 4 * 7 #define SIZE_REPLACEMENT_HOOK_TRAMPOLINE 4 * 9
#define OFFSET_ADDR_ART_METHOD 4 * 3 #define OFFSET_REPLACEMENT_ADDR_ART_METHOD 4 * 5
#define OFFSET_ADDR_ENTRY_CODE 4 * 5 #define OFFSET_REPLACEMENT_OFFSET_ENTRY_CODE 4 * 7
#define SIZE_DIRECT_JUMP_TRAMPOLINE 4 * 4
#define OFFSET_JUMP_ADDR_TARGET 4 * 2
#define SIZE_INLINE_HOOK_TRAMPOLINE 4 * 24
#define OFFSET_INLINE_ADDR_ORIGIN_METHOD 4 * 10
#define OFFSET_INLINE_ORIGIN_CODE 4 * 12
#define OFFSET_INLINE_OFFSET_ENTRY_CODE 4 * 20
#define OFFSET_INLINE_ADDR_HOOK_METHOD 4 * 22
#elif defined(__arm__) #elif defined(__arm__)
#define SIZE_TRAMPOLINE = 4 * 7 #define SIZE_REPLACEMENT_HOOK_TRAMPOLINE 4 * 9
#define OFFSET_ADDR_ART_METHOD 4 * 3 #define OFFSET_REPLACEMENT_ADDR_ART_METHOD 4 * 5
#define OFFSET_ADDR_ENTRY_CODE 4 * 5 #define OFFSET_REPLACEMENT_OFFSET_ENTRY_CODE 4 * 7
#define SIZE_DIRECT_JUMP_TRAMPOLINE 4 * 4
#define OFFSET_JUMP_ADDR_TARGET 4 * 2
#define SIZE_INLINE_HOOK_TRAMPOLINE 4 * 24
#define OFFSET_INLINE_ADDR_ORIGIN_METHOD 4 * 10
#define OFFSET_INLINE_ORIGIN_CODE 4 * 12
#define OFFSET_INLINE_OFFSET_ENTRY_CODE 4 * 20
#define OFFSET_INLINE_ADDR_HOOK_METHOD 4 * 22
#elif defined(__aarch64__) #elif defined(__aarch64__)
#define SIZE_TRAMPOLINE = 4 * 7 #define SIZE_REPLACEMENT_HOOK_TRAMPOLINE 4 * 9
#define OFFSET_ADDR_ART_METHOD 4 * 3 #define OFFSET_REPLACEMENT_ADDR_ART_METHOD 4 * 5
#define OFFSET_ADDR_ENTRY_CODE 4 * 5 #define OFFSET_REPLACEMENT_OFFSET_ENTRY_CODE 4 * 7
#define SIZE_DIRECT_JUMP_TRAMPOLINE 4 * 4
#define OFFSET_JUMP_ADDR_TARGET 4 * 2
#define SIZE_INLINE_HOOK_TRAMPOLINE 4 * 24
#define OFFSET_INLINE_ADDR_ORIGIN_METHOD 4 * 10
#define OFFSET_INLINE_ORIGIN_CODE 4 * 12
#define OFFSET_INLINE_OFFSET_ENTRY_CODE 4 * 20
#define OFFSET_INLINE_ADDR_HOOK_METHOD 4 * 22
#else
#endif #endif
extern void DIRECT_JUMP_TRAMPOLINE();
extern void INLINE_HOOK_TRAMPOLINE();
extern void REPLACEMENT_HOOK_TRAMPOLINE();
namespace SandHook {
class Trampoline {
public:
Trampoline() = default;
virtual void init() {
codeLen = codeLength();
tempCode = templateCode();
}
const void setExcuteSpace(Code start) {
code = start;
memcpy(code, tempCode, codeLen);
}
const void codeCopy(Code src, Size targetOffset, Size len) {
memcpy(code + targetOffset, src, len);
}
const void clone(Code dest) {
memcpy(dest, code, codeLen);
}
const Code getCode() {
return code;
}
const Size getCodeLen() {
return codeLen;
}
protected:
virtual Size codeLength() = 0;
virtual Code templateCode() = 0;
private:
Code code;
Code tempCode;
Size codeLen;
};
}
#endif //SANDHOOK_TRAMPOLINE_H #endif //SANDHOOK_TRAMPOLINE_H
//
// Created by swift on 2019/1/20.
//
#include "trampoline_manager.h"
//
// Created by swift on 2019/1/20.
//
#ifndef SANDHOOK_TRAMPOLINE_MANAGER_H
#define SANDHOOK_TRAMPOLINE_MANAGER_H
#include "map"
#include "list"
#include "trampoline.cpp"
namespace SandHook {
class TrampolineManager {
public:
TrampolineManager() {
trampolines = {};
}
private:
std::map<void*,Trampoline*> trampolines;
};
}
#endif //SANDHOOK_TRAMPOLINE_MANAGER_H
package com.swift.sandhook;
public class ClassNeverCall {
private void neverCall() {}
}
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