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);
}

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DNS服务器的配置「建议收藏」

    DNS服务器的配置「建议收藏」DNS(DomainNameServer,域名服务器)是进行域名(domainname)和与之相对应的IP地址(IPaddress)转换的服务器。DNS中保存了一张域名(domainname)和与之相对应的IP地址(IPaddress)的表,以解析消息的域名。域名是Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。1、安装…

    2022年6月4日
    37
  • 查询数据库用户所有表名_sql语句收回用户权限

    查询数据库用户所有表名_sql语句收回用户权限在企业系统中经常会使用到给用户分配权限的情况,往往在用户信息表和权限表之间还维护了一张角色表,即通过给用户添加角色,角色添加权限的这样一种方式来给用户间接的添加权限。如图示例那么,查询用户权限的多表查询sql语句长什么样呢?select*frompe_role_userruinnerjoinpe_role_modulermonru.role_id=rm.`role_id…

    2022年9月1日
    0
  • python resize函数怎么用_python cv2.resize函数high和width注意事项说明「建议收藏」

    在opencv中获取图片的尺寸的方法是:importcv2img=cv2.imread(path)img.shape返回的是三维数组(high,width,3),当我们需要对图像进行缩放时需要用到cv2.resize()函数:#缩放到原来的二分之一img=cv.resize(img,(int(width/2),int(high/2)))此时需要传入的形状又是(width,…

    2022年4月14日
    141
  • MyEclipse 快捷键

    MyEclipse快捷键1(CTRL)Ctrl+1快速修复Ctrl+D:删除当前行 Ctrl+Q定位到最后编辑的地方 Ctrl+L定位在某行Ctrl+O快速显示O

    2021年12月25日
    44
  • java标识符命名规范

    java标识符命名规范标识符identifier命名规范作用常量、变量、方法、类和包的名称等1、标识符不能以数字开头2、必须以下划线、字母、$开头3、java中包名、类名是不区分大小写的,也就是说包名:com.wang和com.Wang是相同的包名(即只要字母相同,不区分大小写,都是相同的包名);Aa和aA是相同的类名。这种情况小编译都会报错!!!!###但在使用命令窗口执行java类是,类名是区分大小写的:例如类名是HelloWorld的类执行时的命令是javaHelloWorld不能是jav

    2022年7月8日
    31
  • SpringBoot中的@ApiModelProperty注解

    @ApiModelProperty()注解用于方法、字段,表示对model属性的说明或者数据操作更改,以下是它的源码://IntelliJAPIDecompilerstubsourcegeneratedfromaclassfile//Implementationofmethodsisnotavailablepackageio.s…

    2022年4月14日
    174

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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