C++学习之DLL注入
#include<stdio.h>
#include<Windows.h>
#include<TlHelp32.h> //typedef unsigned long DWORD;
//typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;
//typedef void *HANDLE; DWORD getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID
{
DWORD dwRet=;
HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,);/*CreateToolhelp32Snapshot函数为指定的进程、
进程使用的堆[HEAP]、模块[MODULE]、
线程[THREAD])建立一个快照[snapshot]。*/
if(hSnapShot==INVALID_HANDLE_VALUE)
{
//句柄无效
printf("\n获得PID=%s的进程快照失败%d",lpProcessName,GetLastError());
return dwRet;
} //快照抓取成功
PROCESSENTRY32 pe32;//声明进程入口对象
pe32.dwSize=sizeof(PROCESSENTRY32 );//填充进程入口大小
Process32First(hSnapShot,&pe32);//遍历进程列表
do
{
if(!lstrcmp(pe32.szExeFile,lpProcessName))
{
dwRet=pe32.th32ProcessID;
break;
}
}
while(Process32Next(hSnapShot,&pe32));
CloseHandle(hSnapShot);
return dwRet; } void EnableDebugPriv()
{
HANDLE hToken; // 进程访问令牌的句柄
LUID luid; // 用于存储调试权对应的局local unique identifier
TOKEN_PRIVILEGES tkp; // 要设置的权限
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
// 获取访问令牌
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); // 获得调试权的luid
tkp.PrivilegeCount = ; // 设置调试权
tkp.Privileges[].Luid = luid;
tkp.Privileges[].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL); // 使进程拥有调试权
CloseHandle(hToken);
} int main(int argc,char *argv[])
{
DWORD dwpid=getProcessHandle("calc.exe");
LPCSTR lpDllName="D:\\WorkProject\\C++\\20160314\\DLLImport\\Debug\\dllDemo.dll";
EnableDebugPriv();//权限提升
HANDLE hProcess=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwpid);//获得要注入进程的句柄 if(hProcess==NULL)
{
printf("\n获取进程句柄错误%d",GetLastError());
return -;
} DWORD dwSize=strlen(lpDllName)+;
DWORD dwHasWrite;
LPVOID lpRemoteBuf=VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT,PAGE_READWRITE);//在远程空间分配地址
if(WriteProcessMemory(hProcess,lpRemoteBuf,lpDllName,dwSize,&dwHasWrite))//写入内存函数执行成功返回非零
{
if(dwHasWrite!=dwSize)
{
//写入内存不完整,释放内存
VirtualFreeEx(hProcess,lpRemoteBuf,dwSize,MEM_COMMIT);
CloseHandle(hProcess);
return -;
}
}
else
{
printf("\n写入远程进程内存空间出错%d",GetLastError());
CloseHandle(hProcess);
return -;
}
//写入成功
DWORD dwNewThreadId;
LPVOID lpLoadDll=LoadLibraryA;
//将LoadLIbraryA作为线程函数,参数为Dll,创建新线程
HANDLE hNewRemoteThread=CreateRemoteThread(hProcess,NULL,,(LPTHREAD_START_ROUTINE)lpLoadDll,lpRemoteBuf,,&dwNewThreadId);
//HANDLE hNewRemoteThread=
if(hNewRemoteThread==NULL)
{
printf("\n建立远程线程失败%d",GetLastError());
CloseHandle(hProcess);
return -;
}
//等待对象句柄返回
WaitForSingleObject(hNewRemoteThread,INFINITE); CloseHandle(hNewRemoteThread); //准备卸载之前注入的Dll
DWORD dwHandle,dwID;
LPVOID pFunc = GetModuleHandleA;//获得在远程线程中被注入的Dll的句柄
HANDLE hThread = CreateRemoteThread(hProcess,NULL,,(LPTHREAD_START_ROUTINE)pFunc,lpRemoteBuf,,&dwID);
WaitForSingleObject(hThread,INFINITE);
GetExitCodeThread(hThread,&dwHandle);//线程的结束码即为Dll模块儿的句柄
CloseHandle(hThread);
pFunc = FreeLibrary;
hThread = CreateRemoteThread(hThread,NULL,,(LPTHREAD_START_ROUTINE)pFunc,(LPVOID)dwHandle,,&dwID); //将FreeLibraryA注入到远程线程中去卸载Dll
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
CloseHandle(hProcess);
return ;
}
C++学习之DLL注入的更多相关文章
- 逆向学习-DLL注入
DLL注入技术,可以实现钩取API,改进程序,修复Bug. DLL注入指的是向运行中的其他进程强制插入特定的DLL文件. DLL注入命令进程自行调用LoadLibrary()API,加载用户指定的DL ...
- DLL注入之注册表
0x00 唠叨 编写本系列文章纯属为了系统学习DLL注入的方法,所以很多方法可能已经过时,希望各位看官勿喷.当然若有更好的方法,希望不腻赐教.若本文有任何错的地方,也希望各位指正.谢谢! 0x01 适 ...
- dll注入与代码注入
学习<逆向工程核心原理>,在x64下dll注入与代码注入. dll注入主要用到CreateRemoteThread, HANDLE WINAPI CreateRemoteThread( _ ...
- Web安全学习笔记 SQL注入中
Web安全学习笔记 SQL注入中 繁枝插云欣 --ICML8 权限提升 数据库检测 绕过技巧 一.权限提升 1. UDF提权 UDF User Defined Function,用户自定义函数 是My ...
- Ring3下的DLL注入(NtCreateThreadEx + LdrLoadDll方式实现,可以注入系统进程)
工具介绍及使用请移步:http://blog.csdn.net/sunflover454/article/details/50441014 本文首发在零日安全论坛:http://www.jmpoep. ...
- DLL注入
最近的项目涉及了软件破解方面的知识,记录一下. 将dll注入另一个进程. // Inject.cpp : Defines the exported functions for the DLL appl ...
- [转]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)去子类化另一个进程 ...
随机推荐
- 一步一步学习SignalR进行实时通信_8_案例2
原文:一步一步学习SignalR进行实时通信_8_案例2 一步一步学习SignalR进行实时通信\_8_案例2 SignalR 一步一步学习SignalR进行实时通信_8_案例2 前言 配置Hub 建 ...
- HDOJ 2058 The sum problem
Problem Description Given a sequence 1,2,3,--N, your job is to calculate all the possible sub-sequen ...
- vijosP1603迷宫
vijosP1603迷宫 链接:https://vijos.org/p/1603 [思路] 参考Matrix67的文章: [代码] #include<cstdio> #include< ...
- poj2299
好吧,看到这个图片就知道是干什么的了,求逆序数- - 可以用线段树,貌似还可以用归并排序,这题应该是考的归并排序,毕竟是递归分治- - 基本上都忘了,再写一写试试吧. AC ///////////// ...
- 使用atomic一定是线程安全的吗
这个问题很少遇到,但是答案当然不是.atomic在set方法里加了锁,防止了多线程一直去写这个property,造成难以预计的数值.但这也只是读写的锁定.跟线程安全其实还是差一些.看下面. @inte ...
- .net core4
- 看小白如何解决ajax跨域问题
由于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解决ajax的跨域问题.本篇将讲述一个小白从遇到跨域不知道 ...
- S3C2440 I2C总线控制
概述:话不多说,直接上图 多主机IIC总线控制(IICCON): IIC控制总线状态(IICSTAT): IIC总线地址(IICADD): IIC发送,接收总线寄存器(IICDS) IIC总线控制寄存 ...
- [Angular 2] Pipe Purity
Explaining how Pipes only change by default when your Pipe input parameters change and not when your ...
- HDU1097 A hard puzzle
A hard puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...