您的位置:首页 > 其它

利用远程线程进行DLL的注入

2015-04-02 10:41 274 查看
通过为另一个进程,创建线程,线程在初始化时候会调用线程函数。将线程函数更改为LoadLibrary()就行,但是此处要注意的是,LoadLibrary()的地址需要是在被注入进程的进程地址空间内的地址。而且保存Unicode字符串的地址也是要在被注入进程的地址空间内部的地址。具体的操作可以翻阅Windows核心编程第五版P587。以下是源代码。

注意此处是不需要提升进程权限的。

#include <iostream>

#include <Windows.h>

#include <tchar.h>

using namespace std;

int main(){

cout << "请输入注入的进程ID:";

DWORD dwPID;

cin >> dwPID;

//打开进程句柄,此处先不进行权限提升

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);

if (hProcess == NULL){

cout << "打开进程句柄失败!";

return 0;

}//if

//物理内存分配

HANDLE hMem = VirtualAllocEx(hProcess, NULL, 1024, MEM_COMMIT, PAGE_READWRITE);

SIZE_T size;

//写入内存

//空格符号

if (NULL == WriteProcessMemory(hProcess, hMem, L"D:\\test.dll", _tcslen(L"C:\\test.dll") * 2 + 2, &size)){

cout << "写入内存出错";

return 0;

}//if

cout << "写入字节数: " << size << endl;

TCHAR buf[200];

ReadProcessMemory(hProcess, hMem, buf, 200, &size);

//MessageBox(NULL, buf, L"测试", MB_OK);

wcout << buf << endl;

PTHREAD_START_ROUTINE pfnStart = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(L"kernel32"), "LoadLibraryW");

if (NULL == CreateRemoteThread(hProcess, NULL, 0, pfnStart, hMem, NULL, NULL)){

cout << "创建远程线程失败!";

return 0;

}//if

cout << "创建远程线程注入DLL成功!";

system("pause > 0");

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: