From 86f8dbe99a7ef2dd4d681154450651f94858ec28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=88=9A=28noham=29=C2=B2?= <100566912+NohamR@users.noreply.github.com> Date: Thu, 7 May 2026 15:12:05 +0200 Subject: [PATCH] First hook --- .gitignore | 3 + README.md | 9 + paho-mqtt3as-proxy.slnx | 8 + paho-mqtt3as-proxy/common.h | 59 +++++ paho-mqtt3as-proxy/exports.cpp | 59 +++++ paho-mqtt3as-proxy/main.cpp | 89 +++++++ paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj | 229 ++++++++++++++++++ .../paho-mqtt3as-proxy.vcxproj.filters | 40 +++ .../paho-mqtt3as-proxy.vcxproj.user | 6 + paho-mqtt3as-proxy/paho-mqtt3as.asm | 7 + paho-mqtt3as-proxy/paho-mqtt3as.def | 52 ++++ scripts/install-hook.bat | 10 + scripts/install-hook.ps1 | 122 ++++++++++ 13 files changed, 693 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 paho-mqtt3as-proxy.slnx create mode 100644 paho-mqtt3as-proxy/common.h create mode 100644 paho-mqtt3as-proxy/exports.cpp create mode 100644 paho-mqtt3as-proxy/main.cpp create mode 100644 paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj create mode 100644 paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj.filters create mode 100644 paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj.user create mode 100644 paho-mqtt3as-proxy/paho-mqtt3as.asm create mode 100644 paho-mqtt3as-proxy/paho-mqtt3as.def create mode 100644 scripts/install-hook.bat create mode 100644 scripts/install-hook.ps1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..26b49c7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/.vs +/paho-mqtt3as-proxy/x64 +/x64 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e3b298e --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +Set-ExecutionPolicy +Run from an elevated PowerShell (script will attempt to relaunch elevated if not already) or right-click -> Run with PowerShell. +Example: .\scripts\install-hook.ps1 -Action install +To use a specific DLL: .\scripts\install-hook.ps1 -Action install -SourcePath "C:\path\to\your.dll" +To restore original: .\scripts\install-hook.ps1 -Action restore + + +install-hook.bat -Action install +install-hook.bat -Action restore \ No newline at end of file diff --git a/paho-mqtt3as-proxy.slnx b/paho-mqtt3as-proxy.slnx new file mode 100644 index 0000000..3430391 --- /dev/null +++ b/paho-mqtt3as-proxy.slnx @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/paho-mqtt3as-proxy/common.h b/paho-mqtt3as-proxy/common.h new file mode 100644 index 0000000..3fa028c --- /dev/null +++ b/paho-mqtt3as-proxy/common.h @@ -0,0 +1,59 @@ +#pragma once +#include + +struct paho_mqtt3as_dll { + HMODULE dll; + FARPROC OrignalMQTTAsync_connect; + FARPROC OrignalMQTTAsync_create; + FARPROC OrignalMQTTAsync_createWithOptions; + FARPROC OrignalMQTTAsync_destroy; + FARPROC OrignalMQTTAsync_disconnect; + FARPROC OrignalMQTTAsync_free; + FARPROC OrignalMQTTAsync_freeMessage; + FARPROC OrignalMQTTAsync_getPendingTokens; + FARPROC OrignalMQTTAsync_getVersionInfo; + FARPROC OrignalMQTTAsync_global_init; + FARPROC OrignalMQTTAsync_isComplete; + FARPROC OrignalMQTTAsync_isConnected; + FARPROC OrignalMQTTAsync_malloc; + FARPROC OrignalMQTTAsync_reconnect; + FARPROC OrignalMQTTAsync_send; + FARPROC OrignalMQTTAsync_sendMessage; + FARPROC OrignalMQTTAsync_setAfterPersistenceRead; + FARPROC OrignalMQTTAsync_setBeforePersistenceWrite; + FARPROC OrignalMQTTAsync_setCallbacks; + FARPROC OrignalMQTTAsync_setConnected; + FARPROC OrignalMQTTAsync_setConnectionLostCallback; + FARPROC OrignalMQTTAsync_setDeliveryCompleteCallback; + FARPROC OrignalMQTTAsync_setDisconnected; + FARPROC OrignalMQTTAsync_setMessageArrivedCallback; + FARPROC OrignalMQTTAsync_setTraceCallback; + FARPROC OrignalMQTTAsync_setTraceLevel; + FARPROC OrignalMQTTAsync_setUpdateConnectOptions; + FARPROC OrignalMQTTAsync_strerror; + FARPROC OrignalMQTTAsync_subscribe; + FARPROC OrignalMQTTAsync_subscribeMany; + FARPROC OrignalMQTTAsync_unsubscribe; + FARPROC OrignalMQTTAsync_unsubscribeMany; + FARPROC OrignalMQTTAsync_waitForCompletion; + FARPROC OrignalMQTTProperties_add; + FARPROC OrignalMQTTProperties_copy; + FARPROC OrignalMQTTProperties_free; + FARPROC OrignalMQTTProperties_getNumericValue; + FARPROC OrignalMQTTProperties_getNumericValueAt; + FARPROC OrignalMQTTProperties_getProperty; + FARPROC OrignalMQTTProperties_getPropertyAt; + FARPROC OrignalMQTTProperties_hasProperty; + FARPROC OrignalMQTTProperties_propertyCount; + FARPROC OrignalMQTTPropertyName; + FARPROC OrignalMQTTProperty_getType; + FARPROC OrignalMQTTReasonCode_toString; + FARPROC OrignalThread_create_mutex; + FARPROC OrignalThread_getid; + FARPROC OrignalThread_lock_mutex; + FARPROC OrignalThread_start; + FARPROC OrignalThread_unlock_mutex; +}; + +extern paho_mqtt3as_dll paho_mqtt3as; +extern "C" FARPROC PA; diff --git a/paho-mqtt3as-proxy/exports.cpp b/paho-mqtt3as-proxy/exports.cpp new file mode 100644 index 0000000..ef90bf0 --- /dev/null +++ b/paho-mqtt3as-proxy/exports.cpp @@ -0,0 +1,59 @@ +#include "common.h" + +paho_mqtt3as_dll paho_mqtt3as; +extern "C" FARPROC PA = NULL; + +extern "C" +{ + extern "C" void FakeMQTTAsync_connect() {} + extern "C" void FakeMQTTAsync_create() {} + extern "C" void FakeMQTTAsync_createWithOptions() {} + extern "C" void FakeMQTTAsync_destroy() {} + extern "C" void FakeMQTTAsync_disconnect() {} + extern "C" void FakeMQTTAsync_free() {} + extern "C" void FakeMQTTAsync_freeMessage() {} + extern "C" void FakeMQTTAsync_getPendingTokens() {} + extern "C" void FakeMQTTAsync_getVersionInfo() {} + extern "C" void FakeMQTTAsync_global_init() {} + extern "C" void FakeMQTTAsync_isComplete() {} + extern "C" void FakeMQTTAsync_isConnected() {} + extern "C" void FakeMQTTAsync_malloc() {} + extern "C" void FakeMQTTAsync_reconnect() {} + extern "C" void FakeMQTTAsync_send() {} + extern "C" void FakeMQTTAsync_sendMessage() {} + extern "C" void FakeMQTTAsync_setAfterPersistenceRead() {} + extern "C" void FakeMQTTAsync_setBeforePersistenceWrite() {} + extern "C" void FakeMQTTAsync_setCallbacks() {} + extern "C" void FakeMQTTAsync_setConnected() {} + extern "C" void FakeMQTTAsync_setConnectionLostCallback() {} + extern "C" void FakeMQTTAsync_setDeliveryCompleteCallback() {} + extern "C" void FakeMQTTAsync_setDisconnected() {} + extern "C" void FakeMQTTAsync_setMessageArrivedCallback() {} + extern "C" void FakeMQTTAsync_setTraceCallback() {} + extern "C" void FakeMQTTAsync_setTraceLevel() {} + extern "C" void FakeMQTTAsync_setUpdateConnectOptions() {} + extern "C" void FakeMQTTAsync_strerror() {} + extern "C" void FakeMQTTAsync_subscribe() {} + extern "C" void FakeMQTTAsync_subscribeMany() {} + extern "C" void FakeMQTTAsync_unsubscribe() {} + extern "C" void FakeMQTTAsync_unsubscribeMany() {} + extern "C" void FakeMQTTAsync_waitForCompletion() {} + extern "C" void FakeMQTTProperties_add() {} + extern "C" void FakeMQTTProperties_copy() {} + extern "C" void FakeMQTTProperties_free() {} + extern "C" void FakeMQTTProperties_getNumericValue() {} + extern "C" void FakeMQTTProperties_getNumericValueAt() {} + extern "C" void FakeMQTTProperties_getProperty() {} + extern "C" void FakeMQTTProperties_getPropertyAt() {} + extern "C" void FakeMQTTProperties_hasProperty() {} + extern "C" void FakeMQTTProperties_propertyCount() {} + extern "C" void FakeMQTTPropertyName() {} + extern "C" void FakeMQTTProperty_getType() {} + extern "C" void FakeMQTTReasonCode_toString() {} + extern "C" void FakeThread_create_mutex() {} + extern "C" void FakeThread_getid() {} + extern "C" void FakeThread_lock_mutex() {} + extern "C" void FakeThread_start() {} + extern "C" void FakeThread_unlock_mutex() {} +} + diff --git a/paho-mqtt3as-proxy/main.cpp b/paho-mqtt3as-proxy/main.cpp new file mode 100644 index 0000000..200dcfc --- /dev/null +++ b/paho-mqtt3as-proxy/main.cpp @@ -0,0 +1,89 @@ +#include "common.h" + +DWORD WINAPI DelayedHelloThread(LPVOID lpParam) +{ + Sleep(10000); // 10 seconds + MessageBox(0, "Hello :)", "Proxy", MB_OK | MB_ICONINFORMATION); + return 0; +} + +void LoadOriginalDllFunctions() { + paho_mqtt3as.OrignalMQTTAsync_connect = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_connect"); + paho_mqtt3as.OrignalMQTTAsync_create = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_create"); + paho_mqtt3as.OrignalMQTTAsync_createWithOptions = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_createWithOptions"); + paho_mqtt3as.OrignalMQTTAsync_destroy = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_destroy"); + paho_mqtt3as.OrignalMQTTAsync_disconnect = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_disconnect"); + paho_mqtt3as.OrignalMQTTAsync_free = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_free"); + paho_mqtt3as.OrignalMQTTAsync_freeMessage = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_freeMessage"); + paho_mqtt3as.OrignalMQTTAsync_getPendingTokens = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_getPendingTokens"); + paho_mqtt3as.OrignalMQTTAsync_getVersionInfo = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_getVersionInfo"); + paho_mqtt3as.OrignalMQTTAsync_global_init = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_global_init"); + paho_mqtt3as.OrignalMQTTAsync_isComplete = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_isComplete"); + paho_mqtt3as.OrignalMQTTAsync_isConnected = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_isConnected"); + paho_mqtt3as.OrignalMQTTAsync_malloc = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_malloc"); + paho_mqtt3as.OrignalMQTTAsync_reconnect = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_reconnect"); + paho_mqtt3as.OrignalMQTTAsync_send = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_send"); + paho_mqtt3as.OrignalMQTTAsync_sendMessage = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_sendMessage"); + paho_mqtt3as.OrignalMQTTAsync_setAfterPersistenceRead = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_setAfterPersistenceRead"); + paho_mqtt3as.OrignalMQTTAsync_setBeforePersistenceWrite = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_setBeforePersistenceWrite"); + paho_mqtt3as.OrignalMQTTAsync_setCallbacks = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_setCallbacks"); + paho_mqtt3as.OrignalMQTTAsync_setConnected = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_setConnected"); + paho_mqtt3as.OrignalMQTTAsync_setConnectionLostCallback = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_setConnectionLostCallback"); + paho_mqtt3as.OrignalMQTTAsync_setDeliveryCompleteCallback = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_setDeliveryCompleteCallback"); + paho_mqtt3as.OrignalMQTTAsync_setDisconnected = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_setDisconnected"); + paho_mqtt3as.OrignalMQTTAsync_setMessageArrivedCallback = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_setMessageArrivedCallback"); + paho_mqtt3as.OrignalMQTTAsync_setTraceCallback = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_setTraceCallback"); + paho_mqtt3as.OrignalMQTTAsync_setTraceLevel = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_setTraceLevel"); + paho_mqtt3as.OrignalMQTTAsync_setUpdateConnectOptions = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_setUpdateConnectOptions"); + paho_mqtt3as.OrignalMQTTAsync_strerror = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_strerror"); + paho_mqtt3as.OrignalMQTTAsync_subscribe = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_subscribe"); + paho_mqtt3as.OrignalMQTTAsync_subscribeMany = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_subscribeMany"); + paho_mqtt3as.OrignalMQTTAsync_unsubscribe = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_unsubscribe"); + paho_mqtt3as.OrignalMQTTAsync_unsubscribeMany = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_unsubscribeMany"); + paho_mqtt3as.OrignalMQTTAsync_waitForCompletion = GetProcAddress(paho_mqtt3as.dll, "MQTTAsync_waitForCompletion"); + paho_mqtt3as.OrignalMQTTProperties_add = GetProcAddress(paho_mqtt3as.dll, "MQTTProperties_add"); + paho_mqtt3as.OrignalMQTTProperties_copy = GetProcAddress(paho_mqtt3as.dll, "MQTTProperties_copy"); + paho_mqtt3as.OrignalMQTTProperties_free = GetProcAddress(paho_mqtt3as.dll, "MQTTProperties_free"); + paho_mqtt3as.OrignalMQTTProperties_getNumericValue = GetProcAddress(paho_mqtt3as.dll, "MQTTProperties_getNumericValue"); + paho_mqtt3as.OrignalMQTTProperties_getNumericValueAt = GetProcAddress(paho_mqtt3as.dll, "MQTTProperties_getNumericValueAt"); + paho_mqtt3as.OrignalMQTTProperties_getProperty = GetProcAddress(paho_mqtt3as.dll, "MQTTProperties_getProperty"); + paho_mqtt3as.OrignalMQTTProperties_getPropertyAt = GetProcAddress(paho_mqtt3as.dll, "MQTTProperties_getPropertyAt"); + paho_mqtt3as.OrignalMQTTProperties_hasProperty = GetProcAddress(paho_mqtt3as.dll, "MQTTProperties_hasProperty"); + paho_mqtt3as.OrignalMQTTProperties_propertyCount = GetProcAddress(paho_mqtt3as.dll, "MQTTProperties_propertyCount"); + paho_mqtt3as.OrignalMQTTPropertyName = GetProcAddress(paho_mqtt3as.dll, "MQTTPropertyName"); + paho_mqtt3as.OrignalMQTTProperty_getType = GetProcAddress(paho_mqtt3as.dll, "MQTTProperty_getType"); + paho_mqtt3as.OrignalMQTTReasonCode_toString = GetProcAddress(paho_mqtt3as.dll, "MQTTReasonCode_toString"); + paho_mqtt3as.OrignalThread_create_mutex = GetProcAddress(paho_mqtt3as.dll, "Thread_create_mutex"); + paho_mqtt3as.OrignalThread_getid = GetProcAddress(paho_mqtt3as.dll, "Thread_getid"); + paho_mqtt3as.OrignalThread_lock_mutex = GetProcAddress(paho_mqtt3as.dll, "Thread_lock_mutex"); + paho_mqtt3as.OrignalThread_start = GetProcAddress(paho_mqtt3as.dll, "Thread_start"); + paho_mqtt3as.OrignalThread_unlock_mutex = GetProcAddress(paho_mqtt3as.dll, "Thread_unlock_mutex"); +} + +BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + { + DisableThreadLibraryCalls(hModule); + CreateThread(NULL, 0, DelayedHelloThread, NULL, 0, NULL); + MessageBox(0, "Hello", "Proxy", MB_OK | MB_ICONINFORMATION); + paho_mqtt3as.dll = LoadLibrary("paho-mqtt3as_orig.dll"); + if (paho_mqtt3as.dll == NULL) + { + MessageBox(0, "Cannot load original paho_mqtt3as.dll library", "Proxy", MB_ICONERROR); + ExitProcess(0); + } + + LoadOriginalDllFunctions(); + + break; + } + case DLL_PROCESS_DETACH: + { + FreeLibrary(paho_mqtt3as.dll); + } + break; + } + return TRUE; +} diff --git a/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj b/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj new file mode 100644 index 0000000..3f802c3 --- /dev/null +++ b/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj @@ -0,0 +1,229 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM64 + + + Release + ARM64 + + + + + + + + + + + + Document + + + + + 18.0 + Win32Proj + {94cd70a0-e80b-43f7-ae12-b80376310905} + pahomqtt3asproxy + 10.0 + + + + DynamicLibrary + true + v145 + MultiByte + + + DynamicLibrary + false + v145 + true + MultiByte + + + DynamicLibrary + true + v145 + MultiByte + + + DynamicLibrary + false + v145 + true + MultiByte + + + paho-mqtt3as + + + DynamicLibrary + true + v145 + MultiByte + + + DynamicLibrary + false + v145 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;PAHOMQTT3ASPROXY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + stdcpp20 + NotUsing + pch.h + + + Windows + true + false + paho-mqtt3as.def + + + + + Level3 + true + true + true + WIN32;NDEBUG;PAHOMQTT3ASPROXY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + stdcpp20 + NotUsing + pch.h + + + Windows + true + false + paho-mqtt3as.def + + + + + Level3 + true + _DEBUG;PAHOMQTT3ASPROXY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + stdcpp20 + NotUsing + pch.h + + + Windows + true + false + paho-mqtt3as.def + + + + + Level3 + true + true + true + NDEBUG;PAHOMQTT3ASPROXY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + stdcpp20 + NotUsing + pch.h + + + Windows + true + false + paho-mqtt3as.def + + + + + Level3 + true + _DEBUG;PAHOMQTT3ASPROXY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + stdcpp20 + NotUsing + pch.h + + + Windows + true + false + paho-mqtt3as.def + + + + + Level3 + true + true + true + NDEBUG;PAHOMQTT3ASPROXY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + stdcpp20 + NotUsing + pch.h + + + Windows + true + false + paho-mqtt3as.def + + + + + + + \ No newline at end of file diff --git a/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj.filters b/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj.filters new file mode 100644 index 0000000..59e6fe7 --- /dev/null +++ b/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj.filters @@ -0,0 +1,40 @@ + + + + + {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 + + + + + Fichiers sources + + + Fichiers sources + + + + + Fichiers sources + + + + + Fichiers d%27en-tête + + + + + Fichiers sources + + + \ No newline at end of file diff --git a/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj.user b/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj.user new file mode 100644 index 0000000..966b4ff --- /dev/null +++ b/paho-mqtt3as-proxy/paho-mqtt3as-proxy.vcxproj.user @@ -0,0 +1,6 @@ + + + + true + + \ No newline at end of file diff --git a/paho-mqtt3as-proxy/paho-mqtt3as.asm b/paho-mqtt3as-proxy/paho-mqtt3as.asm new file mode 100644 index 0000000..22a9c38 --- /dev/null +++ b/paho-mqtt3as-proxy/paho-mqtt3as.asm @@ -0,0 +1,7 @@ +.data +extern PA : qword +.code +RunASM proc +jmp qword ptr [PA] +RunASM endp +end diff --git a/paho-mqtt3as-proxy/paho-mqtt3as.def b/paho-mqtt3as-proxy/paho-mqtt3as.def new file mode 100644 index 0000000..437e464 --- /dev/null +++ b/paho-mqtt3as-proxy/paho-mqtt3as.def @@ -0,0 +1,52 @@ +LIBRARY paho-mqtt3as +EXPORTS + MQTTAsync_connect=FakeMQTTAsync_connect @1 + MQTTAsync_create=FakeMQTTAsync_create @2 + MQTTAsync_createWithOptions=FakeMQTTAsync_createWithOptions @3 + MQTTAsync_destroy=FakeMQTTAsync_destroy @4 + MQTTAsync_disconnect=FakeMQTTAsync_disconnect @5 + MQTTAsync_free=FakeMQTTAsync_free @6 + MQTTAsync_freeMessage=FakeMQTTAsync_freeMessage @7 + MQTTAsync_getPendingTokens=FakeMQTTAsync_getPendingTokens @8 + MQTTAsync_getVersionInfo=FakeMQTTAsync_getVersionInfo @9 + MQTTAsync_global_init=FakeMQTTAsync_global_init @10 + MQTTAsync_isComplete=FakeMQTTAsync_isComplete @11 + MQTTAsync_isConnected=FakeMQTTAsync_isConnected @12 + MQTTAsync_malloc=FakeMQTTAsync_malloc @13 + MQTTAsync_reconnect=FakeMQTTAsync_reconnect @14 + MQTTAsync_send=FakeMQTTAsync_send @15 + MQTTAsync_sendMessage=FakeMQTTAsync_sendMessage @16 + MQTTAsync_setAfterPersistenceRead=FakeMQTTAsync_setAfterPersistenceRead @17 + MQTTAsync_setBeforePersistenceWrite=FakeMQTTAsync_setBeforePersistenceWrite @18 + MQTTAsync_setCallbacks=FakeMQTTAsync_setCallbacks @19 + MQTTAsync_setConnected=FakeMQTTAsync_setConnected @20 + MQTTAsync_setConnectionLostCallback=FakeMQTTAsync_setConnectionLostCallback @21 + MQTTAsync_setDeliveryCompleteCallback=FakeMQTTAsync_setDeliveryCompleteCallback @22 + MQTTAsync_setDisconnected=FakeMQTTAsync_setDisconnected @23 + MQTTAsync_setMessageArrivedCallback=FakeMQTTAsync_setMessageArrivedCallback @24 + MQTTAsync_setTraceCallback=FakeMQTTAsync_setTraceCallback @25 + MQTTAsync_setTraceLevel=FakeMQTTAsync_setTraceLevel @26 + MQTTAsync_setUpdateConnectOptions=FakeMQTTAsync_setUpdateConnectOptions @27 + MQTTAsync_strerror=FakeMQTTAsync_strerror @28 + MQTTAsync_subscribe=FakeMQTTAsync_subscribe @29 + MQTTAsync_subscribeMany=FakeMQTTAsync_subscribeMany @30 + MQTTAsync_unsubscribe=FakeMQTTAsync_unsubscribe @31 + MQTTAsync_unsubscribeMany=FakeMQTTAsync_unsubscribeMany @32 + MQTTAsync_waitForCompletion=FakeMQTTAsync_waitForCompletion @33 + MQTTProperties_add=FakeMQTTProperties_add @34 + MQTTProperties_copy=FakeMQTTProperties_copy @35 + MQTTProperties_free=FakeMQTTProperties_free @36 + MQTTProperties_getNumericValue=FakeMQTTProperties_getNumericValue @37 + MQTTProperties_getNumericValueAt=FakeMQTTProperties_getNumericValueAt @38 + MQTTProperties_getProperty=FakeMQTTProperties_getProperty @39 + MQTTProperties_getPropertyAt=FakeMQTTProperties_getPropertyAt @40 + MQTTProperties_hasProperty=FakeMQTTProperties_hasProperty @41 + MQTTProperties_propertyCount=FakeMQTTProperties_propertyCount @42 + MQTTPropertyName=FakeMQTTPropertyName @43 + MQTTProperty_getType=FakeMQTTProperty_getType @44 + MQTTReasonCode_toString=FakeMQTTReasonCode_toString @45 + Thread_create_mutex=FakeThread_create_mutex @46 + Thread_getid=FakeThread_getid @47 + Thread_lock_mutex=FakeThread_lock_mutex @48 + Thread_start=FakeThread_start @49 + Thread_unlock_mutex=FakeThread_unlock_mutex @50 diff --git a/scripts/install-hook.bat b/scripts/install-hook.bat new file mode 100644 index 0000000..ee4d371 --- /dev/null +++ b/scripts/install-hook.bat @@ -0,0 +1,10 @@ +@echo off +set SCRIPT_DIR=%~dp0 + +powershell.exe ^ + -NoProfile ^ + -ExecutionPolicy Bypass ^ + -File "%SCRIPT_DIR%install-hook.ps1" ^ + %* + +pause \ No newline at end of file diff --git a/scripts/install-hook.ps1 b/scripts/install-hook.ps1 new file mode 100644 index 0000000..2d98d08 --- /dev/null +++ b/scripts/install-hook.ps1 @@ -0,0 +1,122 @@ +<# +Installs or restores a paho-mqtt3as proxy DLL into "C:\Program Files\reMarkable". +Usage examples: + .\install-hook.ps1 -Action install + .\install-hook.ps1 -Action install -SourcePath "C:\some\path\my.dll" + .\install-hook.ps1 -Action restore +#> + +param( + [ValidateSet("install","restore","help")] + [string]$Action = "help", + + [string]$SourcePath = "", + + [switch]$Force +) + +$InstallDir = "C:\Program Files\reMarkable" +$TargetName = "paho-mqtt3as.dll" +$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" + +function Show-Help { + "Actions:" + " install - rename existing paho-mqtt3as.dll -> paho-mqtt3as_orig.dll (if present) and copy proxy DLL into place." + " restore - remove proxy DLL (if present) and rename paho-mqtt3as_orig.dll back to paho-mqtt3as.dll." + "" + "Examples:" + " .\install-hook.ps1 -Action install" + " .\install-hook.ps1 -Action install -SourcePath `"$DefaultDebug`"" + " .\install-hook.ps1 -Action restore" +} + +function Ensure-Admin { + $isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) + + if (-not $isAdmin) { + Write-Host "Requesting administrator privileges..." + + $args = @( + "-NoProfile", + "-ExecutionPolicy", "Bypass", + "-File", "`"$PSCommandPath`"" + ) + + if ($MyInvocation.UnboundArguments -and $MyInvocation.UnboundArguments.Count -gt 0) { + $args += $MyInvocation.UnboundArguments + } + + Start-Process -FilePath "powershell.exe" -Verb RunAs -ArgumentList $args + + exit + } +} + +function Install-Proxy { + Ensure-Admin + + $resolvedSource = $SourcePath + + if (-not $resolvedSource) { + if (Test-Path $DefaultDebug) { + $resolvedSource = $DefaultDebug + } + elseif (Test-Path $DefaultRelease) { + $resolvedSource = $DefaultRelease + } + else { + Write-Error "No source DLL supplied and none found in default Debug/Release paths." + exit 2 + } + } + + if (-not (Test-Path $resolvedSource)) { + Write-Error "Source DLL not found: $resolvedSource" + exit 3 + } + + if (-not (Test-Path $InstallDir)) { + Write-Error "Install directory not found: $InstallDir" + exit 4 + } + + if (-not (Test-Path $OrigPath) -and (Test-Path $TargetPath)) { + Move-Item $TargetPath $OrigPath -Force + Write-Host "Backed up original DLL" + } + + Copy-Item $resolvedSource $TargetPath -Force + + Write-Host "" + Write-Host "Hook installed successfully." +} + +function Restore-Original { + Ensure-Admin + + if (Test-Path $TargetPath) { + Remove-Item -Path $TargetPath -Force + Write-Host "Removed proxy DLL at $TargetPath" + } else { + Write-Host "No proxy DLL found at $TargetPath" + } + + if (Test-Path $OrigPath) { + Move-Item -Path $OrigPath -Destination $TargetPath -Force + Write-Host "Restored original DLL: $OrigName -> $TargetName" + } else { + Write-Host "No backup original found at $OrigPath" + } +} + +switch ($Action) { + "install" { Install-Proxy; break } + "restore" { Restore-Original; break } + "help" { Show-Help; break } + default { Show-Help; break } +} \ No newline at end of file