DLL注入与卸载

DLL注入与卸载DLL注入可用于编写外挂和病毒不易发现。voidCInjectDllToolDlg::StartInject(char*path,intpid){ intpathLen=strlen(path)+sizeof(char);//获取dll目录大小 HANDLEhPro=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); if(!

大家好,又见面了,我是你们的朋友全栈君。

DLL注入可用于编写外挂和病毒不易发现。

void CInjectDllToolDlg::StartInject(char *path, int pid)
{
	int pathLen = strlen(path)+sizeof(char);//获取dll目录大小
	HANDLE hPro = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
	if (!hPro)
	{
		MessageBox("打开进程失败", "警告", 0);
		return;
	}
	//在该进程申请内存,用来存放path数据
	LPVOID dllAddr = VirtualAllocEx(hPro, NULL, pathLen, MEM_COMMIT, PAGE_READWRITE);
	if (!dllAddr)
	{
		MessageBox("获取地址失败", "警告", 0);
		CloseHandle(hPro);
		return;
	}
	//在申请的内存中写入path
	DWORD wNum = 0;
	if (!WriteProcessMemory(hPro, dllAddr, path, pathLen, &wNum))
	{
		MessageBox("写入失败", "警告", 0);
		VirtualFreeEx(hPro, dllAddr, pathLen, MEM_DECOMMIT);
		CloseHandle(hPro);
		return;
	}
	//获取loadlibrary函数地址
	FARPROC pFun = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

	if (!pFun)
	{
		MessageBox("获取函数失败", "警告", 0);
		VirtualFreeEx(hPro, dllAddr, pathLen, MEM_DECOMMIT);
		CloseHandle(hPro);
		return;
	}
	DWORD dwPid;
	HANDLE hThread = CreateRemoteThread(hPro, NULL, 0, (LPTHREAD_START_ROUTINE)pFun, dllAddr, 0, &dwPid);
	if (!hThread)
	{
		MessageBox("注入失败", "警告", 0);
		VirtualFreeEx(hPro, dllAddr, pathLen, MEM_DECOMMIT);
		CloseHandle(hPro);
		return;
	}
	DWORD errorNum = GetLastError();
	WaitForSingleObject(hThread, INFINITE);
	CloseHandle(hThread);
	CloseHandle(hPro);
}


这个只适用于xp系统,win7系统不可以随便CreateRemoteThread了,返回值一直为NULL

具体方法引用看雪:Vista&Win7下CreateRemoteThread应用的若干问题和解决方案

Dll卸载与注入流程大体相同,先创建 进程快照找到相应的线程模块,获取FreeLibrary地址,再创建远程线程卸载

void UnInjectDll(char *szDllName, DWORD dwPid)
{
	if(dwPid==0 || strlen(szDllName)==0)
	{
		AfxMessageBox("输入信息不全");
		return;
	}
	//创建进程快照
	HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwPid);
	MODULEENTRY32 ME32 = {0};
	ME32.dwSize = sizeof(MODULEENTRY32);
	BOOL isNext = Module32First(hSnap,&ME32);
	BOOL flag = FALSE;
	while(isNext)
	{
		if(strcmp(ME32.szModule,szDllName)==0)
		{
			flag = TRUE;
			break;
		}
		isNext = Module32Next(hSnap,&ME32);
	}
	if(flag == FALSE)
	{
		AfxMessageBox("找不到目标模块");
		return;
	}
	CloseHandle(hSnap);
	HANDLE hPro = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPid);
	FARPROC pFun = GetProcAddress(GetModuleHandle("kernel32.dll"),"FreeLibrary");
	HANDLE hThread = CreateRemoteThread(hPro,NULL,0,(LPTHREAD_START_ROUTINE)pFun,ME32.szModule,0,NULL);
	if(!hThread)
	{
		AfxMessageBox("创建远程线程失败");
		return ;
	}
	AfxMessageBox("卸载成功");
	WaitForSingleObject(hThread,INFINITE);
	CloseHandle(hThread);
	CloseHandle(hPro);
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145594.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • clion 激活码[在线序列号]

    clion 激活码[在线序列号],https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 1MB,1GB,1TB等于多少字节或比特?(理解B与b的区别)「建议收藏」

    1MB,1GB,1TB等于多少字节或比特?(理解B与b的区别)「建议收藏」首先,数据量最小单位比特,bit,(b)即一个比特位为0或1;然后,一个字节,Byte(B)等于8个比特位;1B=8bit.与字节搭配时,K,M,G,T为二进制单位,因为1000与1024相近,即2^10=1K;所以:1KB=1024Byte,所以1MB=10241024=1048576字节1MB=1024KB1GB=1024MB1TB=1024GB与比特搭配时,K,M,…

  • Vim:如何退出Vim编辑器?

    Vim:如何退出Vim编辑器?Vim:如何退出Vim编辑器?(笑)这个问题可以说是每个初学者的必经之路咯解决办法如下!请注意非常重要的一点!在vim里面不管何时,直接输入“:”就会在最下面显示出一行,vim开始进入命令模式(而不是write模式)当初自己傻得不行,明知道命令却不知道如何使用,分享给那些一样和我不知道怎么使用命令的…:q//退出:q!//退出且不保存(:quit!的缩写):wq//保存并退出:wq!//保存并退出即使文件没有写入权限(强制保存退出):x//保存并退出(类似:w

  • 基于Tensorflow的DCNN实现(A Convolutional Neural Network for Modelling Sentences)「建议收藏」

    基于Tensorflow的DCNN实现(A Convolutional Neural Network for Modelling Sentences)「建议收藏」本文我写了一个基于tensorflow的DCNN的实现,原文是AConvolutionalNeuralNetworkforModellingSentences,地址如下:https://arxiv.org/abs/1404.2188先给出我自己的github的代码https://github.com/jacky123465/DCNN(如果是python3.几的版本是可以直接运行…

  • webstorm 快捷键 失效问题[通俗易懂]

    webstorm 快捷键 失效问题[通俗易懂] 解决方案一:file->Settings->Keymap->设置为Default解决方案二:file->Settings->IdeaVim->取消对勾重启即可。原博客地址:https://blog.csdn.net/jianyuling199/article/details/80772479…

  • python-一些操作常识

    python-一些操作常识

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号