Skip to content

Commit 70e5774

Browse files
committed
fixed wrong memmove definition, enabled compiler optimizations, shell functions are now in own section (no more size guessing), removed obsolete stuff, updated shellcodes
1 parent 06be54d commit 70e5774

14 files changed

+188
-60
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#include "pch.h"
2+
3+
#include "Download Manager.h"
4+
5+
HANDLE DownloadManager::hInterrupEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);
6+
7+
HRESULT __stdcall DownloadManager::QueryInterface(const IID & riid, void ** ppvObject)
8+
{
9+
UNREFERENCED_PARAMETER(riid);
10+
UNREFERENCED_PARAMETER(ppvObject);
11+
12+
return E_NOINTERFACE;
13+
}
14+
15+
ULONG __stdcall DownloadManager::AddRef(void)
16+
{
17+
return 1;
18+
}
19+
20+
ULONG __stdcall DownloadManager::Release(void)
21+
{
22+
return 1;
23+
}
24+
25+
HRESULT __stdcall DownloadManager::OnStartBinding(DWORD dwReserved, IBinding * pib)
26+
{
27+
UNREFERENCED_PARAMETER(dwReserved);
28+
UNREFERENCED_PARAMETER(pib);
29+
30+
return S_OK;
31+
}
32+
33+
HRESULT __stdcall DownloadManager::GetPriority(LONG * pnPriority)
34+
{
35+
UNREFERENCED_PARAMETER(pnPriority);
36+
37+
return S_OK;
38+
}
39+
40+
HRESULT __stdcall DownloadManager::OnLowResource(DWORD reserved)
41+
{
42+
UNREFERENCED_PARAMETER(reserved);
43+
44+
return S_OK;
45+
}
46+
47+
HRESULT __stdcall DownloadManager::OnStopBinding(HRESULT hresult, LPCWSTR szError)
48+
{
49+
UNREFERENCED_PARAMETER(hresult);
50+
UNREFERENCED_PARAMETER(szError);
51+
52+
return S_OK;
53+
}
54+
55+
HRESULT __stdcall DownloadManager::GetBindInfo(DWORD * grfBINDF, BINDINFO *pbindinfo)
56+
{
57+
UNREFERENCED_PARAMETER(grfBINDF);
58+
UNREFERENCED_PARAMETER(pbindinfo);
59+
60+
return S_OK;
61+
}
62+
63+
HRESULT __stdcall DownloadManager::OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC * pformatetc, STGMEDIUM * pstgmed)
64+
{
65+
UNREFERENCED_PARAMETER(grfBSCF);
66+
UNREFERENCED_PARAMETER(dwSize);
67+
UNREFERENCED_PARAMETER(pformatetc);
68+
UNREFERENCED_PARAMETER(pstgmed);
69+
70+
return S_OK;
71+
}
72+
73+
HRESULT __stdcall DownloadManager::OnObjectAvailable(const IID & riid, IUnknown * punk)
74+
{
75+
UNREFERENCED_PARAMETER(riid);
76+
UNREFERENCED_PARAMETER(punk);
77+
78+
return S_OK;
79+
}
80+
81+
HRESULT __stdcall DownloadManager::OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
82+
{
83+
UNREFERENCED_PARAMETER(ulProgress);
84+
UNREFERENCED_PARAMETER(ulProgressMax);
85+
UNREFERENCED_PARAMETER(ulStatusCode);
86+
UNREFERENCED_PARAMETER(szStatusText);
87+
88+
if (WaitForSingleObject(hInterrupEvent, 0) == WAIT_OBJECT_0)
89+
{
90+
return E_ABORT;
91+
}
92+
93+
return S_OK;
94+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//Stolen from here:
2+
//https://stackoverflow.com/a/5292277
3+
//by User Hans Passant
4+
5+
#pragma once
6+
7+
#include <windows.h>
8+
9+
class DownloadManager : public IBindStatusCallback
10+
{
11+
12+
public:
13+
14+
HRESULT __stdcall QueryInterface(const IID & riid, void ** ppvObject);
15+
16+
ULONG STDMETHODCALLTYPE AddRef(void);
17+
18+
ULONG STDMETHODCALLTYPE Release(void);
19+
20+
virtual HRESULT STDMETHODCALLTYPE OnStartBinding(DWORD dwReserved, IBinding *pib);
21+
22+
virtual HRESULT STDMETHODCALLTYPE GetPriority(LONG * pnPriority);
23+
24+
virtual HRESULT STDMETHODCALLTYPE OnLowResource(DWORD reserved);
25+
26+
virtual HRESULT STDMETHODCALLTYPE OnStopBinding(HRESULT hresult, LPCWSTR szError);
27+
28+
virtual HRESULT STDMETHODCALLTYPE GetBindInfo(DWORD * grfBINDF, BINDINFO *pbindinfo);
29+
30+
virtual HRESULT STDMETHODCALLTYPE OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC * pformatetc, STGMEDIUM *pstgmed);
31+
32+
virtual HRESULT STDMETHODCALLTYPE OnObjectAvailable(const IID & riid, IUnknown * punk);
33+
34+
HRESULT __stdcall OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText);
35+
36+
static HANDLE hInterrupEvent;
37+
};

