Dll注入经典方法完整版

简介: Pnig0s1992:算是复习了,最经典的教科书式的Dll注入。总结一下基本的注入过程,分注入和卸载注入Dll:1,OpenProcess获得要注入进程的句柄2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1;3,WriteProcessMemory将Dll的名字写入第二步开辟出的内存中。


Pnig0s1992:算是复习了,最经典的教科书式的Dll注入。

总结一下基本的注入过程,分注入和卸载

注入Dll:

1,OpenProcess获得要注入进程的句柄

2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1;

3,WriteProcessMemory将Dll的名字写入第二步开辟出的内存中。

4,CreateRemoteThread将LoadLibraryA作为线程函数,参数为Dll的名称,创建新线程

5,CloseHandle关闭线程句柄

卸载Dll:

1,CreateRemoteThread将GetModuleHandle注入到远程进程中,参数为被注入的Dll名

2,GetExitCodeThread将线程退出的退出码作为Dll模块的句柄值。

3,CloseHandle关闭线程句柄

3,CreateRemoteThread将FreeLibraryA注入到远程进程中,参数为第二步获得的句柄值。

4,WaitForSingleObject等待对象句柄返回

5,CloseHandle关闭线程及进程句柄。


01.//Code By Pnig0s1992 
02.//Date:2012,3,13 
03.#include <stdio.h> 
04.#include <Windows.h> 
05.#include <TlHelp32.h> 
06. 
07. 
08.DWORD getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID 
09.{ 
10.    DWORD dwRet = 0; 
11.    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
12.    if(hSnapShot == INVALID_HANDLE_VALUE) 
13.    { 
14.        printf("\n获得进程快照失败%d",GetLastError()); 
15.        return dwRet; 
16.    } 
17. 
18.    PROCESSENTRY32 pe32;//声明进程入口对象 
19.    pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小 
20.    Process32First(hSnapShot,&pe32);//遍历进程列表 
21.    do  
22.    { 
23.        if(!lstrcmp(pe32.szExeFile,lpProcessName))//查找指定进程名的PID 
24.        { 
25.            dwRet = pe32.th32ProcessID; 
26.            break; 
27.        } 
28.    } while (Process32Next(hSnapShot,&pe32)); 
29.    CloseHandle(hSnapShot); 
30.    return dwRet;//返回 
31.} 
32. 
33.INT main(INT argc,CHAR * argv[]) 
34.{ 
35.    DWORD dwPid = getProcessHandle((LPCTSTR)argv[1]); 
36.    LPCSTR lpDllName = "EvilDll.dll"; 
37.    HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwPid); 
38.    if(hProcess == NULL) 
39.    { 
40.        printf("\n获取进程句柄错误%d",GetLastError()); 
41.        return -1; 
42.    } 
43.    DWORD dwSize = strlen(lpDllName)+1;  
44.    DWORD dwHasWrite; 
45.    LPVOID lpRemoteBuf = VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT,PAGE_READWRITE); 
46.    if(WriteProcessMemory(hProcess,lpRemoteBuf,lpDllName,dwSize,&dwHasWrite)) 
47.    { 
48.        if(dwHasWrite != dwSize) 
49.        { 
50.            VirtualFreeEx(hProcess,lpRemoteBuf,dwSize,MEM_COMMIT); 
51.            CloseHandle(hProcess); 
52.            return -1; 
53.        } 
54. 
55.    }else 
56.    { 
57.        printf("\n写入远程进程内存空间出错%d。",GetLastError()); 
58.        CloseHandle(hProcess); 
59.        return -1; 
60.    } 
61. 
62.    DWORD dwNewThreadId; 
63.    LPVOID lpLoadDll = LoadLibraryA; 
64.    HANDLE hNewRemoteThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)lpLoadDll,lpRemoteBuf,0,&dwNewThreadId); 
65.    if(hNewRemoteThread == NULL) 
66.    { 
67.        printf("\n建立远程线程失败%d",GetLastError()); 
68.        CloseHandle(hProcess); 
69.        return -1; 
70.    } 
71. 
72.    WaitForSingleObject(hNewRemoteThread,INFINITE); 
73.    CloseHandle(hNewRemoteThread); 
74. 
75.    //准备卸载之前注入的Dll 
76.    DWORD dwHandle,dwID; 
77.    LPVOID pFunc = GetModuleHandleA;//获得在远程线程中被注入的Dll的句柄 
78.    HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,lpRemoteBuf,0,&dwID); 
79.    WaitForSingleObject(hThread,INFINITE); 
80.    GetExitCodeThread(hThread,&dwHandle);//线程的结束码即为Dll模块儿的句柄 
81.    CloseHandle(hThread); 
82.    pFunc = FreeLibrary; 
83.    hThread = CreateRemoteThread(hThread,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,(LPVOID)dwHandle,0,&dwID); //将FreeLibraryA注入到远程线程中去卸载Dll 
84.    WaitForSingleObject(hThread,INFINITE); 
85.    CloseHandle(hThread); 
86.    CloseHandle(hProcess); 
87.    return 0; 
88.} 

http://pnig0s1992.blog.51cto.com/393390/804484


相关文章
|
7月前
|
监控 编译器 API
[笔记]Windows核心编程《二十二》注入DLL和拦截API(一)
[笔记]Windows核心编程《二十二》注入DLL和拦截API
146 0
|
1月前
|
C++
【C++】C++封装成DLL并调用(初学者快速入门)
【C++】C++封装成DLL并调用(初学者快速入门)
|
5月前
|
Java
Java反射的详细解析之三
面试题: 你觉得反射好不好?好,有两个方向 第一个方向:无视修饰符访问类中的内容。但是这种操作在开发中一般不用,都是框架底层来用的。 第二个方向:反射可以跟配置文件结合起来使用,动态的创建对象,动态的调用方法。
22 0
|
6月前
dll执行注入实操
dll执行注入实操
|
7月前
|
消息中间件 编解码 安全
[笔记]Windows核心编程《二十二》注入DLL和拦截API(二)
[笔记]Windows核心编程《二十二》注入DLL和拦截API(二)
104 0
|
7月前
|
安全 API Windows
[笔记]Windows核心编程《二十二》注入DLL和拦截API(三)
[笔记]Windows核心编程《二十二》注入DLL和拦截API(三)
139 0
|
安全 Java 数据安全/隐私保护
Java项目中如何使用反射?
Java中的反射机制允许程序在运行时动态地获取类的信息,并且可以在运行时操作对象的属性、方法等。以下是Java项目中反射机制的实现方法。
105 0
|
存储 Go
Go Web编程实战(6)----反射
Go Web编程实战(6)----反射
104 0
Go Web编程实战(6)----反射
|
消息中间件 编解码 安全
[笔记]Windows核心编程《二十二》注入DLL和拦截API
]Windows核心编程《二十二》注入DLL和拦截API
420 0
[笔记]Windows核心编程《二十二》注入DLL和拦截API
|
Java 数据库连接 mybatis
【SSM框架解析】——前篇:详解动态代理【案例驱动】(案例源码自取)
今天开始要学习SSM框架了,新的开始我决定用博客来记录自己的学习过程,和CSDN上的大佬们一同进步。
【SSM框架解析】——前篇:详解动态代理【案例驱动】(案例源码自取)