admin管理员组

文章数量:1530517

远程dll注入到QQ

逻辑:
1.获取QQ的进程ID;
2.打开进程获取进程句柄,从而对进程进行操作;
3.对进程句柄进行操作,开辟一块空间,让目标进程进行调用我们所写的东西;
4.往开辟好的内存中写入数据;
5.设置何时调用我们所写的东西(QQ会加载各种dll,当调用LoadLibraryA【Kernel32.dll这个里面的函数】时,就会调用我们所写的东西);
6.开辟一个远程线程去调用所写的东西;

 

程序运行截图如下:

输入QQ的PID:

然后QQ就被注入掉了!

如下图:

 

首先看下程序结构:

下面来看看源码:

main.cpp

#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <windows.h>

int main(){


	BOOL bRet = FALSE;
	HANDLE hProcess = INVALID_HANDLE_VALUE;
	BYTE *pbProcessAddr = nullptr;

	do{
		printf("输入PID:");
		DWORD dwPID = 0;
		scanf("%d", &dwPID);

		//打开进程,获取进程句柄,使用进程句柄操作进程
		hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
		if(INVALID_HANDLE_VALUE == hProcess){
			break;
		}

		//在对方的进程中分配一块内存,让我们写东西
		char szDllPath[MAX_PATH] = {0};
		GetCurrentDirectoryA(MAX_PATH, szDllPath);
		strcat(szDllPath, "\\DllDemo.dll");

		int nPathLen = (strlen(szDllPath) + 1);
		pbProcessAddr = (BYTE*)VirtualAllocEx(hProcess, nullptr, nPathLen, MEM_COMMIT, PAGE_READWRITE);
		if(!pbProcessAddr){
			break;
		}

		//往分配好的内存中写入数据
		if(0 == WriteProcessMemory(hProcess,pbProcessAddr, szDllPath, nPathLen, nullptr)){
			break;
		}

		//让其执行我们写入的东西

		//启动一条远程线程,执行代码,注入DLL,目的是加载DLL
		//LoadLibrary();	//传需要加载的dll的名字, 会先找当前目录下,然后找系统目录

		//创建并执行远程线程
		PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("Kernel32"), "LoadLibraryA");
		if(!pfnStartAddr){
			break;
		}

		HANDLE hThread = CreateRemoteThread(hProcess, nullptr, 0, pfnStartAddr, pbProcessAddr, 0, nullptr);

		if(!hThread){
			break;
		}

		WaitForSingleObject(hThread, INFINITE);
		CloseHandle(hThread);
		bRet = TRUE;
	
	}while (FALSE);

	if(!bRet){
		printf("错误代码:%d", GetLastError());
	}

	if(pbProcessAddr){
		VirtualFreeEx(hProcess,pbProcessAddr, 0,  MEM_RELEASE);
	}

	if(INVALID_HANDLE_VALUE != hProcess){
		CloseHandle(hProcess);
	}


	system("pause");
	return 0;
}

 

dll直接生成,修改dllmain.cpp内容如下:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		MessageBox(nullptr, L"已经成功打入敌人内部", L"报告首长", MB_OK);
	case DLL_THREAD_ATTACH:
		MessageBox(nullptr, L"敌人已经运行了我", L"报告首长", MB_OK);
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

 

本文标签: 聊天工具dllqq