HOOK 专题:(一)远程DLL线程注入

一、远程线程注入流程

远程DLL注入:适用于代码量大且复杂的情况

第一步打开进程OpenProcess
第二步远程进程中申请空间VirtualAllocEx
第三步向远程进程写入数据WriteProcessMemory
第四步在远程进程中创建远程线程CreateRemoteThread
第五步等待线程结束返回WaitForSingleObject
第六步释放空间VirtualFreeEx、CloseHandle

二、准备需要注入的DLL

在DLL注入之前,先准备一个需要注入的dll,代码如下:

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        MessageBoxA(NULL, "你被HOOK了", "YunShu", MB_OK);
        break;
    case DLL_THREAD_ATTACH:

        break;
    case DLL_THREAD_DETACH:

        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

然后生成dll,生成dll时需注意:若目标注入程序是32位的,需生成32位的dll,反之生成64位的。

生成成功后用注入器测试一下,注入成功,如下图所示:

在这里插入图片描述

三、远程DLL注入程序编写

#include <iostream>
#include<Windows.h>
using namespace std;
//目标进程ID,动态链接库的路径
BOOL inject(DWORD dwProcessId,const WCHAR * szFilePath) {
	//进程全部的权限,句柄继承(通常为FALSE),目标进程ID
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);//返回的是进程句柄
	//目标进程句柄,需要开辟的地址(NULL为操作系统分配),需要分配地址的大小,现在操作的类型,提供可读可写的属性
	LPVOID lpAddress = VirtualAllocEx(hProcess,NULL,0x100,MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
	//目标进程句柄,写到什么位置的地址,需要写的内容,需要写的长度,写入的宽度(用地址的形式传值)
	SIZE_T dwRet = 0;
	BOOL bRet=WriteProcessMemory(hProcess, lpAddress, szFilePath,((wcslen(szFilePath)+1)*2),&dwRet);
	//判断是否写入失败
	if (!bRet) {
		return FALSE;
	}
	//目标进程句柄,安全特性(通常为NULL),栈的尺寸(可以为NULL),该线程函数启动地址(强制转换类型为LPTHREAD_START_ROUTINE,可用LoadLibraryW加载),需要提供的参数(此处为需要写入的地址),标志(可以为NULL),线程ID(可以为NULL)
	HANDLE hThread = CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)LoadLibraryW, lpAddress,NULL,NULL);
	//-1代表一直等
	WaitForSingleObject(hThread, -1);
	VirtualFreeEx(hProcess,lpAddress, ((wcslen(szFilePath) + 1) * 2),MEM_RELEASE);
	CloseHandle(hProcess);
	CloseHandle(hThread);
	
}


int main()
{
	inject(16896,L"C:\\Users\\93243\\Desktop\\Dll1.dll");
	system("pause");
	return 0;

}

执行以上代码,注入成功,如下图所示:

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值