From 7c4cb763b28f390d1edcc884045bfab641b10478 Mon Sep 17 00:00:00 2001 From: RD42 <42702181+dashr9230@users.noreply.github.com> Date: Fri, 27 Oct 2023 17:05:24 +0800 Subject: [PATCH] [launch3] Replace DLL injection functions with Detours library integration --- launch3/detours.h | 616 +++++++++++++++++++++++++++++++++++++++++ launch3/detours.lib | Bin 0 -> 182134 bytes launch3/launch3.aps | Bin 21432 -> 21432 bytes launch3/launch3.dsp | 4 + launch3/launch3.ncb | Bin 58368 -> 66560 bytes launch3/launch3.opt | Bin 49664 -> 48640 bytes launch3/launch3Dlg.cpp | 243 +--------------- 7 files changed, 622 insertions(+), 241 deletions(-) create mode 100644 launch3/detours.h create mode 100644 launch3/detours.lib diff --git a/launch3/detours.h b/launch3/detours.h new file mode 100644 index 0000000..e9acca5 --- /dev/null +++ b/launch3/detours.h @@ -0,0 +1,616 @@ +////////////////////////////////////////////////////////////////////////////// +// +// File: detours.h +// Module: detours.lib +// +// Detours for binary functions. Version 1.5 (Build 46) +// +// Copyright 1995-2001, Microsoft Corporation +// + +#pragma once +#ifndef _DETOURS_H_ +#define _DETOURS_H_ + +#pragma comment(lib, "detours") + +////////////////////////////////////////////////////////////////////////////// +// +#ifndef GUID_DEFINED +#define GUID_DEFINED +typedef struct _GUID +{ + DWORD Data1; + WORD Data2; + WORD Data3; + BYTE Data4[ 8 ]; +} GUID; +#endif // !GUID_DEFINED + +#if defined(__cplusplus) +#ifndef _REFGUID_DEFINED +#define _REFGUID_DEFINED +#define REFGUID const GUID & +#endif // !_REFGUID_DEFINED +#else // !__cplusplus +#ifndef _REFGUID_DEFINED +#define _REFGUID_DEFINED +#define REFGUID const GUID * const +#endif // !_REFGUID_DEFINED +#endif // !__cplusplus +// +////////////////////////////////////////////////////////////////////////////// + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/////////////////////////////////////////////////// Instruction Target Macros. +// +#define DETOUR_INSTRUCTION_TARGET_NONE ((PBYTE)0) +#define DETOUR_INSTRUCTION_TARGET_DYNAMIC ((PBYTE)~0ul) + +/////////////////////////////////////////////////////////// Trampoline Macros. +// +// DETOUR_TRAMPOLINE(trampoline_prototype, target_name) +// +// The naked trampoline must be at least DETOUR_TRAMPOLINE_SIZE bytes. +// +#define DETOUR_TRAMPOLINE_SIZE 32 +#define DETOUR_SECTION_HEADER_SIGNATURE 0x00727444 // "Dtr\0" + +#define DETOUR_TRAMPOLINE(trampoline,target) \ +static PVOID __fastcall _Detours_GetVA_##target(VOID) \ +{ \ + return ⌖ \ +} \ +\ +__declspec(naked) trampoline \ +{ \ + __asm { nop };\ + __asm { nop };\ + __asm { call _Detours_GetVA_##target };\ + __asm { jmp eax };\ + __asm { ret };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ +} + +#define DETOUR_TRAMPOLINE_EMPTY(trampoline) \ +__declspec(naked) trampoline \ +{ \ + __asm { nop };\ + __asm { nop };\ + __asm { xor eax, eax };\ + __asm { mov eax, [eax] };\ + __asm { ret };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ + __asm { nop };\ +} + +/////////////////////////////////////////////////////////// Binary Structures. +// +#pragma pack(push, 8) +typedef struct _DETOUR_SECTION_HEADER +{ + DWORD cbHeaderSize; + DWORD nSignature; + DWORD nDataOffset; + DWORD cbDataSize; + + DWORD nOriginalImportVirtualAddress; + DWORD nOriginalImportSize; + DWORD nOriginalBoundImportVirtualAddress; + DWORD nOriginalBoundImportSize; + + DWORD nOriginalIatVirtualAddress; + DWORD nOriginalIatSize; + DWORD nOriginalSizeOfImage; + DWORD nReserve; +} DETOUR_SECTION_HEADER, *PDETOUR_SECTION_HEADER; + +typedef struct _DETOUR_SECTION_RECORD +{ + DWORD cbBytes; + DWORD nReserved; + GUID guid; +} DETOUR_SECTION_RECORD, *PDETOUR_SECTION_RECORD; +#pragma pack(pop) + +#define DETOUR_SECTION_HEADER_DECLARE(cbSectionSize) \ +{ \ + sizeof(DETOUR_SECTION_HEADER),\ + DETOUR_SECTION_HEADER_SIGNATURE,\ + sizeof(DETOUR_SECTION_HEADER),\ + (cbSectionSize),\ + \ + 0,\ + 0,\ + 0,\ + 0,\ + \ + 0,\ + 0,\ + 0,\ + 0,\ +} + +///////////////////////////////////////////////////////////// Binary Typedefs. +// +typedef BOOL (CALLBACK *PF_DETOUR_BINARY_BYWAY_CALLBACK)(PVOID pContext, + PCHAR pszFile, + PCHAR *ppszOutFile); +typedef BOOL (CALLBACK *PF_DETOUR_BINARY_FILE_CALLBACK)(PVOID pContext, + PCHAR pszOrigFile, + PCHAR pszFile, + PCHAR *ppszOutFile); +typedef BOOL (CALLBACK *PF_DETOUR_BINARY_SYMBOL_CALLBACK)(PVOID pContext, + DWORD nOrdinal, + PCHAR pszOrigSymbol, + PCHAR pszSymbol, + PCHAR *ppszOutSymbol); +typedef BOOL (CALLBACK *PF_DETOUR_BINARY_FINAL_CALLBACK)(PVOID pContext); +typedef BOOL (CALLBACK *PF_DETOUR_BINARY_EXPORT_CALLBACK)(PVOID pContext, + DWORD nOrdinal, + PCHAR pszName, + PBYTE pbCode); + +typedef VOID * PDETOUR_BINARY; +typedef VOID * PDETOUR_LOADED_BINARY; + +//////////////////////////////////////////////////////// Trampoline Functions. +// +PBYTE WINAPI DetourFunction(PBYTE pbTargetFunction, + PBYTE pbDetourFunction); + +BOOL WINAPI DetourFunctionWithEmptyTrampoline(PBYTE pbTrampoline, + PBYTE pbTarget, + PBYTE pbDetour); + +BOOL WINAPI DetourFunctionWithEmptyTrampolineEx(PBYTE pbTrampoline, + PBYTE pbTarget, + PBYTE pbDetour, + PBYTE *ppbRealTrampoline, + PBYTE *ppbRealTarget, + PBYTE *ppbRealDetour); + +BOOL WINAPI DetourFunctionWithTrampoline(PBYTE pbTrampoline, + PBYTE pbDetour); + +BOOL WINAPI DetourFunctionWithTrampolineEx(PBYTE pbTrampoline, + PBYTE pbDetour, + PBYTE *ppbRealTrampoline, + PBYTE *ppbRealTarget); + +BOOL WINAPI DetourRemove(PBYTE pbTrampoline, PBYTE pbDetour); + +////////////////////////////////////////////////////////////// Code Functions. +// +PBYTE WINAPI DetourFindFunction(PCHAR pszModule, PCHAR pszFunction); +PBYTE WINAPI DetourGetFinalCode(PBYTE pbCode, BOOL fSkipJmp); + +PBYTE WINAPI DetourCopyInstruction(PBYTE pbDst, PBYTE pbSrc, PBYTE *ppbTarget); +PBYTE WINAPI DetourCopyInstructionEx(PBYTE pbDst, + PBYTE pbSrc, + PBYTE *ppbTarget, + LONG *plExtra); + +///////////////////////////////////////////////////// Loaded Binary Functions. +// +HMODULE WINAPI DetourEnumerateModules(HMODULE hModuleLast); +PBYTE WINAPI DetourGetEntryPoint(HMODULE hModule); +BOOL WINAPI DetourEnumerateExports(HMODULE hModule, + PVOID pContext, + PF_DETOUR_BINARY_EXPORT_CALLBACK pfExport); + +PBYTE WINAPI DetourFindPayload(HMODULE hModule, REFGUID rguid, DWORD *pcbData); +DWORD WINAPI DetourGetSizeOfPayloads(HMODULE hModule); + +///////////////////////////////////////////////// Persistent Binary Functions. +// +BOOL WINAPI DetourBinaryBindA(PCHAR pszFile, PCHAR pszDll, PCHAR pszPath); +BOOL WINAPI DetourBinaryBindW(PWCHAR pwzFile, PWCHAR pwzDll, PWCHAR pwzPath); +#ifdef UNICODE +#define DetourBinaryBind DetourBinaryBindW +#else +#define DetourBinaryBind DetourBinaryBindA +#endif // !UNICODE + +PDETOUR_BINARY WINAPI DetourBinaryOpen(HANDLE hFile); +PBYTE WINAPI DetourBinaryEnumeratePayloads(PDETOUR_BINARY pBinary, + GUID *pGuid, + DWORD *pcbData, + DWORD *pnIterator); +PBYTE WINAPI DetourBinaryFindPayload(PDETOUR_BINARY pBinary, + REFGUID rguid, + DWORD *pcbData); +PBYTE WINAPI DetourBinarySetPayload(PDETOUR_BINARY pBinary, + REFGUID rguid, + PBYTE pbData, + DWORD cbData); +BOOL WINAPI DetourBinaryDeletePayload(PDETOUR_BINARY pBinary, REFGUID rguid); +BOOL WINAPI DetourBinaryPurgePayloads(PDETOUR_BINARY pBinary); +BOOL WINAPI DetourBinaryResetImports(PDETOUR_BINARY pBinary); +BOOL WINAPI DetourBinaryEditImports(PDETOUR_BINARY pBinary, + PVOID pContext, + PF_DETOUR_BINARY_BYWAY_CALLBACK pfByway, + PF_DETOUR_BINARY_FILE_CALLBACK pfFile, + PF_DETOUR_BINARY_SYMBOL_CALLBACK pfSymbol, + PF_DETOUR_BINARY_FINAL_CALLBACK pfFinal); +BOOL WINAPI DetourBinaryWrite(PDETOUR_BINARY pBinary, HANDLE hFile); +BOOL WINAPI DetourBinaryClose(PDETOUR_BINARY pBinary); + +/////////////////////////////////////////////// First Chance Exception Filter. +// +LPTOP_LEVEL_EXCEPTION_FILTER WINAPI +DetourFirstChanceExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelFilter); + +///////////////////////////////////////////////// Create Process & Inject Dll. +// +typedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEA) + (LPCSTR lpApplicationName, + LPSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCSTR lpCurrentDirectory, + LPSTARTUPINFOA lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation); + +typedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEW) + (LPCWSTR lpApplicationName, + LPWSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCWSTR lpCurrentDirectory, + LPSTARTUPINFOW lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation); + +BOOL WINAPI DetourCreateProcessWithDllA(LPCSTR lpApplicationName, + LPSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCSTR lpCurrentDirectory, + LPSTARTUPINFOA lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation, + LPCSTR lpDllName, + PDETOUR_CREATE_PROCESS_ROUTINEA + pfCreateProcessA); + +BOOL WINAPI DetourCreateProcessWithDllW(LPCWSTR lpApplicationName, + LPWSTR lpCommandLine, + LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, + BOOL bInheritHandles, + DWORD dwCreationFlags, + LPVOID lpEnvironment, + LPCWSTR lpCurrentDirectory, + LPSTARTUPINFOW lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation, + LPCWSTR lpDllName, + PDETOUR_CREATE_PROCESS_ROUTINEW + pfCreateProcessW); + +#ifdef UNICODE +#define DetourCreateProcessWithDll DetourCreateProcessWithDllW +#define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEW +#else +#define DetourCreateProcessWithDll DetourCreateProcessWithDllA +#define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEA +#endif // !UNICODE + +BOOL WINAPI DetourContinueProcessWithDllA(HANDLE hProcess, LPCSTR lpDllName); +BOOL WINAPI DetourContinueProcessWithDllW(HANDLE hProcess, LPCWSTR lpDllName); + +#ifdef UNICODE +#define DetourContinueProcessWithDll DetourContinueProcessWithDllW +#else +#define DetourContinueProcessWithDll DetourContinueProcessWithDllA +#endif // !UNICODE +// +////////////////////////////////////////////////////////////////////////////// +#ifdef __cplusplus +} +#endif // __cplusplus + +/////////////////////////////////////////////////////////////////// Old Names. +// +#define ContinueProcessWithDll DetourContinueProcessWithDll +#define ContinueProcessWithDllA DetourContinueProcessWithDllA +#define ContinueProcessWithDllW DetourContinueProcessWithDllW +#define CreateProcessWithDll DetourCreateProcessWithDll +#define CreateProcessWithDllA DetourCreateProcessWithDllA +#define CreateProcessWithDllW DetourCreateProcessWithDllW +#define DETOUR_TRAMPOLINE_WO_TARGET DETOUR_TRAMPOLINE_EMPTY +#define DetourBinaryPurgePayload DetourBinaryPurgePayloads +#define DetourEnumerateExportsForInstance DetourEnumerateExports +#define DetourEnumerateInstances DetourEnumerateModules +#define DetourFindEntryPointForInstance DetourGetEntryPoint +#define DetourFindFinalCode DetourGetFinalCode +#define DetourFindPayloadInBinary DetourFindPayload +#define DetourGetSizeOfBinary DetourGetSizeOfPayloads +#define DetourRemoveWithTrampoline DetourRemove +#define PCREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINE +#define PCREATE_PROCESS_ROUTINEA PDETOUR_CREATE_PROCESS_ROUTINEA +#define PCREATE_PROCESS_ROUTINEW PDETOUR_CREATE_PROCESS_ROUTINEW +// + +//////////////////////////////////////////////// Detours Internal Definitions. +// +#ifdef __cplusplus +#ifdef DETOURS_INTERNAL + +////////////////////////////////////////////////////////////////////////////// +// +#ifdef IMAGEAPI // defined by IMAGEHLP.H +typedef LPAPI_VERSION (NTAPI *PF_ImagehlpApiVersionEx)(LPAPI_VERSION AppVersion); + +typedef BOOL (NTAPI *PF_SymInitialize)(IN HANDLE hProcess, + IN LPSTR UserSearchPath, + IN BOOL fInvadeProcess); +typedef DWORD (NTAPI *PF_SymSetOptions)(IN DWORD SymOptions); +typedef DWORD (NTAPI *PF_SymGetOptions)(VOID); +typedef BOOL (NTAPI *PF_SymLoadModule)(IN HANDLE hProcess, + IN HANDLE hFile, + IN PSTR ImageName, + IN PSTR ModuleName, + IN DWORD BaseOfDll, + IN DWORD SizeOfDll); +typedef BOOL (NTAPI *PF_SymGetModuleInfo)(IN HANDLE hProcess, + IN DWORD dwAddr, + OUT PIMAGEHLP_MODULE ModuleInfo); +typedef BOOL (NTAPI *PF_SymGetSymFromName)(IN HANDLE hProcess, + IN LPSTR Name, + OUT PIMAGEHLP_SYMBOL Symbol); +typedef BOOL (NTAPI *PF_BindImage)(IN LPSTR pszImageName, + IN LPSTR pszDllPath, + IN LPSTR pszSymbolPath); + +typedef struct _DETOUR_SYM_INFO +{ + HANDLE hProcess; + HMODULE hImageHlp; + PF_ImagehlpApiVersionEx pfImagehlpApiVersionEx; + PF_SymInitialize pfSymInitialize; + PF_SymSetOptions pfSymSetOptions; + PF_SymGetOptions pfSymGetOptions; + PF_SymLoadModule pfSymLoadModule; + PF_SymGetModuleInfo pfSymGetModuleInfo; + PF_SymGetSymFromName pfSymGetSymFromName; + PF_BindImage pfBindImage; +} DETOUR_SYM_INFO, *PDETOUR_SYM_INFO; + +PDETOUR_SYM_INFO DetourLoadImageHlp(VOID); + +#endif // IMAGEAPI + +////////////////////////////////////////////////////////////////////////////// +// +class CDetourEnableWriteOnCodePage +{ +public: + CDetourEnableWriteOnCodePage(PBYTE pbCode, LONG cbCode = DETOUR_TRAMPOLINE_SIZE) + { + m_pbCode = pbCode; + m_cbCode = cbCode; + m_dwOldPerm = 0; + m_hProcess = GetCurrentProcess(); + + if (m_pbCode && m_cbCode) { + if (!FlushInstructionCache(m_hProcess, pbCode, cbCode)) { + return; + } + if (!VirtualProtect(pbCode, + cbCode, + PAGE_EXECUTE_READWRITE, + &m_dwOldPerm)) { + return; + } + } + } + + ~CDetourEnableWriteOnCodePage() + { + if (m_dwOldPerm && m_pbCode && m_cbCode) { + DWORD dwTemp = 0; + if (!FlushInstructionCache(m_hProcess, m_pbCode, m_cbCode)) { + return; + } + if (!VirtualProtect(m_pbCode, m_cbCode, m_dwOldPerm, &dwTemp)) { + return; + } + } + } + + BOOL SetPermission(DWORD dwPerms) + { + if (m_dwOldPerm && m_pbCode && m_cbCode) { + m_dwOldPerm = dwPerms; + return TRUE; + } + return FALSE; + } + + BOOL IsValid(VOID) + { + return m_pbCode && m_cbCode && m_dwOldPerm; + } + +private: + HANDLE m_hProcess; + PBYTE m_pbCode; + LONG m_cbCode; + DWORD m_dwOldPerm; +}; + +////////////////////////////////////////////////////////////////////////////// +// +inline PBYTE DetourGenMovEax(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xB8; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEbx(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xBB; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEcx(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xB9; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEdx(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xBA; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEsi(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xBE; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEdi(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xBF; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEbp(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xBD; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenMovEsp(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0xBC; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenPush(PBYTE pbCode, UINT32 nValue) +{ + *pbCode++ = 0x68; + *((UINT32*&)pbCode)++ = nValue; + return pbCode; +} + +inline PBYTE DetourGenPushad(PBYTE pbCode) +{ + *pbCode++ = 0x60; + return pbCode; +} + +inline PBYTE DetourGenPopad(PBYTE pbCode) +{ + *pbCode++ = 0x61; + return pbCode; +} + +inline PBYTE DetourGenJmp(PBYTE pbCode, PBYTE pbJmpDst, PBYTE pbJmpSrc = 0) +{ + if (pbJmpSrc == 0) { + pbJmpSrc = pbCode; + } + *pbCode++ = 0xE9; + *((INT32*&)pbCode)++ = pbJmpDst - (pbJmpSrc + 5); + return pbCode; +} + +inline PBYTE DetourGenCall(PBYTE pbCode, PBYTE pbJmpDst, PBYTE pbJmpSrc = 0) +{ + if (pbJmpSrc == 0) { + pbJmpSrc = pbCode; + } + *pbCode++ = 0xE8; + *((INT32*&)pbCode)++ = pbJmpDst - (pbJmpSrc + 5); + return pbCode; +} + +inline PBYTE DetourGenBreak(PBYTE pbCode) +{ + *pbCode++ = 0xcc; + return pbCode; +} + +inline PBYTE DetourGenRet(PBYTE pbCode) +{ + *pbCode++ = 0xc3; + return pbCode; +} + +inline PBYTE DetourGenNop(PBYTE pbCode) +{ + *pbCode++ = 0x90; + return pbCode; +} +#endif DETOURS_INTERAL +#endif // __cplusplus + +#endif // _DETOURS_H_ +// +//////////////////////////////////////////////////////////////// End of File. diff --git a/launch3/detours.lib b/launch3/detours.lib new file mode 100644 index 0000000000000000000000000000000000000000..620f8ea4f77ef84976d8e6cf948f7c38406e74e8 GIT binary patch literal 182134 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%0Akz$;KnL^kX>k2}C$NY_i?; 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 literal 0 HcmV?d00001 diff --git a/launch3/launch3.aps b/launch3/launch3.aps index 7698fb05b6d8c720a2fdb0ea5e22cd2773852307..9b7a960e1dafa637c71e62ab228485c8035472e7 100644 GIT binary patch delta 16 Ycmdn7oN>o;#tr+q85K4k;Qrwb06r@R82|tP delta 16 Ycmdn7oN>o;#tr+q867qs;Qrwb06yynIRF3v diff --git a/launch3/launch3.dsp b/launch3/launch3.dsp index 378d5f2..5d6ee0e 100644 --- a/launch3/launch3.dsp +++ b/launch3/launch3.dsp @@ -112,6 +112,10 @@ SOURCE=.\StdAfx.cpp # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File +SOURCE=.\detours.h +# End Source File +# Begin Source File + SOURCE=.\launch3.h # End Source File # Begin Source File diff --git a/launch3/launch3.ncb b/launch3/launch3.ncb index 70be1217d22a44c629eb171d29417966f4329cd2..a7215a55d2406d39abd93277ecf2029e7e69ca69 100644 GIT binary patch literal 66560 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 XR5M2M%-~=HJ71n@GRL$c@{9lgzvRV{ literal 49664 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 WrH&jNVLhAj0A)JmA<8UDE$uhux-g0W diff --git a/launch3/launch3Dlg.cpp b/launch3/launch3Dlg.cpp index b8ae96e..384b77c 100644 --- a/launch3/launch3Dlg.cpp +++ b/launch3/launch3Dlg.cpp @@ -5,7 +5,7 @@ #include "launch3.h" #include "launch3Dlg.h" -#include +#include "detours.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -13,43 +13,6 @@ static char THIS_FILE[] = __FILE__; #endif -typedef BOOL (WINAPI* Proc_CreateProcessA)(LPCSTR lpApplicationName, - LPSTR lpCommandLine, - LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - BOOL bInheritHandles, - DWORD dwCreationFlags, - LPVOID lpEnvironment, - LPCSTR lpCurrentDirectory, - LPSTARTUPINFOA lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation); - -BOOL WINAPI CreateProcessWithDllA(LPCSTR lpApplicationName, - LPSTR lpCommandLine, - LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - BOOL bInheritHandles, - DWORD dwCreationFlags, - LPVOID lpEnvironment, - LPCSTR lpCurrentDirectory, - LPSTARTUPINFOA lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation, - LPSTR lpDllFullPath, - Proc_CreateProcessA FuncAddress); -BOOL SuspendTidAndInjectCode(HANDLE hProcess, HANDLE hThread, DWORD dwFuncAddress, const BYTE * lpShellCode, size_t uCodeSize); -BYTE* mov_eax_xx(BYTE* lpCurAddress, DWORD eax); -BYTE* mov_ebx_xx(BYTE* lpCurAddress, DWORD ebx); -BYTE* mov_ecx_xx(BYTE* lpCurAddress, DWORD ecx); -BYTE* mov_edx_xx(BYTE* lpCurAddress, DWORD edx); -BYTE* mov_esi_xx(BYTE* lpCurAddress, DWORD esi); -BYTE* mov_edi_xx(BYTE* lpCurAddress, DWORD edi); -BYTE* mov_ebp_xx(BYTE* lpCurAddress, DWORD ebp); -BYTE* mov_esp_xx(BYTE* lpCurAddress, DWORD esp); -BYTE* push_xx(BYTE* lpCurAddress, DWORD dwAddress); -BYTE* mov_eip_xx(BYTE* lpCurAddress, DWORD eip, DWORD newEip); -BYTE* Call_xx(BYTE* lpCurAddress, DWORD eip, DWORD newEip); - - ///////////////////////////////////////////////////////////////////////////// PROCESS_INFORMATION ProcessInformation; @@ -67,7 +30,7 @@ void LaunchMod(LPCSTR lpPath, LPSTR lpParams) StartupInfo.cb = sizeof(StartupInfo); ZeroMemory(&ProcessInformation, sizeof(ProcessInformation)); - if (!CreateProcessWithDllA(szGtaExe, + if (!DetourCreateProcessWithDll(szGtaExe, lpParams, NULL, NULL, @@ -207,205 +170,3 @@ void CLaunch3Dlg::OnButton1() { LaunchMod(GetAppPath(), "-c -h 127.0.0.1 -p 7777 -n Player"); } - -DWORD GetFuncAddress() -{ - return (DWORD)GetProcAddress(GetModuleHandleA("Kernel32"), "LoadLibraryA"); -} - -BOOL WINAPI CreateProcessWithDllA(LPCSTR lpApplicationName, - LPSTR lpCommandLine, - LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, - BOOL bInheritHandles, - DWORD dwCreationFlags, - LPVOID lpEnvironment, - LPCSTR lpCurrentDirectory, - LPSTARTUPINFOA lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation, - LPSTR lpDllFullPath, - Proc_CreateProcessA FuncAddress) -{ - BOOL bResult = FALSE; - size_t uCodeSize; - DWORD dwCreaFlags = dwCreationFlags; - PROCESS_INFORMATION pi; - - if (FuncAddress == NULL) - { - FuncAddress = CreateProcessA; - } - - dwCreaFlags = dwCreationFlags | CREATE_SUSPENDED; - - if (FuncAddress(lpApplicationName, - lpCommandLine, - lpProcessAttributes, - lpThreadAttributes, - bInheritHandles, - dwCreaFlags, - lpEnvironment, - lpCurrentDirectory, - lpStartupInfo, - &pi)) - { - if (lpDllFullPath) - uCodeSize = strlen(lpDllFullPath) + 1; - else - uCodeSize = 0; - - DWORD dwLoadDllProc = GetFuncAddress(); - - if (SuspendTidAndInjectCode(pi.hProcess, pi.hThread, dwLoadDllProc, (BYTE*)lpDllFullPath, uCodeSize)) - { - if (lpProcessInformation) - memcpy(lpProcessInformation, &pi, sizeof(PROCESS_INFORMATION)); - - if (!(dwCreationFlags & CREATE_SUSPENDED)) - ResumeThread(pi.hThread); - - bResult = TRUE; - } - } - - return bResult; -} - -BOOL SuspendTidAndInjectCode(HANDLE hProcess, HANDLE hThread, DWORD dwFuncAddress, const BYTE * lpShellCode, size_t uCodeSize) -{ - BYTE ShellCodeBuf[0x480]; - CONTEXT Context; - DWORD flOldProtect = 0; - SIZE_T NumberOfBytesWritten = 0; - LPBYTE lpCurESPAddress; - LPBYTE lpCurBufAddress; - BOOL bResult = FALSE; - - SuspendThread(hThread); - - memset(&Context,0,sizeof(Context)); - Context.ContextFlags = CONTEXT_FULL; - - if (GetThreadContext(hThread, &Context)) - { - lpCurESPAddress = (LPBYTE)((Context.Esp - 0x480) & 0xFFFFFFE0); - - lpCurBufAddress = &ShellCodeBuf[0]; - - if (lpShellCode) - { - memcpy(ShellCodeBuf + 128, lpShellCode, uCodeSize); - lpCurBufAddress = push_xx(lpCurBufAddress, (DWORD)(lpCurESPAddress + 128)); - lpCurBufAddress = Call_xx(lpCurBufAddress, dwFuncAddress, (DWORD)lpCurESPAddress + (DWORD)lpCurBufAddress - (DWORD)&ShellCodeBuf); - } - - lpCurBufAddress = mov_eax_xx(lpCurBufAddress, Context.Eax); - lpCurBufAddress = mov_ebx_xx(lpCurBufAddress, Context.Ebx); - lpCurBufAddress = mov_ecx_xx(lpCurBufAddress, Context.Ecx); - lpCurBufAddress = mov_edx_xx(lpCurBufAddress, Context.Edx); - lpCurBufAddress = mov_esi_xx(lpCurBufAddress, Context.Esi); - lpCurBufAddress = mov_edi_xx(lpCurBufAddress, Context.Edi); - lpCurBufAddress = mov_ebp_xx(lpCurBufAddress, Context.Ebp); - lpCurBufAddress = mov_esp_xx(lpCurBufAddress, Context.Esp); - lpCurBufAddress = mov_eip_xx(lpCurBufAddress, Context.Eip, (DWORD)lpCurESPAddress + (DWORD)lpCurBufAddress - (DWORD)&ShellCodeBuf); - Context.Esp = (DWORD)(lpCurESPAddress - 4); - Context.Eip = (DWORD)lpCurESPAddress; - - if (VirtualProtectEx(hProcess, lpCurESPAddress, 0x480, PAGE_EXECUTE_READWRITE, &flOldProtect) - && WriteProcessMemory(hProcess, lpCurESPAddress, &ShellCodeBuf, 0x480, &NumberOfBytesWritten) - && FlushInstructionCache(hProcess, lpCurESPAddress, 0x480) - && SetThreadContext(hThread, &Context) ) - { - bResult = TRUE; - } - } - - ResumeThread(hThread); - - return bResult; -} - -BYTE* mov_eax_xx(BYTE* lpCurAddress, DWORD eax) -{ - *lpCurAddress = 0xB8; - *(DWORD*)(lpCurAddress + 1) = eax; - return lpCurAddress + 5; -} - -BYTE* mov_ebx_xx(BYTE* lpCurAddress, DWORD ebx) -{ - *lpCurAddress = 0xBB; - *(DWORD*)(lpCurAddress + 1) = ebx; - return lpCurAddress + 5; -} - -BYTE* mov_ecx_xx(BYTE* lpCurAddress, DWORD ecx) -{ - *lpCurAddress = 0xB9; - *(DWORD*)(lpCurAddress + 1) = ecx; - return lpCurAddress + 5; -} - -BYTE* mov_edx_xx(BYTE* lpCurAddress, DWORD edx) -{ - *lpCurAddress = 0xBA; - *(DWORD*)(lpCurAddress + 1) = edx; - return lpCurAddress + 5; -} - -BYTE* mov_esi_xx(BYTE* lpCurAddress, DWORD esi) -{ - *lpCurAddress = 0xBE; - *(DWORD*)(lpCurAddress + 1) = esi; - return lpCurAddress + 5; -} - -BYTE* mov_edi_xx(BYTE* lpCurAddress, DWORD edi) -{ - *lpCurAddress = 0xBF; - *(DWORD*)(lpCurAddress + 1) = edi; - return lpCurAddress + 5; -} - -BYTE* mov_ebp_xx(BYTE* lpCurAddress, DWORD ebp) -{ - *lpCurAddress = 0xBD; - *(DWORD*)(lpCurAddress + 1) = ebp; - return lpCurAddress + 5; -} - -BYTE* mov_esp_xx(BYTE* lpCurAddress, DWORD esp) -{ - *lpCurAddress = 0xBC; - *(DWORD*)(lpCurAddress + 1) = esp; - return lpCurAddress + 5; -} - -BYTE* push_xx(BYTE* lpCurAddress, DWORD dwAddress) -{ - *lpCurAddress = 0x68; - *(DWORD*)(lpCurAddress + 1) = dwAddress; - return lpCurAddress + 5; -} - -BYTE* mov_eip_xx(BYTE* lpCurAddress, DWORD eip, DWORD newEip) -{ - if (!newEip) - { - newEip = (DWORD)lpCurAddress; - } - *lpCurAddress = 0xE9; - *(DWORD*)(lpCurAddress + 1) = eip - (newEip + 5); - return lpCurAddress + 5; -} - -BYTE* Call_xx(BYTE* lpCurAddress, DWORD eip, DWORD newEip) -{ - if (!newEip) - { - newEip = (DWORD)lpCurAddress; - } - *lpCurAddress = 0xE8; - *(DWORD*)(lpCurAddress + 1) = eip - (newEip + 5); - return lpCurAddress + 5; -}