首页 > 考试认证 > windows > 正文
MFC动态调用dll到指定的进程中(win7系统vs2013环境下)
2016-05-04     我来说两句       作者:黑帽网
   我要投稿

一、主程序

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

/

 

2、写一个简单的窗体

/

 

点击启动事件

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

 

 

二、要调用的Dll

1、新建一个win32dll


/

 

选择dll、勾选导出符号

/

 

1、生成Dll项目

/

 

此时会在主程序Main的debug文件夹中生成了Dll.dll和Dll.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 onceHANDLE 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/

//

 

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

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已经加入到了目标的进程中

/

点击收藏到自己的收藏夹!回本站首页
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:【DirectX11-Tutorial】运行第一个win32程序A Primer of Basic Windows
下一篇:SharePoint轻量化应用之HR招聘系统之将模板发布到SharePoint表单库及后续测试!
相关文章
图文推荐
排行
热门
Linux
华为
计算机
关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 中国黑帽网--致力于做最好的网络安全技术学习网站 。