GH Injector Library/GH Injector Library.vcxproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,10 @@
136136
<TreatWarningAsError>true</TreatWarningAsError>
137137
<PrecompiledHeader>Use</PrecompiledHeader>
138138
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
139-
<CallingConvention>StdCall</CallingConvention>
140139
<LanguageStandard>stdcpp17</LanguageStandard>
141140
<BufferSecurityCheck>false</BufferSecurityCheck>
142141
<ControlFlowGuard>false</ControlFlowGuard>
142+
<Optimization>MaxSpeed</Optimization>
143143
</ClCompile>
144144
<Link>
145145
<GenerateDebugInformation>false</GenerateDebugInformation>
@@ -157,12 +157,14 @@
157157
<LanguageStandard>stdcpp17</LanguageStandard>
158158
<BufferSecurityCheck>false</BufferSecurityCheck>
159159
<ControlFlowGuard>false</ControlFlowGuard>
160+
<Optimization>MaxSpeed</Optimization>
160161
</ClCompile>
161162
<Link>
162163
<GenerateDebugInformation>false</GenerateDebugInformation>
163164
</Link>
164165
</ItemDefinitionGroup>
165166
<ItemGroup>
167+
<ClInclude Include="Download Manager.h" />
166168
<ClInclude Include="Eject.h" />
167169
<ClInclude Include="Error.h" />
168170
<ClInclude Include="Handle Hijacking.h" />
@@ -180,6 +182,7 @@
180182
<ClInclude Include="WOW64 Shells.h" />
181183
</ItemGroup>
182184
<ItemGroup>
185+
<ClCompile Include="Download Manager.cpp" />
183186
<ClCompile Include="Eject.cpp" />
184187
<ClCompile Include="Handle Hijacking.cpp" />
185188
<ClCompile Include="Hook Scanner WOW64.cpp" />

GH Injector Library/GH Injector Library.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@
8181
<ClInclude Include="WOW64 Shells.h">
8282
<Filter>Quelldateien\wow64\Injection Methods</Filter>
8383
</ClInclude>
84+
<ClInclude Include="Download Manager.h">
85+
<Filter>Headerdateien</Filter>
86+
</ClInclude>
8487
</ItemGroup>
8588
<ItemGroup>
8689
<ClCompile Include="Handle Hijacking.cpp">
@@ -161,5 +164,8 @@
161164
<ClCompile Include="Injection Generic WOW64.cpp">
162165
<Filter>Quelldateien\wow64\Injection Methods</Filter>
163166
</ClCompile>
167+
<ClCompile Include="Download Manager.cpp">
168+
<Filter>Quelldateien</Filter>
169+
</ClCompile>
164170
</ItemGroup>
165171
</Project>

GH Injector Library/Injection Generic WOW64.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,6 @@ DWORD InjectDLL_WOW64(const wchar_t * szDllFile, HANDLE hTargetProc, INJECTION_M
9393
return INJ_ERR_WPM_FAIL;
9494
}
9595

96-
printf("LoadLibraryExW: %08X\n", data.f.LoadLibraryExW);
97-
printf("LdrLoadDll : %08X\n", data.f.LdrLoadDll);
98-
printf("LdrpLoadDll : %08X\n", data.f.LdrpLoadDll);
99-
10096
LOG("Data written\n");
10197

