mirror of
https://git.recroomarchive.org/Radium/libradhook.git
synced 2026-08-07 09:10:59 +00:00
fix: split files, add padding and return checking on disasm
This commit is contained in:
@@ -41,6 +41,7 @@ enum class RadHookResult : int {
|
||||
InvalidDetour,
|
||||
InvalidHandle,
|
||||
TrampolineTooFar,
|
||||
TargetTooSmall,
|
||||
Unknown,
|
||||
};
|
||||
|
||||
|
||||
46
include/radhook/defines.h
Normal file
46
include/radhook/defines.h
Normal file
@@ -0,0 +1,46 @@
|
||||
#ifndef __LIBRADHOOK_DEFINES_HPP__
|
||||
#define __LIBRADHOOK_DEFINES_HPP__
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstddef>
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
// platform detection
|
||||
#if !defined(RADIUM_PLATFORM_WINDOWS) && !defined(RADIUM_PLATFORM_ANDROID)
|
||||
# if defined(_WIN32) || defined(_WIN64)
|
||||
# define RADIUM_PLATFORM_WINDOWS 1
|
||||
# elif defined(__ANDROID__)
|
||||
# define RADIUM_PLATFORM_ANDROID 1
|
||||
# else
|
||||
# error "radhook: unsupported platform -- define RADIUM_PLATFORM_WINDOWS or RADIUM_PLATFORM_ANDROID"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
// architecture detection
|
||||
#if defined(_M_X64) || defined(__x86_64__)
|
||||
# define RADHOOK_ARCH_X64 1
|
||||
#elif defined(_M_ARM64) || defined(__aarch64__)
|
||||
# define RADHOOK_ARCH_ARM64 1
|
||||
#else
|
||||
# error "radhook: unsupported architecture -- need x86-64 or aarch64"
|
||||
#endif
|
||||
|
||||
// api macros
|
||||
#if defined(_WIN32)
|
||||
# if defined(RADHOOK_BUILD)
|
||||
# define RADHOOK_API __declspec(dllexport)
|
||||
# elif defined(RADHOOK_SHARED)
|
||||
# define RADHOOK_API __declspec(dllimport)
|
||||
# else
|
||||
# define RADHOOK_API
|
||||
# endif
|
||||
#else
|
||||
# if defined(__GNUC__) || defined(__clang__)
|
||||
# define RADHOOK_API __attribute__((visibility("default")))
|
||||
# else
|
||||
# define RADHOOK_API
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif // __LIBRADHOOK_DEFINES_HPP__
|
||||
57
include/radhook/private/disassemble.h
Normal file
57
include/radhook/private/disassemble.h
Normal file
@@ -0,0 +1,57 @@
|
||||
#ifndef __LIBRADHOOK_PRIVATE_DISASSEMBLE_H__
|
||||
#define __LIBRADHOOK_PRIVATE_DISASSEMBLE_H__
|
||||
|
||||
#include "radhook/defines.h"
|
||||
|
||||
#if defined(RADIUM_PLATFORM_WINDOWS)
|
||||
# ifndef WIN32_LEAN_AND_MEAN
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# endif
|
||||
# include <windows.h>
|
||||
#elif defined(RADIUM_PLATFORM_ANDROID)
|
||||
# include <sys/mman.h>
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if defined(RADHOOK_ARCH_X64)
|
||||
struct X64Insn {
|
||||
size_t length = 0;
|
||||
bool ripRelative = false;
|
||||
size_t dispOffset = 0;
|
||||
bool relativeControlFlow = false;
|
||||
bool isReturn = false;
|
||||
bool isPadding = false;
|
||||
bool valid = false;
|
||||
};
|
||||
|
||||
X64Insn
|
||||
DecodeX64(
|
||||
const uint8_t* p,
|
||||
size_t avail
|
||||
);
|
||||
|
||||
constexpr size_t kX64StubLen = 14; // FF25 00000000 + imm64
|
||||
constexpr size_t kX64MaxStolen = 32;
|
||||
constexpr size_t kX64MaxRipFixups = 8;
|
||||
|
||||
enum class StolenBytesError {
|
||||
None,
|
||||
BadDecode,
|
||||
RelativeControlFlow,
|
||||
TooManyRipFixups,
|
||||
ExceedsMaxStolen,
|
||||
InsufficientLength,
|
||||
};
|
||||
|
||||
StolenBytesError
|
||||
BuildStolenBytesX64(
|
||||
const uint8_t* target,
|
||||
size_t minLen,
|
||||
uint8_t* outBytes,
|
||||
size_t& outLen,
|
||||
size_t* outRipOffsets,
|
||||
size_t& outRipCount
|
||||
);
|
||||
|
||||
#endif // defined(RADHOOK_ARCH_X64)
|
||||
#endif // __LIBRADHOOK_PRIVATE_DISASSEMBLE_H__
|
||||
102
include/radhook/private/memory.h
Normal file
102
include/radhook/private/memory.h
Normal file
@@ -0,0 +1,102 @@
|
||||
#ifndef __LIBRADHOOK_PRIVATE_MEMORY_H__
|
||||
#define __LIBRADHOOK_PRIVATE_MEMORY_H__
|
||||
|
||||
#include "radhook/defines.h"
|
||||
|
||||
#if defined(RADIUM_PLATFORM_WINDOWS)
|
||||
# ifndef WIN32_LEAN_AND_MEAN
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# endif
|
||||
# include <windows.h>
|
||||
#elif defined(RADIUM_PLATFORM_ANDROID)
|
||||
# include <sys/mman.h>
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if defined(RADIUM_PLATFORM_WINDOWS)
|
||||
|
||||
size_t
|
||||
RadMemoryPageSize();
|
||||
|
||||
void*
|
||||
RadAllocExec(
|
||||
size_t size
|
||||
);
|
||||
|
||||
void*
|
||||
RadAllocExecNear(
|
||||
void* target,
|
||||
size_t size
|
||||
);
|
||||
|
||||
void
|
||||
RadFreeExec(
|
||||
void* p,
|
||||
size_t size
|
||||
);
|
||||
|
||||
bool
|
||||
RadMakeWritableExecutable(
|
||||
void* addr,
|
||||
size_t size,
|
||||
unsigned long* oldProtect
|
||||
);
|
||||
|
||||
void
|
||||
RadRestoreMemoryProtection(
|
||||
void* addr,
|
||||
size_t size,
|
||||
unsigned long oldProtect
|
||||
);
|
||||
|
||||
void
|
||||
RadFlushICache(
|
||||
void* addr,
|
||||
size_t size
|
||||
);
|
||||
|
||||
#elif defined(RADIUM_PLATFORM_ANDROID)
|
||||
|
||||
size_t
|
||||
RadMemoryPageSize();
|
||||
|
||||
void*
|
||||
RadAllocExec(
|
||||
size_t size
|
||||
);
|
||||
|
||||
void*
|
||||
RadAllocExecNear(
|
||||
void* target,
|
||||
size_t size
|
||||
);
|
||||
|
||||
void
|
||||
RadFreeExec(
|
||||
void* p,
|
||||
size_t size
|
||||
);
|
||||
|
||||
bool
|
||||
RadMakeWritableExecutable(
|
||||
void* addr,
|
||||
size_t size,
|
||||
unsigned long* oldProtect
|
||||
);
|
||||
|
||||
void
|
||||
RadRestoreMemoryProtection(
|
||||
void* addr,
|
||||
size_t size,
|
||||
unsigned long oldProtect
|
||||
);
|
||||
|
||||
void
|
||||
RadFlushICache(
|
||||
void* addr,
|
||||
size_t size
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
#endif // __LIBRADHOOK_PRIVATE_MEMORY_H__
|
||||
@@ -1,48 +1,7 @@
|
||||
#ifndef __LIBRADHOOK_HPP__
|
||||
#define __LIBRADHOOK_HPP__
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstddef>
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
// platform detection
|
||||
#if !defined(RADIUM_PLATFORM_WINDOWS) && !defined(RADIUM_PLATFORM_ANDROID)
|
||||
# if defined(_WIN32) || defined(_WIN64)
|
||||
# define RADIUM_PLATFORM_WINDOWS 1
|
||||
# elif defined(__ANDROID__)
|
||||
# define RADIUM_PLATFORM_ANDROID 1
|
||||
# else
|
||||
# error "radhook: unsupported platform -- define RADIUM_PLATFORM_WINDOWS or RADIUM_PLATFORM_ANDROID"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
// architecture detection
|
||||
#if defined(_M_X64) || defined(__x86_64__)
|
||||
# define RADHOOK_ARCH_X64 1
|
||||
#elif defined(_M_ARM64) || defined(__aarch64__)
|
||||
# define RADHOOK_ARCH_ARM64 1
|
||||
#else
|
||||
# error "radhook: unsupported architecture -- need x86-64 or aarch64"
|
||||
#endif
|
||||
|
||||
// api macros
|
||||
#if defined(_WIN32)
|
||||
# if defined(RADHOOK_BUILD)
|
||||
# define RADHOOK_API __declspec(dllexport)
|
||||
# elif defined(RADHOOK_SHARED)
|
||||
# define RADHOOK_API __declspec(dllimport)
|
||||
# else
|
||||
# define RADHOOK_API
|
||||
# endif
|
||||
#else
|
||||
# if defined(__GNUC__) || defined(__clang__)
|
||||
# define RADHOOK_API __attribute__((visibility("default")))
|
||||
# else
|
||||
# define RADHOOK_API
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include "defines.h"
|
||||
#include "api.h"
|
||||
|
||||
#endif // __LIBRADHOOK_HPP__
|
||||
Reference in New Issue
Block a user