[C++] 纯文本查看 复制代码 #include <Windows.h>
#include <iostream>
BOOL injectDLL(DWORD pid,const char *DLLname) {//BOOL类型的函数 一个是PID 一个是DLL名字
HANDLE Process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);//获取句柄
if (Process==NULL)//判断是否为空
{
std::cout <<"获取进程句柄失败返回值为:"<< GetLastError() << std::endl;////getLastError 这个函数就是获取失败返回的值 看看返回的代码是多少
return FALSE;
}
DWORD changdu = strlen(DLLname) + 1;//计算DLL的长度 ,并且要加上0结尾的长度,就是为了怕内存不够
LPVOID allocex=VirtualAllocEx(Process,NULL,changdu, MEM_COMMIT, PAGE_READWRITE);//在目标进程分配内存
if (allocex==NULL)//判断是否为空
{
std::cout << "分配内存失败返回值为:" << GetLastError() << std::endl;//getLastError 这个函数就是获取失败返回的值 看看代码是多少
CloseHandle(Process);//关闭进程句柄
return FALSE;
}
BOOL WPM =WriteProcessMemory(Process,allocex,DLLname,changdu,NULL);//拷贝DLL路径名到目标进程的内存中
if (!WPM)
{
std::cout << "拷贝DLL到内存失败返回值为:" << GetLastError() << std::endl;//getLastError 这个函数就是获取失败返回的值 看看代码是多少
CloseHandle(Process);//关闭进程句柄
return FALSE;
}
HMODULE hmodule = GetModuleHandle("KERNEL32.dll"); //获取系统DLLKernel32.dll
if (!hmodule)//判断
{
std::cout << "系统DLL获取失败返回值为:" << GetLastError() << std::endl;//getLastError 这个函数就是获取失败返回的值 看看代码是多少
return FALSE;
}
DWORD GPA=(DWORD)GetProcAddress(hmodule, "LoadLibraryA");//获取LoadLibraryA函数地址 在补充一点 LoadLibraryA 是多字节版本 LoadLibraryW是 Unicode版本
if (!GPA)//判断
{
std::cout << "A函数加载失败返回值为:" << GetLastError() << std::endl;//getLastError 这个函数就是获取失败返回的值 看看代码是多少
CloseHandle(Process);//关闭句柄
CloseHandle(hmodule);//关闭DLL
return FALSE;
}
HANDLE CRT=CreateRemoteThread(Process,NULL,0,(LPTHREAD_START_ROUTINE)GPA,allocex,0,NULL);//创建远程线程,加载DLL
if (!CRT)
{
std::cout << "远程线程加载失败返回值为:" << GetLastError() << std::endl;//getLastError 这个函数就是获取失败返回的值 看看代码是多少
CloseHandle(Process);//关闭句柄
CloseHandle(hmodule);//关闭DLL
return FALSE;
}
CloseHandle(Process);//最后在关闭句柄
return true;
};
int main() {
injectDLL(3224,"D:\\C++日常练习代码\\Dll1\\Debug\\Dll1.dll" );//调用这个函数的时候 可能会出现失败 就好比如我注入计算器 他给我返回的是拒绝被访问(错误代码为5),所以说知道这个原理就行了
return 0;
}; |