WeChatFerry/sdk/injector.cpp

91 lines
2.8 KiB
C++
Raw Normal View History

2022-08-14 07:15:05 +08:00
#include "injector.h"
2021-02-12 23:21:57 +08:00
2022-10-15 20:25:42 +08:00
HANDLE InjectDll(DWORD pid, LPCWSTR dllPath, HMODULE *injectedBase)
2021-02-12 23:21:57 +08:00
{
HANDLE hThread;
2022-10-15 20:25:42 +08:00
SIZE_T cszDLL = (wcslen(dllPath) + 1) * sizeof(WCHAR);
// 1. 打开目标进程
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (hProcess == NULL) {
MessageBox(NULL, L"打开进程失败", L"InjectDll", 0);
return NULL;
}
// 2. 在目标进程的内存里开辟空间
LPVOID pRemoteAddress = VirtualAllocEx(hProcess, NULL, cszDLL, MEM_COMMIT, PAGE_READWRITE);
if (pRemoteAddress == NULL) {
2022-08-14 07:15:05 +08:00
MessageBox(NULL, L"DLL 路径写入失败", L"InjectDll", 0);
2022-10-15 20:25:42 +08:00
return NULL;
2021-02-12 23:21:57 +08:00
}
2022-10-15 20:25:42 +08:00
// 3. 把 dll 的路径写入到目标进程的内存空间中
WriteProcessMemory(hProcess, pRemoteAddress, dllPath, cszDLL, NULL);
2022-08-14 07:15:05 +08:00
// 3. 创建一个远程线程,让目标进程调用 LoadLibrary
2022-10-15 20:25:42 +08:00
hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibrary, pRemoteAddress, 0, NULL);
if (hThread == NULL) {
2022-08-14 07:15:05 +08:00
MessageBox(NULL, L"LoadLibrary 调用失败", L"InjectDll", 0);
2022-10-15 20:25:42 +08:00
return NULL;
2021-02-12 23:21:57 +08:00
}
2022-10-15 20:25:42 +08:00
WaitForSingleObject(hThread, -1);
GetExitCodeThread(hThread, (LPDWORD)injectedBase);
2021-02-12 23:21:57 +08:00
CloseHandle(hThread);
2022-08-14 07:15:05 +08:00
VirtualFreeEx(hProcess, pRemoteAddress, 0, MEM_RELEASE);
2022-10-15 20:25:42 +08:00
// CloseHandle(hProcess); // Close when exit
return hProcess;
2021-02-12 23:21:57 +08:00
}
2022-10-15 20:25:42 +08:00
bool EjectDll(HANDLE process, HMODULE dllBase)
2021-02-12 23:21:57 +08:00
{
2022-10-15 20:25:42 +08:00
HANDLE hThread = NULL;
2021-02-12 23:21:57 +08:00
2022-08-14 07:15:05 +08:00
// 使目标进程调用 FreeLibrary卸载 DLL
2022-10-15 20:25:42 +08:00
hThread = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)FreeLibrary, (LPVOID)dllBase, 0, NULL);
if (hThread == NULL) {
2022-08-14 07:15:05 +08:00
MessageBox(NULL, L"FreeLibrary 调用失败!", L"EjectDll", 0);
2022-10-15 20:25:42 +08:00
return false;
2021-02-12 23:21:57 +08:00
}
2022-10-15 20:25:42 +08:00
WaitForSingleObject(hThread, INFINITE);
2022-08-14 07:15:05 +08:00
CloseHandle(hThread);
2022-10-15 20:25:42 +08:00
CloseHandle(process);
return true;
}
static void *GetFuncAddr(LPCWSTR dllPath, HMODULE dllBase, LPCSTR funcName)
{
HMODULE hLoaded = LoadLibrary(dllPath);
if (hLoaded == NULL) {
return NULL;
}
void *absAddr = GetProcAddress(hLoaded, funcName);
2022-10-16 22:14:06 +08:00
DWORD offset = (DWORD)absAddr - (DWORD)hLoaded;
2022-10-15 20:25:42 +08:00
FreeLibrary(hLoaded);
return (void *)((DWORD)dllBase + offset);
}
bool CallDllFunc(HANDLE process, LPCWSTR dllPath, HMODULE dllBase, LPCSTR funcName, DWORD *ret)
{
void *pFunc = GetFuncAddr(dllPath, dllBase, funcName);
if (pFunc == NULL) {
return false;
}
HANDLE hThread = CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, NULL, 0, NULL);
if (hThread == NULL) {
return false;
}
WaitForSingleObject(hThread, INFINITE);
if (ret != NULL) {
GetExitCodeThread(hThread, ret);
}
CloseHandle(hThread);
return true;
2021-02-12 23:21:57 +08:00
}