DLL注入
最近的项目涉及了软件破解方面的知识,记录一下。
将dll注入另一个进程。
// Inject.cpp : Defines the exported functions for the DLL application.
// #include "stdafx.h"
#include <TlHelp32.h>
#include <Psapi.h>
#include <tchar.h> // LoadLibrary的不同版本
#if defined _UNICODE
#define _LoadLibrary "LoadLibraryW" //_UNICODE
#else
#define _LoadLibrary "LoadLibraryA" //_MBCS
#endif // 根据进程名获取PID
DWORD GetPID(LPTSTR lpProcess)
{
HANDLE hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, ); // 获取进程快照句柄 PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
BOOL flag = Process32First(hProcSnap, &pe32); // 获取列表的第一个进程 while(flag)
{
if(!_tcsicmp(pe32.szExeFile, lpProcess))
{
CloseHandle(hProcSnap);
return pe32.th32ProcessID; //pid
}
flag=Process32Next(hProcSnap, &pe32); //获取下一个进程
} CloseHandle(hProcSnap);
return ;
} // 获取适当的Privilege
// hProcess 当前进程的handle
// Privilege 需要的Privilege
// 成功返回TRUE,失败返回FALSE
BOOL AdjustProcessPrivilege(HANDLE hProcess, TCHAR *Privilege)
{
HANDLE hToken=NULL;
OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken); //打开进程令牌环 if(NULL==hToken)
return FALSE; LUID luid;
if(!LookupPrivilegeValue(NULL, Privilege, &luid)) // 获得进程本地唯一ID
{
CloseHandle(hToken);
return FALSE;
} TOKEN_PRIVILEGES token_privileges;
token_privileges.PrivilegeCount =;
token_privileges.Privileges[].Attributes = SE_PRIVILEGE_ENABLED;
token_privileges.Privileges[].Luid = luid; //调整进程权限
if(!AdjustTokenPrivileges(hToken, FALSE, &token_privileges, NULL, NULL, NULL))
{
CloseHandle(hToken);
return FALSE;
} CloseHandle(hToken); return TRUE;
} // 在进程中查找dll
HMODULE CheckProcessModule(LPTSTR lpRemoteProcess, LPTSTR lpInjectDll)
{
DWORD nRemotePID = GetPID(lpRemoteProcess);
HANDLE hRemoteProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, nRemotePID); HMODULE hMods[];
DWORD cbNeeded = ; // Get a handle to the process.
if( EnumProcessModules(hRemoteProcess, hMods, sizeof(hMods), &cbNeeded))
{
for (UINT i=; i<(cbNeeded/sizeof(HMODULE)); i++)
{
TCHAR szModName[MAX_PATH]; // Get the full path to the module's file.
if (GetModuleFileNameEx(hRemoteProcess, hMods[i], szModName, sizeof(szModName)/sizeof(TCHAR)))
{
if (!_tcsicmp(lpInjectDll, szModName))
{
CloseHandle(hRemoteProcess);
return hMods[i];
}
}
}
} CloseHandle(hRemoteProcess);
return NULL;
} BOOL InjectDll(LPTSTR lpRemoteProcess, LPTSTR lpInjectDll, BOOL bInject)
{
// 获取SeDebugPrivilege权限
if(FALSE == AdjustProcessPrivilege(GetCurrentProcess(), _T("SeDebugPrivilege")))
return FALSE; // 函数准备
LPTHREAD_START_ROUTINE pfnThread = NULL;
HINSTANCE hMod = GetModuleHandle(_T("kernel32.dll"));
if (bInject)
pfnThread = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod,_LoadLibrary); // LoadLibrary注入
else
pfnThread = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod,"FreeLibrary"); // FreeLibrary卸载
if(NULL == pfnThread)
return FALSE; __try
{
// 获取目标进程ID
DWORD nRemotePID = GetPID(lpRemoteProcess);
// 打开目标进程
HANDLE hRemoteProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, nRemotePID);
if(hRemoteProcess == NULL)
{
return FALSE;
} if (bInject) //注入
{
// 在远端进程中分配内存
LPVOID ModName = VirtualAllocEx(hRemoteProcess, NULL, (_tcslen(lpInjectDll)+)*sizeof(TCHAR), MEM_COMMIT, PAGE_READWRITE);
if(!ModName)
__leave; // 在远端进程中写入dll的文件名
if( == WriteProcessMemory(hRemoteProcess, ModName, lpInjectDll, (_tcslen(lpInjectDll)+)*sizeof(TCHAR), NULL))
__leave; // 创建远程线程
HANDLE hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, , pfnThread, ModName, , NULL);
if(NULL == hRemoteThread)
__leave;
WaitForSingleObject(hRemoteThread,INFINITE); VirtualFreeEx(hRemoteProcess, ModName, , MEM_RELEASE);
CloseHandle(hRemoteThread);
}
else //卸载
{
// 在进程中查找需要卸载的dll
HMODULE hTarget = CheckProcessModule(lpRemoteProcess, lpInjectDll);
// 创建远程线程
HANDLE hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, , pfnThread, hTarget, , NULL);
if(NULL == hRemoteThread)
__leave;
WaitForSingleObject(hRemoteThread,INFINITE); CloseHandle(hRemoteThread);
} CloseHandle(hRemoteProcess);
return TRUE;
}
__finally
{
} return FALSE;
}
以上已经将dll成功注入到目标进程,但是怎样让注入的dll执行?可以在dll加载时,执行一段代码。
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
Fun(); // 需要执行的代码
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
DLL注入的更多相关文章
- Ring3下的DLL注入(NtCreateThreadEx + LdrLoadDll方式实现,可以注入系统进程)
工具介绍及使用请移步:http://blog.csdn.net/sunflover454/article/details/50441014 本文首发在零日安全论坛:http://www.jmpoep. ...
- [转]Dll注入经典方法完整版
Pnig0s1992:算是复习了,最经典的教科书式的Dll注入. 总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在 ...
- 第22章 DLL注入和API拦截(2)
22.4 使用远程线程来注入DLL 22.4.1 概述 (1)远程线程注入是指一个进程在另一个进程中创建线程,然后载入我们编写的DLL,并执行该DLL代码的技术.其基本思路是通过CreateRemot ...
- 第22章 DLL注入和API拦截(1)
22.1 注入的一个例子(跨进程子类化窗口) ①子类化窗口可以改变窗口的行为,让发往该窗口的消息重新发到我们指定的过程来处理.但这种行为只能在本进程中(如A),对于从一个进程(如B)去子类化另一个进程 ...
- DLL注入之注册表
0x00 唠叨 编写本系列文章纯属为了系统学习DLL注入的方法,所以很多方法可能已经过时,希望各位看官勿喷.当然若有更好的方法,希望不腻赐教.若本文有任何错的地方,也希望各位指正.谢谢! 0x01 适 ...
- c++实现dll注入其它进程
DLL注入技术才具有强大的功能和使用性,同时简单易用,因为DLL中可以实现复杂的功能和很多的技术. 技术要点: 1.宿主进程调用LoadLibrary,就可以完成DLL的远程注入.可以通过Create ...
- DLL注入_拦截技术之Hook方式
后卫大师教你进程注入 首先提一下,由于文章完全是我手写,所以打不了太多,请包含,由于我已经提供了源代码,所以我在这里详细讲一下理论,至于想看代码的下载代码就可以了.代码中关于注入的部分做了详细的注释. ...
- 反射Dll注入分析
(源码作者:(HarmanySecurity)Stephen Fewer) 0x01 反射Dll注入的优点 1.反射Dll注入的主要优点是它没有以主机系统的任何方式(例如LoadLibrary和L ...
- dll注入遇到CreateRemoteThread()返回错误代码5
在进行dll注入的时候,发现触发了CreateRemoteThread()的错误并返回错误代码5,刚开始以为权限不够,用了管理员权限和加了SetPrivilege()函数提权和用NtCreateThr ...
随机推荐
- 对于amqplib的使用心得
最近在nodejs使用了amqplib--rabbitmq的nodejs客户端.封装在了express中,先来代码. var amqp = require('amqplib/callback_api' ...
- python练习
创建一个简单的姓名和编号系统,让用户输入一组人的姓名和编号,实现提供按照编号或姓名排序输出的功能. nums = [] names = [] Afternums = [] Afternames = [ ...
- <九>JDBC_获取插入记录的主键值
- 简明 Git 命令速查表(中文版)
原文引用地址:https://github.com/flyhigher139/Git-Cheat-Sheet/blob/master/Git%20Cheat%20Sheet-Zh.md在Github上 ...
- HDU 5833 Zhu and 772002(高斯消元)
题意:给n个数,从n个数中抽取x(x>=1)个数,这x个数相乘为完全平方数,求一共有多少种取法,结果模1000000007. 思路:每个数可以拆成素数相乘的形式,例如: x1 2=2^1 * 3 ...
- jquery 时间戳与日期转换
(function($) { $.extend({ myTime: { /** * 当前时间戳 * @return <int> unix时间戳(秒) */ CurTime: functio ...
- mycat的读写分离设置
官网:http://www.mycat.org.cn/ 一.jdk环境的安装1.安装jdk1.7,这是mycat推荐的jdk环境 2.之前是用yum安装的jdk1.6,首先查找下 #yum info ...
- NumberFormat DecimalFormat
http://blog.csdn.net/evangel_z/article/details/7624503 http://blog.163.com/wangzhengquan85@126/blog/ ...
- css定位 与position
本文同时发表于本人个人网站 www.yaoxiaowen.com 在正式讨论position之前,我们需要知道几个概念. 块元素:独占一行的元素.比如div,h1~h6,p等,它是自带换行的. 内联元 ...
- python之路 目录
目录 python python_基础总结1 python由来 字符编码 注释 pyc文件 python变量 导入模块 获取用户输入 流程控制if while python 基础2 编码转换 pych ...