fix: split files, add padding and return checking on disasm

This commit is contained in:
nexusverypro
2026-07-03 23:39:52 +01:00
parent 3c55bd62e1
commit 9fe4d2e476
9 changed files with 626 additions and 438 deletions

View File

@@ -41,6 +41,7 @@ enum class RadHookResult : int {
InvalidDetour,
InvalidHandle,
TrampolineTooFar,
TargetTooSmall,
Unknown,
};

46
include/radhook/defines.h Normal file
View 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__

View 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__

View 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__

View File

@@ -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__