diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..1cdabcc
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "vendor/subhook"]
+ path = vendor/subhook
+ url = https://github.com/Zeex/subhook
diff --git a/Makefile b/Makefile
index 22849af..6e1d517 100644
--- a/Makefile
+++ b/Makefile
@@ -22,8 +22,8 @@ OBJS=$(patsubst $(SDIR)/%.cpp, $(ODIR)/%.o, $(SRCS))
DEPS=$(OBJS:%.o=%.d)
WARNINGS=-Wall -Wno-parentheses -Wno-unknown-pragmas -Wno-delete-non-virtual-dtor
-CXXFLAGS=-std=c++20 -m32 $(WARNINGS) -I$(SDIR) -fPIC -D_GNU_SOURCE -I$(SDIR)/deps/subhook
-LDFLAGS=-m32 -shared -lstdc++fs -L$(SDIR)/deps/subhook -lsubhook
+CXXFLAGS=-std=c++20 -m32 $(WARNINGS) -I$(SDIR) -fPIC -D_GNU_SOURCE -Ivendor
+LDFLAGS=-m32 -shared -lstdc++fs
# Import config.mk, which can be used for optional config
-include config.mk
diff --git a/example-mod/src/photon-example-mod.vcxproj b/example-mod/src/photon-example-mod.vcxproj
index 233c830..549efdf 100644
--- a/example-mod/src/photon-example-mod.vcxproj
+++ b/example-mod/src/photon-example-mod.vcxproj
@@ -10,16 +10,12 @@
-
-
-
-
+ <_WildCardClCompile Include=".\**\*.cpp" />
+ <_WildCardClInclude Include=".\**\*.h" />
-
-
-
-
+
+
16.0
@@ -113,4 +109,4 @@
-
\ No newline at end of file
+
diff --git a/example-mod/src/photon-example-mod.vcxproj.filters b/example-mod/src/photon-example-mod.vcxproj.filters
deleted file mode 100644
index 67d4302..0000000
--- a/example-mod/src/photon-example-mod.vcxproj.filters
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
\ No newline at end of file
diff --git a/src/core/shared/signal.cpp b/src/core/shared/signal.cpp
index 64cd6fe..a1684f5 100644
--- a/src/core/shared/signal.cpp
+++ b/src/core/shared/signal.cpp
@@ -2,9 +2,9 @@
#include "sdk/signal.h"
-#include "deps/subhook/subhook.h"
#include "sdk/photon.h"
+#include
#include
static std::unordered_map< std::string, signal_t* > signals;
diff --git a/src/deps/subhook/libsubhook.a b/src/deps/subhook/libsubhook.a
deleted file mode 100644
index 40b6cfb..0000000
Binary files a/src/deps/subhook/libsubhook.a and /dev/null differ
diff --git a/src/deps/subhook/subhook.h b/src/deps/subhook/subhook.h
deleted file mode 100644
index ef9d8b8..0000000
--- a/src/deps/subhook/subhook.h
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Copyright (c) 2012-2018 Zeex
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef SUBHOOK_H
-#define SUBHOOK_H
-
-#include
-
-#if defined _M_IX86 || defined __i386__
- #define SUBHOOK_X86
- #define SUBHOOK_BITS 32
-#elif defined _M_AMD64 || defined __amd64__
- #define SUBHOOK_X86_64
- #define SUBHOOK_BITS 64
-#else
- #error Unsupported architecture
-#endif
-
-#if defined _WIN32 || defined __CYGWIN__
- #define SUBHOOK_WINDOWS
-#elif defined __linux__ \
- || defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__
- #define SUBHOOK_UNIX
-#elif defined __APPLE__
- #define SUBHOOK_APPLE
- #define SUBHOOK_UNIX
-#else
- #error Unsupported operating system
-#endif
-
-#if !defined SUBHOOK_EXTERN
- #if defined __cplusplus
- #define SUBHOOK_EXTERN extern "C"
- #else
- #define SUBHOOK_EXTERN extern
- #endif
-#endif
-
-#if defined SUBHOOK_STATIC
- #define SUBHOOK_API
- #define SUBHOOK_EXPORT SUBHOOK_EXTERN
-#endif
-
-#if !defined SUBHOOK_API
- #if defined SUBHOOK_X86
- #if defined SUBHOOK_WINDOWS
- #define SUBHOOK_API __cdecl
- #elif defined SUBHOOK_UNIX
- #define SUBHOOK_API __attribute__((cdecl))
- #endif
- #else
- #define SUBHOOK_API
- #endif
-#endif
-
-#if !defined SUBHOOK_EXPORT
- #if defined SUBHOOK_WINDOWS
- #if defined SUBHOOK_IMPLEMENTATION
- #define SUBHOOK_EXPORT SUBHOOK_EXTERN __declspec(dllexport)
- #else
- #define SUBHOOK_EXPORT SUBHOOK_EXTERN __declspec(dllimport)
- #endif
- #elif defined SUBHOOK_UNIX
- #if defined SUBHOOK_IMPLEMENTATION
- #define SUBHOOK_EXPORT SUBHOOK_EXTERN __attribute__((visibility("default")))
- #else
- #define SUBHOOK_EXPORT SUBHOOK_EXTERN
- #endif
- #endif
-#endif
-
-typedef enum subhook_flags {
- /*
- * Use the 64-bit jump method on x86-64. Unlike the classical 32-bit JMP,
- * this approach ensures that the destination code can be reached from any
- * point in the 64-bit address space, even if the source and destination are
- * more than 4GB away from each other (meaning we are not limited to using
- * JMP 32-bit offsets).
- *
- * Keep in mind that it requires overwriting a few more leading instructions
- * inside the target code, thus it may not work with extremely short
- * functions (14 bytes vs 5 bytes).
- *
- * Credits to @Ozymandias117 and @RomanHargrave on GitHub for implementing
- * this in subhook.
- */
- SUBHOOK_64BIT_OFFSET = 0x01,
- /*
- * Generate a trampoline for jumping back to the original code faster (without
- * removing the hook each time).
- *
- * In some scenarios, trampolines cannot be created. See "Known limitations"
- * in the README file.
- */
- SUBHOOK_TRAMPOLINE = 0x02,
- /*
- * Windows x64 only: Try to allocate a trampoline buffer within +/- 2GB range
- * of the original function to overcome a possible issue with relocating memory
- * referencing instructions, particularly those which use RIP-relative
- * addresses (i.e. with 32-bit offsets).
- *
- * Caution: this feature may slow down your code.
- */
- SUBHOOK_TRAMPOLINE_ALLOC_NEARBY = 0x04
-} subhook_flags_t;
-
-struct subhook_struct;
-typedef struct subhook_struct *subhook_t;
-
-typedef int (SUBHOOK_API *subhook_disasm_handler_t)(
- void *src,
- int *reloc_op_offset);
-
-SUBHOOK_EXPORT subhook_t SUBHOOK_API subhook_new(
- void *src,
- void *dst,
- subhook_flags_t flags);
-SUBHOOK_EXPORT void SUBHOOK_API subhook_free(subhook_t hook);
-
-SUBHOOK_EXPORT void *SUBHOOK_API subhook_get_src(subhook_t hook);
-SUBHOOK_EXPORT void *SUBHOOK_API subhook_get_dst(subhook_t hook);
-SUBHOOK_EXPORT void *SUBHOOK_API subhook_get_trampoline(subhook_t hook);
-
-SUBHOOK_EXPORT int SUBHOOK_API subhook_install(subhook_t hook);
-SUBHOOK_EXPORT int SUBHOOK_API subhook_is_installed(subhook_t hook);
-SUBHOOK_EXPORT int SUBHOOK_API subhook_remove(subhook_t hook);
-
-/*
- * Reads hook destination address from code.
- *
- * This function may be useful when you don't know the address or want to
- * check whether src is already hooked.
- */
-SUBHOOK_EXPORT void *SUBHOOK_API subhook_read_dst(void *src);
-
-/*
- * Returns the length of the first instruction in src. You can replace it with
- * a custom function via subhook_set_disasm_handler.
- */
-SUBHOOK_EXPORT int SUBHOOK_API subhook_disasm(void *src, int *reloc_op_offset);
-
-/*
- * Sets a custom disassmbler function to use in place of the default one
- * (subhook_disasm).
- *
- * The default function can recognize only a small subset of x86 instructions
- * commonly used in prologues. If it fails in your situation, you might want
- * to use a more advanced disassembler library.
- */
-SUBHOOK_EXPORT void SUBHOOK_API subhook_set_disasm_handler(
- subhook_disasm_handler_t handler);
-
-#ifdef __cplusplus
-
-namespace subhook {
-
-enum HookFlags {
- HookNoFlags = 0,
- HookFlag64BitOffset = SUBHOOK_64BIT_OFFSET,
- HookFlagTrampoline = SUBHOOK_TRAMPOLINE,
- HookFlagTrampolineAllocNearby = SUBHOOK_TRAMPOLINE_ALLOC_NEARBY
-};
-
-inline HookFlags operator|(HookFlags o1, HookFlags o2) {
- return static_cast(
- static_cast(o1) | static_cast(o2));
-}
-
-inline HookFlags operator&(HookFlags o1, HookFlags o2) {
- return static_cast(
- static_cast(o1) & static_cast(o2));
-}
-
-inline void *ReadHookDst(void *src) {
- return subhook_read_dst(src);
-}
-
-inline void SetDisasmHandler(subhook_disasm_handler_t handler) {
- subhook_set_disasm_handler(handler);
-}
-
-class Hook {
- public:
- Hook() : hook_(NULL) {}
- Hook(void *src, void *dst, HookFlags flags = HookNoFlags)
- : hook_(subhook_new(src, dst, (subhook_flags_t)flags))
- {
- }
-
- ~Hook() {
- subhook_remove(hook_);
- subhook_free(hook_);
- }
-
- void *GetSrc() const { return subhook_get_src(hook_); }
- void *GetDst() const { return subhook_get_dst(hook_); }
- void *GetTrampoline() const { return subhook_get_trampoline(hook_); }
-
- bool Install() {
- return subhook_install(hook_) == 0;
- }
-
- bool Install(void *src,
- void *dst,
- HookFlags flags = HookNoFlags) {
- if (hook_ != NULL) {
- subhook_remove(hook_);
- subhook_free(hook_);
- }
- hook_ = subhook_new(src, dst, (subhook_flags_t)flags);
- if (hook_ == NULL) {
- return false;
- }
- return Install();
- }
-
- bool Remove() {
- return subhook_remove(hook_) == 0;
- }
-
- bool IsInstalled() const {
- return !!subhook_is_installed(hook_);
- }
-
- private:
- Hook(const Hook &);
- void operator=(const Hook &);
-
- private:
- subhook_t hook_;
-};
-
-class ScopedHookRemove {
- public:
- ScopedHookRemove(Hook *hook)
- : hook_(hook),
- removed_(hook_->Remove())
- {
- }
-
- ~ScopedHookRemove() {
- if (removed_) {
- hook_->Install();
- }
- }
-
- private:
- ScopedHookRemove(const ScopedHookRemove &);
- void operator=(const ScopedHookRemove &);
-
- private:
- Hook *hook_;
- bool removed_;
-};
-
-class ScopedHookInstall {
- public:
- ScopedHookInstall(Hook *hook)
- : hook_(hook),
- installed_(hook_->Install())
- {
- }
-
- ScopedHookInstall(Hook *hook,
- void *src,
- void *dst,
- HookFlags flags = HookNoFlags)
- : hook_(hook),
- installed_(hook_->Install(src, dst, flags))
- {
- }
-
- ~ScopedHookInstall() {
- if (installed_) {
- hook_->Remove();
- }
- }
-
- private:
- ScopedHookInstall(const ScopedHookInstall &);
- void operator=(const ScopedHookInstall &);
-
- private:
- Hook *hook_;
- bool installed_;
-};
-
-} // namespace subhook
-
-#endif /* __cplusplus */
-
-#endif /* SUBHOOK_H */
diff --git a/src/deps/subhook/subhook.lib b/src/deps/subhook/subhook.lib
deleted file mode 100644
index 99333d0..0000000
Binary files a/src/deps/subhook/subhook.lib and /dev/null differ
diff --git a/src/photon.vcxproj b/src/photon.vcxproj
index 2d42722..b91cc7a 100644
--- a/src/photon.vcxproj
+++ b/src/photon.vcxproj
@@ -10,46 +10,13 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ <_WildCardClCompile Include="..\vendor\subhook\subhook.c" />
+ <_WildCardClCompile Include=".\**\*.cpp" />
+ <_WildCardClInclude Include=".\**\*.h" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
16.0
@@ -85,13 +52,13 @@
true
$(SolutionDir)bin\
- $(SolutionDir)src;$(IncludePath)
+ $(SolutionDir)src;$(SolutionDir)vendor;$(IncludePath)
$(LibraryPath)
false
$(SolutionDir)bin\
- $(SolutionDir)src;$(IncludePath)
+ $(SolutionDir)src;$(SolutionDir)vendor;$(IncludePath)
$(LibraryPath)
@@ -109,8 +76,8 @@
Console
true
- $(SolutionDir)src\deps\subhook;%(AdditionalLibraryDirectories)
- kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;subhook.lib;%(AdditionalDependencies)
+ %(AdditionalLibraryDirectories)
+ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
call ..\copy.bat
@@ -135,8 +102,8 @@
true
true
true
- $(SolutionDir)src\deps\subhook;%(AdditionalLibraryDirectories)
- kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;subhook.lib;%(AdditionalDependencies)
+ %(AdditionalLibraryDirectories)
+ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
call ..\copy.bat
@@ -144,4 +111,4 @@
-
\ No newline at end of file
+
diff --git a/src/photon.vcxproj.filters b/src/photon.vcxproj.filters
deleted file mode 100644
index a3739b6..0000000
--- a/src/photon.vcxproj.filters
+++ /dev/null
@@ -1,135 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
-
\ No newline at end of file
diff --git a/src/util/util.cpp b/src/util/util.cpp
index 3368860..b99599f 100644
--- a/src/util/util.cpp
+++ b/src/util/util.cpp
@@ -35,6 +35,8 @@ void util::console::free( ) {
#endif
}
+static std::vector< util::module_info_t > g_module_info;
+
bool util::get_module_info( const char* module_name, module_info_t* module_info ) {
if ( g_module_info.empty( ) ) {
#ifdef _WIN32
@@ -89,7 +91,7 @@ bool util::get_module_info( const char* module_name, module_info_t* module_info
}
for ( const auto& info : g_module_info ) {
- if ( std::strcmp( info.name, module_name ) )
+ if ( _stricmp( info.name, module_name ) )
continue;
if ( module_info != nullptr ) {
diff --git a/src/util/util.h b/src/util/util.h
index 3c5ab65..8fbb2cc 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -16,6 +16,10 @@
#define MAX_PATH 4096
#endif
+#ifndef _WIN32
+#define _stricmp strcasecmp
+#endif
+
#include "math.h"
#include "sdk/platform.h"
@@ -36,7 +40,6 @@ namespace util {
std::uintptr_t addr;
std::size_t size;
};
- static std::vector< module_info_t > g_module_info;
bool get_module_info( const char* module_name, module_info_t* module_info );
std::uint8_t* pattern_scan( const char* module_name, const char* signature ) noexcept;
diff --git a/vendor/subhook b/vendor/subhook
new file mode 160000
index 0000000..e935959
--- /dev/null
+++ b/vendor/subhook
@@ -0,0 +1 @@
+Subproject commit e935959d2f9cc642bcbb5e7759b2b1e7196b0947