自动内存驻留程序Word格式.docx
《自动内存驻留程序Word格式.docx》由会员分享,可在线阅读,更多相关《自动内存驻留程序Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
//
#include"
stdafx.h"
#defineDEF_DLL_PORT_declspec(dllexport)
DllProcess.h"
#include<
tchar.h>
#ifdef_MANAGED
#pragmamanaged(push,off)
BOOL__stdcallMyCreateProcess(
LPCTSTRlpApplicationName,
LPTSTRlpCommandLine,
LPSECURITY_ATTRIBUTESlpProcessAttributes,
LPSECURITY_ATTRIBUTESlpThreadAttributes,
BOOLbInheritHandles,
DWORDdwCreationFlags,
LPVOIDlpEnvironment,
LPCTSTRlpCurrentDirectory,
LPSTARTUPINFOlpStartupInfo,
LPPROCESS_INFORMATIONlpProcessInformation
)
{
returnTRUE;
}
BOOLAPIENTRYDllMain(HMODULEhModule,
DWORDul_reason_for_call,
LPVOIDlpReserved
)
switch(ul_reason_for_call)
{
caseDLL_PROCESS_ATTACH:
MessageBox(NULL,_T("
注入成功·
·
~!
"
),0,0);
//自己想要运行的程序
//·
//·
//…………………
break;
caseDLL_PROCESS_DETACH:
卸载成功``````````````````````~!
}
#pragmamanaged(pop)
//源程序代码:
1.MFCEnter.h
//MFCEnter.h:
PROJECT_NAME应用程序的主头文件
#ifndef__AFXWIN_H__
#error"
在包含此文件之前包含“stdafx.h”以生成PCH文件"
resource.h"
//主符号
//CMFCEnterApp:
//有关此类的实现,请参阅MFCEnter.cpp
classCMFCEnterApp:
publicCWinApp
public:
CMFCEnterApp();
//重写
public:
virtualBOOLInitInstance();
//实现
DECLARE_MESSAGE_MAP()
};
externCMFCEnterApptheApp;
2.MFCEnterDlg.h
//MFCEnterDlg.h:
头文件
afxwin.h"
Tlhelp32.h>
afxcmn.h"
Psapi.h>
//路径函数的库
#pragmacomment(lib,"
Kernel32.lib"
)
Psapi.lib"
//CMFCEnterDlg对话框
classCMFCEnterDlg:
publicCDialog
//构造
CMFCEnterDlg(CWnd*pParent=NULL);
//标准构造函数
//对话框数据
enum{IDD=IDD_MFCENTER_DIALOG};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);
//DDX/DDV支持
protected:
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
afx_msgvoidOnBnClickedEnter();
CEditm_ediProcessID;
CEditm_edtDllPath;
afx_msgvoidOnBnClickedGetdllPath();
afx_msgvoidOnBnClickedUnist();
afx_msgvoidGetToolShot();
afx_msgvoidInitList();
CListCtrlm_ListProcess;
afx_msgvoidOnBnClickedOpenprocess();
afx_msgvoidOnNMClickListProcess(NMHDR*pNMHDR,LRESULT*pResult);
afx_msgvoidOnNMDblclkListProcess(NMHDR*pNMHDR,LRESULT*pResult);
3.MFCEnter.cpp
//MFCEnter.cpp:
定义应用程序的类行为。
MFCEnter.h"
MFCEnterDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
//CMFCEnterApp
BEGIN_MESSAGE_MAP(CMFCEnterApp,CWinApp)
ON_COMMAND(ID_HELP,&
CWinApp:
:
OnHelp)
END_MESSAGE_MAP()
//CMFCEnterApp构造
CMFCEnterApp:
CMFCEnterApp()
//TODO:
在此处添加构造代码,
//将所有重要的初始化放置在InitInstance中
//唯一的一个CMFCEnterApp对象
CMFCEnterApptheApp;
//CMFCEnterApp初始化
BOOLCMFCEnterApp:
InitInstance()
//如果一个运行在WindowsXP上的应用程序清单指定要
//使用ComCtl32.dll版本6或更高版本来启用可视化方式,
//则需要InitCommonControlsEx()。
否则,将无法创建窗口。
INITCOMMONCONTROLSEXInitCtrls;
InitCtrls.dwSize=sizeof(InitCtrls);
//将它设置为包括所有要在应用程序中使用的
//公共控件类。
InitCtrls.dwICC=ICC_WIN95_CLASSES;
InitCommonControlsEx(&
InitCtrls);
CWinApp:
InitInstance();
AfxEnableControlContainer();
//标准初始化
//如果未使用这些功能并希望减小
//最终可执行文件的大小,则应移除下列
//不需要的特定初始化例程
//更改用于存储设置的注册表项
应适当修改该字符串,
//例如修改为公司或组织名
SetRegistryKey(_T("
应用程序向导生成的本地应用程序"
));
CMFCEnterDlgdlg;
m_pMainWnd=&
dlg;
INT_PTRnResponse=dlg.DoModal();
if(nResponse==IDOK)
//TODO:
在此处放置处理何时用“确定”来关闭
//对话框的代码
elseif(nResponse==IDCANCEL)
在此放置处理何时用“取消”来关闭
//由于对话框已关闭,所以将返回FALSE以便退出应用程序,
//而不是启动应用程序的消息泵。
returnFALSE;
4.MFCEnterDlg.cpp
//MFCEnterDlg.cpp:
实现文件
//用于应用程序“关于”菜单项的CAboutDlg对话框
classCAboutDlg:
CAboutDlg();
enum{IDD=IDD_ABOUTBOX};
CAboutDlg:
CAboutDlg():
CDialog(CAboutDlg:
IDD)
voidCAboutDlg:
DoDataExchange(CDataExchange*pDX)
CDialog:
DoDataExchange(pDX);
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
CMFCEnterDlg:
CMFCEnterDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMFCEnterDlg:
IDD,pParent)
m_hIcon=AfxGetApp()->
LoadIcon(IDR_MAINFRAME);
voidCMFCEnterDlg:
DDX_Control(pDX,IDC_PROCESS_ID,m_ediProcessID);
DDX_Control(pDX,IDC_DLL_PATH,m_edtDllPath);
DDX_Control(pDX,IDC_LIST_PROCESS,m_ListProcess);
BEGIN_MESSAGE_MAP(CMFCEnterDlg,CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_ENTER,&
OnBnClickedEnter)
ON_BN_CLICKED(IDC_GETDLL_PATH,&
OnBnClickedGetdllPath)
ON_BN_CLICKED(IDC_UNIST,&
OnBnClickedUnist)
ON_BN_CLICKED(IDC_OPENPROCESS,&
OnBnClickedOpenprocess)
//ON_NOTIFY(HDN_ITEMDBLCLICK,0,&
OnHdnItemdblclickListProcess)
//ON_NOTIFY(LVN_COLUMNCLICK,IDC_LIST_PROCESS,&
OnLvnColumnclickListProcess)
ON_NOTIFY(NM_CLICK,IDC_LIST_PROCESS,&
OnNMClickListProcess)
ON_NOTIFY(NM_DBLCLK,IDC_LIST_PROCESS,&
OnNMDblclkListProcess)
//CMFCEnterDlg消息处理程序
BOOLCMFCEnterDlg:
OnInitDialog()
OnInitDialog();
//将“关于...”菜单项添加到系统菜单中。
//IDM_ABOUTBOX必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX&
0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<
0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->
AppendMenu(MF_SEPARATOR);
AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
//设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动
//执行此操作
SetIcon(m_hIcon,TRUE);
//设置大图标
SetIcon(m_hIcon,FALSE);
//设置小图标
在此添加额外的初始化代码
InitList();
//除非将焦点设置到控件,否则返回TRUE
OnSysCommand(UINTnID,LPARAMlParam)
if((nID&
0xFFF0)==IDM_ABOUTBOX)
CAboutDlgdlgAbout;
dlgAbout.DoModal();
else
CDialog:
OnSysCommand(nID,lParam);
//如果向对话框添加最小化按钮,则需要下面的代码
//来绘制该图标。
对于使用文档/视图模型的MFC应用程序,
//这将由框架自动完成。
OnPaint()
if(IsIconic())
CPaintDCdc(this);
//用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND,reinterpret_cast<
WPARAM>
(dc.GetSafeHdc()),0);
//使图标在工作矩形中居中
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&
rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//绘制图标
dc.DrawIcon(x,y,m_hIcon);
OnPaint();
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSORCMFCEnterDlg:
OnQueryDragIcon()
returnstatic_cast<
HCURSOR>
(m_hIcon);
OnBnClickedEnter()
在此添加控件通知处理程序代码
//获得目标进程句柄
//1.获得目标进程的ID
HANDLEhProcess=NULL;
HMODULEhDll=NULL;
HANDLEhRemoteThread=NULL;
CStringstrDllPath;
CStringstrProcessID;
DWORDdwID=0;
m_ediProcessID.GetWindowText(strProcessID);
dwID=_ttoi(strProcessID);
if(dwID<
=0)
MessageBox(_T("
进程ID有误~!
return;
//2.通过进程ID获得进程句柄
hProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_QUERY_INFORMATION|
PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ
FALSE,dwID);
if(NULL==hProcess)
进程句柄获取失败~!
//获得线程函数(LoadLibrary)的地址
//1.得到kernel32.dll的句柄
hDll=GetModuleHandle(_T("
Kernel32.dll"
if(NULL==hDll)
CloseHandle(hProcess);
获得线程函数句柄失败~!
//2.通过句柄获得函数的地址
#ifdef_UNICODE
LPTHREAD_START_ROUTINEfarProc=(LPTHREAD_START_ROUTINE)GetProcAddress(hDll,"
LoadLibraryW"
);
#else
LPTHREAD_START_ROUTINEfarProc=GetProcAddress(hDll,"
LoadLibraryA"
if(NULL==farProc)
获取进程函数失败~!
//3.获得动态链接库的路径,把他写入目标进程的内存中
m_edtDllPath.GetWindowText(strDllPath);
DWORDdwSize=(strDllPath.GetLength()+1)*sizeof(TCHAR);
//3.1在目标进程中申请空间
LPVOIDlpStart=VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT,PAGE_READWRITE);
if(NULL==lpStart)
CloseHandle(hProcess);
MessageBox(_T("
申请空间失败~!
return;
//3.2把动态链接库的地址写入申请的空间中
if(0==WriteProcessMemory(hProcess,lpStart,strDllPath,dwSize,NULL))
VirtualFreeEx(hProcess,lpStart,dwSize,MEM_COMMIT);
写入失败~!
//执行远程线程
hRemoteThread=CreateRemoteThread(hProcess,NULL,0,farProc,lpStart,0,NULL);
if(NULL==hRemoteThread)
int