10298
DWORD remote_ret = 0;

GH Injector Library/Injection Generic.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@
33
#include "Injection Internal.h"
44
#include "Manual Mapping.h"
55

6-
#pragma optimize("", off)
7-
86
using namespace NATIVE;
97

10-
DWORD InjectionShell(INJECTION_DATA_INTERNAL * pData);
11-
DWORD InjectionShell_End();
8+
DWORD __declspec(code_seg(".inj_sec$1")) __stdcall InjectionShell(INJECTION_DATA_INTERNAL * pData);
9+
DWORD __declspec(code_seg(".inj_sec$2")) InjectionShell_End();
1210

1311
DWORD InjectDLL(const wchar_t * szDllFile, HANDLE hTargetProc, INJECTION_MODE Mode, LAUNCH_METHOD Method, DWORD Flags, HINSTANCE & hOut, DWORD Timeout, ERROR_DATA & error_data)
1412
{
@@ -140,7 +138,7 @@ DWORD InjectDLL(const wchar_t * szDllFile, HANDLE hTargetProc, INJECTION_MODE Mo
140138
return INJ_ERR_SUCCESS;
141139
}
142140

143-
DWORD InjectionShell(INJECTION_DATA_INTERNAL * pData)
141+
DWORD __declspec(code_seg(".inj_sec$1")) __stdcall InjectionShell(INJECTION_DATA_INTERNAL * pData)
144142
{
145143
if (!pData)
146144
{
@@ -318,7 +316,7 @@ DWORD InjectionShell(INJECTION_DATA_INTERNAL * pData)
318316
return INJ_ERR_SUCCESS;
319317
}
320318

321-
DWORD InjectionShell_End()
319+
DWORD __declspec(code_seg(".inj_sec$2")) InjectionShell_End()
322320
{
323321
return 0;
324322
}
@@ -342,6 +340,4 @@ INJECTION_FUNCTION_TABLE::INJECTION_FUNCTION_TABLE()
342340
NT_FUNC_CONSTRUCTOR_INIT(LdrpModuleBaseAddressIndex);
343341
NT_FUNC_CONSTRUCTOR_INIT(LdrpMappingInfoIndex);
344342
NT_FUNC_CONSTRUCTOR_INIT(LdrpHeap);
345-
}
346-
347-
#pragma optimize("", on)
343+
}

GH Injector Library/Manual Mapping WOW64.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
#include "Manual Mapping.h"
66
#include "WOW64 Shells.h"
77

8-
#pragma optimize("", off)
9-
108
using namespace WOW64;
119
using namespace MMAP_WOW64;
1210

@@ -180,6 +178,4 @@ MANUAL_MAPPING_FUNCTION_TABLE_WOW64::MANUAL_MAPPING_FUNCTION_TABLE_WOW64()
180178
WOW64_FUNC_CONSTRUCTOR_INIT(LdrpHeap);
181179
}
182180

183-
#pragma optimize("", on)
184-
185181
#endif

GH Injector Library/Manual Mapping.cpp

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
#include "pch.h"
22

33
#include "Manual Mapping.h"
4-
5-
#pragma optimize("", off)
6-
74
using namespace NATIVE;
85
using namespace MMAP_NATIVE;
96

10-
DWORD ManualMapping_Shell(MANUAL_MAPPING_DATA * pData);
11-
DWORD ManualMapping_Shell_End();
7+
DWORD __declspec(code_seg(".mmap_sec$1")) __stdcall ManualMapping_Shell(MANUAL_MAPPING_DATA * pData);
8+
DWORD __declspec(code_seg(".mmap_sec$2")) ManualMapping_Shell_End();
129

