c++注入dll与卸载dll,
//MyCode.Project.WindowsForm.cpp: 定义应用程序的入口点。 // #include "stdafx.h" #include "MyCode.Project.WindowsForm.h" #include <Windows.h> #include "resource.h" #include <TlHelp32.h>//系统用<> #include <stdio.h> #include <string.h> #include <iostream> #define WECHAT_PROCESS_NAME "WeChat.exe" #define DLL_PATH "E://Git//Debug//MyCode.Project.MyWeChat.dll" using namespace std; INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); VOID InjectDLL(); VOID UninjectDll(); int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { DialogBox(hInstance, MAKEINTRESOURCE(ID_MAIN), NULL, &DialogProc); return 0; } INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { if (uMsg == WM_INITDIALOG) { //MessageBox(NULL, "首次加载", "标题", 0); } if (uMsg == WM_CLOSE) { //MessageBox(NULL, "你点击了关闭", "标题", 0); EndDialog(hwndDlg,0); } //所有界面上按钮事件都是走的这个宏 if (uMsg == WM_COMMAND) { if (wParam == btn_injectdll) { //MessageBox(NULL, "点击了注入按钮", "标题", 0); InjectDLL(); } if (wParam == btn_undll) { UninjectDll(); //MessageBox() } } return FALSE; } //第一步,要拿到微信的进程句柄,有句柄才能操作微信内存 //通过微信的进程名称去找到微信pid,然后通过PID去打开微信进程获取到进程句柄 DWORD ProcessNameFindPID(LPCSTR ProcessName) { //第一步获取到整个进程快照 HANDLE ProcessAll = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);//获取整个进程快照 //第二步在快照中对比ProcessName进程名称 PROCESSENTRY32 processInfo = { 0 }; processInfo.dwSize = sizeof(PROCESSENTRY32); do{ if (strcmp(ProcessName, processInfo.szExeFile) == 0) { return processInfo.th32ProcessID; } } while(Process32Next(ProcessAll,&processInfo)); //第三步用找到的PID打开进程得到句柄 return 0; } //第二步,要再微信内部申请一块内存用来放dll的路径 VOID InjectDLL() { CHAR pathStr[0x100] = { DLL_PATH }; //第一步 我们先获取到微信的句柄 DWORD PID = ProcessNameFindPID(WECHAT_PROCESS_NAME); if (PID == 0) { MessageBox(NULL, "没有找到微信进程或者微信没有启动", "错误", 0); return; } HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); if (hProcess == NULL) { MessageBox(NULL, "进程打开失败,可能权限不足或者关闭了应用", "错误", 0); return; } //第二步申请内存,返回写入的地址 LPVOID dllAdd = VirtualAllocEx(hProcess, NULL,sizeof(pathStr),MEM_COMMIT,PAGE_READWRITE); if (dllAdd == NULL) { MessageBox(NULL, "内存分配失败", "错误", 0); return; } //写入DLL路径到上面地址 if (WriteProcessMemory(hProcess, dllAdd, pathStr, strlen(pathStr), NULL) == 0) { MessageBox(NULL, "路径写入失败", "错误", 0); return; } CHAR test[0x100] = {0}; sprintf_s(test, "写入的地址为:%p", dllAdd); //OutputDebugString(test); HMODULE k32 = GetModuleHandle("Kernel32.dll"); //LoadlibraryW或LoadlibraryA LPVOID loadAdd = GetProcAddress(k32, "LoadLibraryA"); //通过远程线程执行函数,去执行LoadLiabray这个函数来加载我们写入那个路径的DLL HANDLE exec = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)loadAdd, dllAdd, 0, NULL); if (exec == NULL) { MessageBox(NULL, "远程注入失败", "错误", 0); } else { MessageBox(NULL, "远程注入成功", "成功", 0); } } VOID UninjectDll() { CHAR szDllName[0x100] = { DLL_PATH }; DWORD dwPid = ProcessNameFindPID(WECHAT_PROCESS_NAME); if (dwPid == 0) { MessageBox(NULL, "没有找到微信进程或者微信没有启动", "错误", 0); return; } HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPid); MODULEENTRY32 me32; me32.dwSize = sizeof(me32); //查找匹配的进程名称 BOOL bRet = Module32First(hSnap, &me32); BOOL hasFind = false; while (bRet) { string s = me32.szExePath; string::size_type position = s.find("MyCode.Project.MyWeChat"); //找到 if (position != s.npos) { hasFind = true; break; } bRet = Module32Next(hSnap, &me32); } if (!hasFind) { MessageBox(NULL, "找不到注入的DLL,可能没有注入", "错误", 0); return; } CloseHandle(hSnap); char *pFunName = "FreeLibrary"; HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid); if (hProcess == NULL) { return; } FARPROC pFunAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), pFunName); HANDLE exec = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunAddr, me32.hModule, 0, NULL); if (exec == NULL) { MessageBox(NULL, "卸载失败", "错误", 0); } else { MessageBox(NULL, "卸载成功", "成功", 0); } }