typedef
void
* (__fastcall *LPFN_KernelBaseGetGlobalData)(
void
);
BOOL
WINAPI InjectDllExW(
DWORD
dwPID,
PCWSTR
pwszProxyFile)
{
BOOL
ret = FALSE;
HANDLE
hToken = NULL;
HANDLE
hProcess = NULL;
HANDLE
hThread = NULL;
FARPROC pfnThreadRtn = NULL;
PWSTR
pwszPara = NULL;
PVOID
pRemoteShellcode = NULL;
CLIENT_ID Cid={0};
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwPID);
if
(!hProcess)
return
FALSE;
pfnThreadRtn = GetProcAddress(GetModuleHandle(TEXT(
"Kernel32.dll"
)),
"LoadLibraryW"
);
size_t
iProxyFileLen = wcslen(pwszProxyFile)*
sizeof
(
WCHAR
);
pwszPara = (
PWSTR
)VirtualAllocEx(hProcess, NULL, iProxyFileLen, MEM_COMMIT, PAGE_READWRITE);
if
(!pwszPara)
return
FALSE;
WriteProcessMemory(hProcess, pwszPara, (
PVOID
)pwszProxyFile, iProxyFileLen, NULL);
LPFN_KernelBaseGetGlobalData pKernelBaseGetGlobalData=NULL;
UCHAR
* pGlobalData=NULL;
UCHAR
* pMisc=NULL;
ULONG
PatchOffset=0;
pKernelBaseGetGlobalData = (LPFN_KernelBaseGetGlobalData)GetProcAddress(LoadLibraryW(L
"KernelBase.dll"
),
"KernelBaseGetGlobalData"
);
pGlobalData = (
UCHAR
*)pKernelBaseGetGlobalData();
OSVERSIONINFOA osi={0};
osi.dwOSVersionInfoSize =
sizeof
(OSVERSIONINFOA);
GetVersionEx(&osi);
switch
(osi.dwBuildNumber)
{
case
7600:
case
7601:
{
PatchOffset=0x5C;
break
;
}
case
9200:
{
PatchOffset=0x4;
break
;
}
default
:
break
;
}
printf
(
"PatchOffset: %x\n"
,PatchOffset);
pMisc = pGlobalData + PatchOffset;
*pMisc = 1;
hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pfnThreadRtn, pwszPara, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
VirtualFreeEx(hProcess, pwszPara, 0, MEM_RELEASE);
CloseHandle(hProcess);
return
TRUE;
}