From 18fb8b3d01d09cf5024280d14de24fe6b563a5bd Mon Sep 17 00:00:00 2001 From: Artem Dzhemesiuk Date: Mon, 22 Aug 2022 16:48:29 +0200 Subject: [PATCH] Hijacked dinput8.dll instead of msimg32.dll --- .github/workflows/release.yml | 4 +-- CMakeLists.txt | 2 +- README.md | 6 ++-- build.bat | 4 +-- src/proxy/dinput8.cpp | 57 +++++++++++++++++++++++++++++++++++ src/proxy/dinput8.def | 8 +++++ src/proxy/msimg32.cpp | 53 -------------------------------- src/proxy/msimg32.def | 7 ----- 8 files changed, 73 insertions(+), 68 deletions(-) create mode 100644 src/proxy/dinput8.cpp create mode 100644 src/proxy/dinput8.def delete mode 100644 src/proxy/msimg32.cpp delete mode 100644 src/proxy/msimg32.def diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 05d4f14..803cffd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,6 +29,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./BUILD/Release/msimg32.dll - asset_name: msimg32.dll + asset_path: ./BUILD/Release/dinput8.dll + asset_name: dinput8.dll asset_content_type: application/octet-stream \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a54216..794114a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,7 @@ set(DEFS -DVERSION="${VERSION}" ) -file(GLOB_RECURSE PROJECT_SOURCE_FILES "src/*.h" "src/*.cpp" "src/proxy/msimg32.def") +file(GLOB_RECURSE PROJECT_SOURCE_FILES "src/*.h" "src/*.cpp" "src/proxy/dinput8.def") if(WIN32 AND (MSVC OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")) add_definitions(/MT) diff --git a/README.md b/README.md index ca699d7..4777fb3 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,12 @@ - CMake 3.8 или новее Для сборки нужно выполнить `build.bat` в корне проекта.
-Итоговая DLL будет находиться по пути `BUILD\Release\msimg32.dll` +Итоговая DLL будет находиться по пути `BUILD\Release\dinput8.dll` ## Установка -- Скачать последнюю версию мода со страницы [Releases](https://github.com/zziger/supercow-mod/releases/latest). (качать файл `msimg32.dll`) -- Поместить файл `msimg32.dll` в папку с игрой. Название файла менять нельзя. +- Скачать последнюю версию мода [тут](https://github.com/zziger/supercow-mod/releases/latest/download/dinput8.dll). +- Поместить скачанный файл `dinput8.dll` в папку с игрой. Название файла менять нельзя. ## Функции diff --git a/build.bat b/build.bat index c5bcf24..3a8563a 100644 --- a/build.bat +++ b/build.bat @@ -1,4 +1,4 @@ cmake -BBUILD . -A Win32 -DVERSION="%1" cmake --build BUILD --config Release -IF EXIST BUILD\Release\msimg32.dll DEL /f BUILD\Release\msimg32.dll -copy BUILD\Release\supercow-mod.dll BUILD\Release\msimg32.dll \ No newline at end of file +IF EXIST BUILD\Release\dinput8.dll DEL /f BUILD\Release\dinput8.dll +copy BUILD\Release\supercow-mod.dll BUILD\Release\dinput8.dll \ No newline at end of file diff --git a/src/proxy/dinput8.cpp b/src/proxy/dinput8.cpp new file mode 100644 index 0000000..13a4591 --- /dev/null +++ b/src/proxy/dinput8.cpp @@ -0,0 +1,57 @@ +#include +#include + +#include "main.h" + +struct dinput8_dll { + HMODULE dll; + FARPROC OrignalDirectInput8Create; + FARPROC OrignalDllCanUnloadNow; + FARPROC OrignalDllGetClassObject; + FARPROC OrignalDllRegisterServer; + FARPROC OrignalDllUnregisterServer; + FARPROC OrignalGetdfDIJoystick; +} dinput8; + +extern "C" +{ + __declspec(naked) void __stdcall FakeDirectInput8Create() { _asm { jmp[dinput8.OrignalDirectInput8Create] } } + __declspec(naked) void __stdcall FakeDllCanUnloadNow() { _asm { jmp[dinput8.OrignalDllCanUnloadNow] } } + __declspec(naked) void __stdcall FakeDllGetClassObject() { _asm { jmp[dinput8.OrignalDllGetClassObject] } } + __declspec(naked) void __stdcall FakeDllRegisterServer() { _asm { jmp[dinput8.OrignalDllRegisterServer] } } + __declspec(naked) void __stdcall FakeDllUnregisterServer() { _asm { jmp[dinput8.OrignalDllUnregisterServer] } } + __declspec(naked) void __stdcall FakeGetdfDIJoystick() { _asm { jmp[dinput8.OrignalGetdfDIJoystick] } } +} + +BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { + char path[MAX_PATH]; + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + { + wchar_t path[MAX_PATH]; + GetSystemDirectory(path, MAX_PATH); + std::wstring pathname = path + std::wstring(L"\\dinput8.dll"); + dinput8.dll = LoadLibrary(pathname.c_str()); + if (dinput8.dll == false) + { + MessageBox(0, L"Cannot load original dinput8.dll library", L"Proxy", MB_ICONERROR); + ExitProcess(0); + } + dinput8.OrignalDirectInput8Create = GetProcAddress(dinput8.dll, "DirectInput8Create"); + dinput8.OrignalDllCanUnloadNow = GetProcAddress(dinput8.dll, "DllCanUnloadNow"); + dinput8.OrignalDllGetClassObject = GetProcAddress(dinput8.dll, "DllGetClassObject"); + dinput8.OrignalDllRegisterServer = GetProcAddress(dinput8.dll, "DllRegisterServer"); + dinput8.OrignalDllUnregisterServer = GetProcAddress(dinput8.dll, "DllUnregisterServer"); + dinput8.OrignalGetdfDIJoystick = GetProcAddress(dinput8.dll, "GetdfDIJoystick"); + + break; + } + case DLL_PROCESS_DETACH: + { + FreeLibrary(dinput8.dll); + } + break; + } + return main(hModule, ul_reason_for_call, lpReserved); +} diff --git a/src/proxy/dinput8.def b/src/proxy/dinput8.def new file mode 100644 index 0000000..da05358 --- /dev/null +++ b/src/proxy/dinput8.def @@ -0,0 +1,8 @@ +LIBRARY dinput8 +EXPORTS + DirectInput8Create=FakeDirectInput8Create @1 + DllCanUnloadNow=FakeDllCanUnloadNow @2 + DllGetClassObject=FakeDllGetClassObject @3 + DllRegisterServer=FakeDllRegisterServer @4 + DllUnregisterServer=FakeDllUnregisterServer @5 + GetdfDIJoystick=FakeGetdfDIJoystick @6 diff --git a/src/proxy/msimg32.cpp b/src/proxy/msimg32.cpp deleted file mode 100644 index 1d895a0..0000000 --- a/src/proxy/msimg32.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include - -#include "main.h" - -struct msimg32_dll { - HMODULE dll; - FARPROC OrignalAlphaBlend; - FARPROC OrignalDllInitialize; - FARPROC OrignalGradientFill; - FARPROC OrignalTransparentBlt; - FARPROC OrignalvSetDdrawflag; -} msimg32; - -extern "C" -{ - __declspec(naked) void __stdcall FakeAlphaBlend() { _asm { jmp[msimg32.OrignalAlphaBlend] } } - __declspec(naked) void __stdcall FakeDllInitialize() { _asm { jmp[msimg32.OrignalDllInitialize] } } - __declspec(naked) void __stdcall FakeGradientFill() { _asm { jmp[msimg32.OrignalGradientFill] } } - __declspec(naked) void __stdcall FakeTransparentBlt() { _asm { jmp[msimg32.OrignalTransparentBlt] } } - __declspec(naked) void __stdcall FakevSetDdrawflag() { _asm { jmp[msimg32.OrignalvSetDdrawflag] } } -} - -BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - { - wchar_t path[MAX_PATH]; - GetSystemDirectory(path, MAX_PATH); - std::wstring pathname = path + std::wstring(L"\\msimg32.dll"); - msimg32.dll = LoadLibrary(pathname.c_str()); - if (msimg32.dll == false) - { - MessageBox(0, L"Cannot load original msimg32.dll library", L"Proxy", MB_ICONERROR); - ExitProcess(0); - } - msimg32.OrignalAlphaBlend = GetProcAddress(msimg32.dll, "AlphaBlend"); - msimg32.OrignalDllInitialize = GetProcAddress(msimg32.dll, "DllInitialize"); - msimg32.OrignalGradientFill = GetProcAddress(msimg32.dll, "GradientFill"); - msimg32.OrignalTransparentBlt = GetProcAddress(msimg32.dll, "TransparentBlt"); - msimg32.OrignalvSetDdrawflag = GetProcAddress(msimg32.dll, "vSetDdrawflag"); - - break; - } - case DLL_PROCESS_DETACH: - { - FreeLibrary(msimg32.dll); - } - break; - } - return main(hModule, ul_reason_for_call, lpReserved); -} diff --git a/src/proxy/msimg32.def b/src/proxy/msimg32.def deleted file mode 100644 index 73f0467..0000000 --- a/src/proxy/msimg32.def +++ /dev/null @@ -1,7 +0,0 @@ -LIBRARY msimg32 -EXPORTS - AlphaBlend=FakeAlphaBlend @1 - DllInitialize=FakeDllInitialize @2 - GradientFill=FakeGradientFill @3 - TransparentBlt=FakeTransparentBlt @4 - vSetDdrawflag=FakevSetDdrawflag @5