diff --git a/paho-mqtt3as-proxy.slnx b/paho-mqtt3as-proxy.slnx index 3430391..42b65e0 100644 --- a/paho-mqtt3as-proxy.slnx +++ b/paho-mqtt3as-proxy.slnx @@ -1,8 +1,6 @@ - - diff --git a/paho-mqtt3as-proxy/MinHook/include/MinHook.h b/paho-mqtt3as-proxy/MinHook/include/MinHook.h new file mode 100644 index 0000000..492d83f --- /dev/null +++ b/paho-mqtt3as-proxy/MinHook/include/MinHook.h @@ -0,0 +1,185 @@ +/* + * MinHook - The Minimalistic API Hooking Library for x64/x86 + * Copyright (C) 2009-2017 Tsuda Kageyu. + * 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 HOLDER + * 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. + */ + +#pragma once + +#if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__) + #error MinHook supports only x86 and x64 systems. +#endif + +#include + +// MinHook Error Codes. +typedef enum MH_STATUS +{ + // Unknown error. Should not be returned. + MH_UNKNOWN = -1, + + // Successful. + MH_OK = 0, + + // MinHook is already initialized. + MH_ERROR_ALREADY_INITIALIZED, + + // MinHook is not initialized yet, or already uninitialized. + MH_ERROR_NOT_INITIALIZED, + + // The hook for the specified target function is already created. + MH_ERROR_ALREADY_CREATED, + + // The hook for the specified target function is not created yet. + MH_ERROR_NOT_CREATED, + + // The hook for the specified target function is already enabled. + MH_ERROR_ENABLED, + + // The hook for the specified target function is not enabled yet, or already + // disabled. + MH_ERROR_DISABLED, + + // The specified pointer is invalid. It points the address of non-allocated + // and/or non-executable region. + MH_ERROR_NOT_EXECUTABLE, + + // The specified target function cannot be hooked. + MH_ERROR_UNSUPPORTED_FUNCTION, + + // Failed to allocate memory. + MH_ERROR_MEMORY_ALLOC, + + // Failed to change the memory protection. + MH_ERROR_MEMORY_PROTECT, + + // The specified module is not loaded. + MH_ERROR_MODULE_NOT_FOUND, + + // The specified function is not found. + MH_ERROR_FUNCTION_NOT_FOUND +} +MH_STATUS; + +// Can be passed as a parameter to MH_EnableHook, MH_DisableHook, +// MH_QueueEnableHook or MH_QueueDisableHook. +#define MH_ALL_HOOKS NULL + +#ifdef __cplusplus +extern "C" { +#endif + + // Initialize the MinHook library. You must call this function EXACTLY ONCE + // at the beginning of your program. + MH_STATUS WINAPI MH_Initialize(VOID); + + // Uninitialize the MinHook library. You must call this function EXACTLY + // ONCE at the end of your program. + MH_STATUS WINAPI MH_Uninitialize(VOID); + + // Creates a hook for the specified target function, in disabled state. + // Parameters: + // pTarget [in] A pointer to the target function, which will be + // overridden by the detour function. + // pDetour [in] A pointer to the detour function, which will override + // the target function. + // ppOriginal [out] A pointer to the trampoline function, which will be + // used to call the original target function. + // This parameter can be NULL. + MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal); + + // Creates a hook for the specified API function, in disabled state. + // Parameters: + // pszModule [in] A pointer to the loaded module name which contains the + // target function. + // pszProcName [in] A pointer to the target function name, which will be + // overridden by the detour function. + // pDetour [in] A pointer to the detour function, which will override + // the target function. + // ppOriginal [out] A pointer to the trampoline function, which will be + // used to call the original target function. + // This parameter can be NULL. + MH_STATUS WINAPI MH_CreateHookApi( + LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal); + + // Creates a hook for the specified API function, in disabled state. + // Parameters: + // pszModule [in] A pointer to the loaded module name which contains the + // target function. + // pszProcName [in] A pointer to the target function name, which will be + // overridden by the detour function. + // pDetour [in] A pointer to the detour function, which will override + // the target function. + // ppOriginal [out] A pointer to the trampoline function, which will be + // used to call the original target function. + // This parameter can be NULL. + // ppTarget [out] A pointer to the target function, which will be used + // with other functions. + // This parameter can be NULL. + MH_STATUS WINAPI MH_CreateHookApiEx( + LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget); + + // Removes an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget); + + // Enables an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + // If this parameter is MH_ALL_HOOKS, all created hooks are + // enabled in one go. + MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget); + + // Disables an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + // If this parameter is MH_ALL_HOOKS, all created hooks are + // disabled in one go. + MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget); + + // Queues to enable an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + // If this parameter is MH_ALL_HOOKS, all created hooks are + // queued to be enabled. + MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget); + + // Queues to disable an already created hook. + // Parameters: + // pTarget [in] A pointer to the target function. + // If this parameter is MH_ALL_HOOKS, all created hooks are + // queued to be disabled. + MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget); + + // Applies all queued changes in one go. + MH_STATUS WINAPI MH_ApplyQueued(VOID); + + // Translates the MH_STATUS to its name as a string. + const char * WINAPI MH_StatusToString(MH_STATUS status); + +#ifdef __cplusplus +} +#endif diff --git a/paho-mqtt3as-proxy/MinHook/lib/libMinHook.x64.lib b/paho-mqtt3as-proxy/MinHook/lib/libMinHook.x64.lib new file mode 100644 index 0000000..e211ad6 Binary files /dev/null and b/paho-mqtt3as-proxy/MinHook/lib/libMinHook.x64.lib differ diff --git a/paho-mqtt3as-proxy/hook.cpp b/paho-mqtt3as-proxy/hook.cpp new file mode 100644 index 0000000..94126fd --- /dev/null +++ b/paho-mqtt3as-proxy/hook.cpp @@ -0,0 +1,3 @@ +#include +#include +#include "MinHook.h" \ No newline at end of file diff --git a/paho-mqtt3as-proxy/main.cpp b/paho-mqtt3as-proxy/main.cpp index 200dcfc..bbeeff4 100644 --- a/paho-mqtt3as-proxy/main.cpp +++ b/paho-mqtt3as-proxy/main.cpp @@ -66,8 +66,9 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv case DLL_PROCESS_ATTACH: { DisableThreadLibraryCalls(hModule); - CreateThread(NULL, 0, DelayedHelloThread, NULL, 0, NULL); - MessageBox(0, "Hello", "Proxy", MB_OK | MB_ICONINFORMATION); + + MH_Initialize(); + paho_mqtt3as.dll = LoadLibrary("paho-mqtt3as_orig.dll"); if (paho_mqtt3as.dll == NULL) { @@ -76,6 +77,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv } LoadOriginalDllFunctions(); + InstallHooks(); break; } diff --git a/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj b/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj index 3f802c3..3cd2da1 100644 --- a/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj +++ b/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj @@ -29,6 +29,7 @@ + @@ -123,12 +124,15 @@ stdcpp20 NotUsing pch.h + $(ProjectDir)\MinHook\include Windows true false paho-mqtt3as.def + $(ProjectDir)\MinHook\lib + libMinHook.x64.lib;%(AdditionalDependencies) @@ -142,12 +146,15 @@ stdcpp20 NotUsing pch.h + $(ProjectDir)\MinHook\include Windows true false paho-mqtt3as.def + $(ProjectDir)\MinHook\lib + libMinHook.x64.lib;%(AdditionalDependencies) @@ -159,12 +166,15 @@ stdcpp20 NotUsing pch.h + $(ProjectDir)\MinHook\include Windows true false paho-mqtt3as.def + $(ProjectDir)\MinHook\lib + libMinHook.x64.lib;%(AdditionalDependencies) @@ -178,12 +188,16 @@ stdcpp20 NotUsing pch.h + $(ProjectDir)\MinHook\include + false Windows true false paho-mqtt3as.def + $(ProjectDir)\MinHook\lib + libMinHook.x64.lib;%(AdditionalDependencies) @@ -195,12 +209,15 @@ stdcpp20 NotUsing pch.h + $(ProjectDir)\MinHook\include Windows true false paho-mqtt3as.def + $(ProjectDir)\MinHook\lib + libMinHook.x64.lib;%(AdditionalDependencies) @@ -214,12 +231,15 @@ stdcpp20 NotUsing pch.h + $(ProjectDir)\MinHook\include Windows true false paho-mqtt3as.def + $(ProjectDir)\MinHook\lib + libMinHook.x64.lib;%(AdditionalDependencies) diff --git a/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj.filters b/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj.filters index 59e6fe7..d47e366 100644 --- a/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj.filters +++ b/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj.filters @@ -21,6 +21,9 @@ Fichiers sources + + Fichiers sources + diff --git a/scripts/install-hook.ps1 b/scripts/install-hook.ps1 index 2d98d08..93c0264 100644 --- a/scripts/install-hook.ps1 +++ b/scripts/install-hook.ps1 @@ -21,8 +21,8 @@ $OrigName = "paho-mqtt3as_orig.dll" $TargetPath = Join-Path $InstallDir $TargetName $OrigPath = Join-Path $InstallDir $OrigName -$DefaultDebug = "C:\Users\noham\Documents\paho-mqtt3as-proxy\x64\Debug\paho-mqtt3as-proxy.dll" -$DefaultRelease = "C:\Users\noham\Documents\paho-mqtt3as-proxy\x64\Release\paho-mqtt3as-proxy.dll" +$DefaultDebug = "C:\Users\noham\Documents\paho-mqtt3as-proxy\x64\Debug\paho-mqtt3as.dll" +$DefaultRelease = "C:\Users\noham\Documents\paho-mqtt3as-proxy\x64\Release\paho-mqtt3as.dll" function Show-Help { "Actions:"