#include <Windows.h> #include <tchar.h> #include <iostream>
using std::cin; using std::cout; using std::endl;
using f_LoadLibrary = unsigned long long(WINAPI*)(wchar_t* dllName); using f_GetProcAddress = FARPROC(WINAPI*)(unsigned long long hModule, char* lpProcName);
struct RemoteCall { wchar_t dllName[0x100] = {}; char funcName[0x20] = { "main_loop_window" }; wchar_t kernelName[0x10] = { _T("kernel32.dll") }; f_LoadLibrary pLoadLiarbry; f_GetProcAddress pGetProcAddress; };
void Inject() { unsigned long long address = 0xCCCCCCCCCCCCCCCC; RemoteCall* p = (RemoteCall*)address; auto libAddr = p->pLoadLiarbry(p->dllName); auto myfunc = p->pGetProcAddress(libAddr, p->funcName); myfunc(); }
RemoteCall* WriteData(HANDLE &hProcess) { RemoteCall data; auto loadLibraryAddr = GetProcAddress(LoadLibraryW(_T("kernel32.dll")), "LoadLibraryW"); if (!loadLibraryAddr) { cout << "get loadLibrary failed!"; exit(-1); } data.pLoadLiarbry = (f_LoadLibrary)loadLibraryAddr; auto getProcAddressAddr = GetProcAddress(LoadLibraryW(_T("kernel32.dll")), "GetProcAddress"); if (!getProcAddressAddr) { cout << "get getProcAddress failed!"; exit(-1); } data.pGetProcAddress = (f_GetProcAddress)getProcAddressAddr;
size_t lenth{}; const wchar_t* dllName = L"D:/codeSpace/IDE-Project/vs2022/inject-window-dll/x64/Release/inject-window-dll.dll"; for (lenth = 0; dllName[lenth++];); memcpy(data.dllName, dllName, (lenth + 1) * 2);
auto data_address = VirtualAllocEx(hProcess, 0, sizeof(data), MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (!data_address) { cout << "remote data inject failed!"; exit(-1); } WriteProcessMemory(hProcess, data_address, (LPCVOID)&data, sizeof(data), NULL); return (RemoteCall*)data_address; }
void* WriteCode(HANDLE &hProcess, RemoteCall* data_address) { char _code[0x200] = {}; memcpy(_code, Inject, sizeof(_code)); for (size_t i = 0; i < 0x200; i++) { unsigned long long * p = (unsigned long long*)&_code[i]; if (*p == 0xCCCCCCCCCCCCCCCC) { *p = (unsigned long long)data_address; break; } } auto remote_code_address = VirtualAllocEx(hProcess, 0, sizeof(_code), MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (!remote_code_address) { cout << "remote code inject failed!"; exit(-1); } WriteProcessMemory(hProcess, remote_code_address, (LPCVOID)_code, sizeof(_code), NULL); return remote_code_address; }
int main() { DWORD pid{}; cout << "请输入Pid:"; cin >> pid; auto hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); if (!hProcess) { cout << "OpenProcess failed!" << endl; return -1; } auto data_address = WriteData(hProcess); auto call_address = WriteCode(hProcess, data_address);
auto hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)call_address, NULL, 0, NULL); if (!hThread) { cout << "Create Remote Thread Failed!" << endl; return -1; }
MessageBox(NULL, L"注入成功", L"注入提示", MB_OK); return 0; }
|