#include<Windows.h>
#include<stdio.h>
void UnInjectDLL(int PID) {
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
//使用CE找到的想要卸载的DLL的地址
LPVOID pRetAddress = (LPVOID)0x544B0000;
//HMODULE hModule = LoadLibrary("KERNEL32.DLL");// 使用CE查到的KERNEL32的地址 0x76850000;
//使用CE找到的FreeLibrary的地址是 0x76869040
//LPTHREAD_START_ROUTINE lp_start_address = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule, "FreeLibrary");
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,(LPTHREAD_START_ROUTINE)0x76869040, pRetAddress, 0, NULL);
WaitForSingleObject(hThread, 2000);
CloseHandle(hThread);
CloseHandle(hProcess);
}
void inject1(int PID,const char* Path) {
//参数:要注入进程的PID,要注入的DLL的路径参数指针
//获取进程句柄,打开进程
//参数PROCESS_ALL_ACCESS 获取进程所有的访问权限
//参数二一般为false
//参数三位进程pid
//返回值:进程句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
//在虚拟地址空间分配一块内存
//VirtualAllocEx(进程句柄,指针 指定要分配的页面区域的所需起始地址,
//要分配的内存区域的大小,内存分配类型,要分配内存区域的内存保护 一个内存保护常量)
//返回值,要分配页面的基址
//说白了就是申请一块内存给DLL路径
LPVOID pRetAddress = VirtualAllocEx(hProcess, NULL, strlen(Path) + 1, MEM_COMMIT,PAGE_READWRITE);
//WriteProcessMemory(要修改的进程内存的句柄,指向写入数据的指定进程中的基址的指针,
//在指定进程的地址空间中写入的数据(一个指向缓存区的指针),要写入指定进程的字节数,可忽略参数NULL)
//写入路径到上一行代码申请的内存中
WriteProcessMemory(hProcess,pRetAddress,Path,strlen(Path) + 1,NULL);
HMODULE hModule = LoadLibrary("KERNEL32.DLL");
//获取loadlibrary的地址
LPTHREAD_START_ROUTINE lp_start_address =(LPTHREAD_START_ROUTINE) GetProcAddress(hModule,"LoadLibraryA");
//CreateRemoteThread()创建在另一个进程的虚拟地址空间中运行的线程
//参数:CreateRemoteThread(进程句柄,NULL,堆栈的初始大小填0默认,loadlibrary的地址,
//指向要传递给线程要执行的函数的变量(参数->DLL所在的路径)的指针,控制线程创建的标志 0为立即执行)
//创建远程线程 - 并获取线程句柄
HANDLE hThread = CreateRemoteThread(hProcess , NULL, 0, lp_start_address, pRetAddress,0,NULL);
//等待线程事件,第二个参数为等待超时时间 这样可以防止线程阻塞
WaitForSingleObject(hThread, 2000);
//将线程和进程关掉
CloseHandle(hThread);
CloseHandle(hProcess);
}
int main() {
const char* a = "G:\\C++ Study Project\\DllConnect\\Debug\\DLLStudy.dll";
inject(2052,a);
return 0;
}
03-21