1310
DWORD MMAP_NATIVE::ManualMap(const wchar_t * szDllFile, HANDLE hTargetProc, LAUNCH_METHOD Method, DWORD Flags, HINSTANCE & hOut, DWORD Timeout, ERROR_DATA & error_data)
1411
{
@@ -209,7 +206,7 @@ __forceinline bool InitAnsiString(MANUAL_MAPPING_FUNCTION_TABLE * f, ANSI_STRING
209206
return true;
210207
}
211208

212-
DWORD ManualMapping_Shell(MANUAL_MAPPING_DATA * pData)
209+
DWORD __declspec(code_seg(".mmap_sec$1")) __stdcall ManualMapping_Shell(MANUAL_MAPPING_DATA * pData)
213210
{
214211
if (!pData)
215212
{
@@ -263,7 +260,7 @@ DWORD ManualMapping_Shell(MANUAL_MAPPING_DATA * pData)
263260

264261
HANDLE hDllFile = nullptr;
265262

266-
ntRet = f->NtOpenFile(&hDllFile, FILE_GENERIC_READ, oa, &io_status, FILE_SHARE_READ, 0x20);
263+
ntRet = f->NtOpenFile(&hDllFile, FILE_GENERIC_READ, oa, &io_status, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT);
267264

268265
DeleteObject(f, oa);
269266
DeleteObject(f, DllNtPath.szBuffer);
@@ -802,7 +799,6 @@ DWORD ManualMapping_Shell(MANUAL_MAPPING_DATA * pData)
802799
if ((Flags & INJ_MM_EXECUTE_TLS) && pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].Size)
803800
{
804801
auto * pTLS = ReCa<IMAGE_TLS_DIRECTORY*>(pBase + pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].VirtualAddress);
805-
806802
//LdrpHandleTlsData either crashes or returns STATUS_SUCCESS -> no point in error checking
807803
//It also only accesses the DllBase member of the ldr entry thus a dummy entry is sufficient
808804

@@ -1041,7 +1037,7 @@ DWORD ManualMapping_Shell(MANUAL_MAPPING_DATA * pData)
10411037
return INJ_ERR_SUCCESS;
10421038
}
10431039

1044-
DWORD ManualMapping_Shell_End()
1040+
DWORD __declspec(code_seg(".mmap_sec$2")) ManualMapping_Shell_End()
10451041
{
10461042
return 1;
10471043
}
@@ -1079,6 +1075,4 @@ MANUAL_MAPPING_FUNCTION_TABLE::MANUAL_MAPPING_FUNCTION_TABLE()
10791075
NT_FUNC_CONSTRUCTOR_INIT(LdrpHeap);
10801076

10811077
pLdrpHeap = nullptr;
1082-
}
1083-
1084-
#pragma optimize("", on)
1078+
}

GH Injector Library/NT Stuff.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,14 @@
2525
#endif
2626

2727
#define THREAD_CREATE_FLAGS_CREATE_SUSPENDED 0x00000001
28-
#define THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH 0x00000002
2928
#define THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER 0x00000004
3029

3130
#define OBJ_CASE_INSENSITIVE 0x00000040
3231

3332
#define STATUS_SUCCESS 0x00000000
34-
#define STATUS_UNSUCCESSFUL 0xC0000001
3533
#define STATUS_INFO_LENGTH_MISMATCH 0xC0000004
3634

37-
#define LDR_GET_DLL_HANDLE_EX_UNCHANGED_REFCOUNT 0x00000001
35+
#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
3836

3937
typedef LONG KPRIORITY;
4038

@@ -617,7 +615,7 @@ using f_LdrpHandleTlsData = NTSTATUS (__fastcall*)
617615
LDR_DATA_TABLE_ENTRY * pEntry
618616
);
619617

620-
using f_memmove = VOID (__stdcall*)
618+
using f_memmove = VOID (__cdecl*)
621619
(
622620
PVOID UNALIGNED Destination,
623621
LPCVOID UNALIGNED Source,

GH Injector Library/NtCreateThreadEx WOW64.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ DWORD SR_NtCreateThreadEx_WOW64(HANDLE hTargetProc, f_Routine_WOW64 pRoutine, DW
1919

2020
pEntrypoint = pi.GetEntrypoint();
2121
}
22-
DWORD Flags = THREAD_CREATE_FLAGS_CREATE_SUSPENDED | THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH | THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER;
22+
23+
DWORD Flags = THREAD_CREATE_FLAGS_CREATE_SUSPENDED | THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER;
2324
HANDLE hThread = nullptr;
2425

2526
void * pMem = VirtualAllocEx(hTargetProc, nullptr, 0x200, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

0 commit comments

Comments
 (0)