码迷,mamicode.com
首页 > 编程语言 > 详细

MFC动态调用dll到指定的进程中(win7系统vs2013环境下)

时间:2016-04-24 06:28:30      阅读:388      评论:0      收藏:0      [点我收藏+]

标签:

一、主程序

1、新建一个MFC项目,类型选择基于对话框

技术分享

2、写一个简单的窗体

技术分享

点击启动事件

MessageBox(L"调用Dll到程序中成功。");


二、要调用的Dll

1、新建一个win32dll


技术分享

选择dll、勾选导出符号

技术分享

1、生成Dll项目

技术分享

此时会在主程序Maindebug文件夹中生成了Dll.dllDll.lib文件

技术分享

三、配置主程序Main的属性

1、选择链接器——输入——附加依赖项:Dll.lib

技术分享

1、选择连接器——输入——常规——附加库目录:..\Debug

技术分享

1、包含头文件。

选择属性——C/C++——附加包含目录:..\..\Dll

技术分享

然后在主程序的MainDlg.cpp类中加入包含Dll的头文件#include "Dll.h"

再在启动按钮点击时调用一下Dll中的一个函数fnDll

fnDll();

启动程序点击启动


技术分享

使用PCHunter64.exe查看进程

技术分享

看到Dll.dll已经在此程序中被调用了。

 

四、动态调用dll

1、先将属性的链接器——输入——附加依赖项删除

技术分享

把项目中刚调用的引用头文件以及函数都屏蔽

技术分享

技术分享

1、引入注入的工具代码Injection.h到主程序的头文件文件夹中以及Injection.cpp到源文件夹中。

Injection.h内容如下:

#pragma once

HANDLE InjectProcess(DWORD dwProcessId, const WCHAR* szModuleName);

void UpdataToken();

Injection.cpp内容如下:

#include "stdafx.h"
#include "Injection.h"


HANDLE hAimProcess=NULL;
DWORD dAimProcessId=0;
HMODULE hKernel32=NULL;
HANDLE hInjectionThread=NULL;
PTHREAD_START_ROUTINE lpLoadLibraryAddress=NULL;
LPVOID lpParameter=NULL;
WCHAR wFilePath[MAX_PATH]={0};
size_t nPathLength=0;
HMODULE hInst=NULL;

HMODULE StartInjectionThread()
{
	hInjectionThread=::CreateRemoteThread(hAimProcess,NULL,0,lpLoadLibraryAddress,lpParameter,0,NULL);
	DWORD h = 0;
	if(hInjectionThread){
		::WaitForSingleObject(hInjectionThread,INFINITE);
		::GetExitCodeThread(hInjectionThread,&h);
	}
	return (HMODULE)h;
}

void FreeSpace()
{
	if(hInjectionThread!=NULL){
		DWORD h=0;
		::TerminateThread(hInjectionThread,h);
		::CloseHandle(hInjectionThread);
		::VirtualFreeEx(hAimProcess,lpParameter,nPathLength,MEM_DECOMMIT);
		::CloseHandle(hAimProcess);
		hInjectionThread=NULL;
	}	
}

void InitInjectionAddress()
{
	nPathLength = (1 + wcslen(wFilePath)) * sizeof(WCHAR);
	hKernel32 = GetModuleHandle(L"Kernel32.dll");
	lpLoadLibraryAddress=(PTHREAD_START_ROUTINE)GetProcAddress(hKernel32,"LoadLibraryW");
}

BOOL AllocateMemToAimProcess()
{
	lpParameter = VirtualAllocEx(hAimProcess,0,nPathLength,MEM_COMMIT,PAGE_READWRITE);
	return WriteProcessMemory(hAimProcess,lpParameter,wFilePath,nPathLength,NULL);
}

void InitInjectionModulePath(const WCHAR* szModuleName)
{
	GetModuleFileName(hInst,wFilePath,MAX_PATH);
	int nLen = wcslen(wFilePath);
	for(int i=nLen-1;i>-1;i--)
	{
		if(wFilePath[i]==L'\\')
		{
			for(int j=i+1;j<nLen;j++)
			{
				wFilePath[j]=0;
			}
			wcscat(wFilePath,szModuleName);
			break;
		}
	}
}

HANDLE InjectProcess(DWORD dwProcessId, const WCHAR* szModuleName)
{
	dAimProcessId = dwProcessId;
	hAimProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);
	InitInjectionModulePath(szModuleName);
	InitInjectionAddress();
	if(!AllocateMemToAimProcess())
	{
		return FALSE;
	}
	StartInjectionThread();
	FreeSpace();
	return hAimProcess;
}


void UpdataToken()
{
	HANDLE hToken;
	LUID DebugNameValue;
	TOKEN_PRIVILEGES Privileges;
	DWORD dwRet;
	OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
	LookupPrivilegeValue(NULL, L"SeDebugPrivilege", &DebugNameValue);
	Privileges.PrivilegeCount=1;
	Privileges.Privileges[0].Luid=DebugNameValue;
	Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
	AdjustTokenPrivileges(hToken, FALSE,&Privileges, sizeof(Privileges), NULL, &dwRet);
	CloseHandle(hToken);
}

技术分享

技术分享技术分享

此时编译会出现一个错误警告

error C4996: ‘wcscat‘: This function or variable may be unsafe. Consider using wcscat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

只需要在在项目->属性->C/C++->预处理器->预处理器定中添加_CRT_SECURE_NO_WARNINGS 这个预定义。

技术分享

1、加入调用Injection的函数

#include "Injection.h"

WCHAR czClassName[] = L"TXGuiFoundation";
WCHAR czWinName[] = L"陆周泉";
void CMainDlg::OnBnClickedOk()
{
	// TODO:  在此添加控件通知处理程序代码
	//CDialogEx::OnOK();
	//fnDll();
	MessageBox(L"程序启动成功。");
	DWORD procid = 0;
	CWnd *pWnd = FindWindow(czClassName, NULL);
	if (pWnd){
		MessageBox(L"找到窗口");
		GetWindowThreadProcessId(pWnd->m_hWnd, &procid);
		if (procid){
			//MessageBox(L"找到进程id");
			UpdataToken();
			if (InjectProcess(procid, L"Dll.dll"))
			{
				MessageBox(L"注入成功");
			}
		}
	}
	//MessageBox(L"调用Dll成功。");
}

其中WCHAR czClassName[] = L"TXGuiFoundation";为类名,可以使用Spy4Win.exe软件获取

技术分享

1、根据路径再调节一下C/C++包含目录

技术分享

再启动程序查看,Dll.dll已经加入到了目标的进程中

技术分享

MFC动态调用dll到指定的进程中(win7系统vs2013环境下)

标签:

原文地址:http://blog.csdn.net/u014175572/article/details/51231798

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!