自动内存驻留程序要点.docx
- 文档编号:4457743
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:25
- 大小:1.29MB
自动内存驻留程序要点.docx
《自动内存驻留程序要点.docx》由会员分享,可在线阅读,更多相关《自动内存驻留程序要点.docx(25页珍藏版)》请在冰豆网上搜索。
自动内存驻留程序要点
课 程 设 计
题 目:
自动内存驻留程序
院、 系:
计算机科学与技术学院网络工程系
班级:
学号:
姓 名:
同组成员:
指导教师:
成绩:
2014年06月27日
一.系统设计的目标
编写程序,把指定代码注入相应程序中,达到操作简单,并且容易实现驻留在内存的目的,另一个目的是使注入程序在管理员不注意下不会轻易被发现,有一定的隐藏性。
二.系统原理:
采用远程注入和动态链接库技术,把动态链接库注入到目标进程,让动态链接库在目标进程的内存中运行,从而达到驻留在内存的效果。
三.系统功能分析:
这个程序较小,操作简单,非计算机专业的人员也容易执行,占用内存少,运行速度较快,方便对内存的注入,暂无发现不能容忍的bug,一般情况下能够正常运行,但是缺点在于容易被发现。
四.系统实现:
详细设计
首先先编译动态链接库:
然后编译mfc:
最后先选择动态链接库的路径,然后选择相应的进程,双击它,再选择注入:
附录:
源程序代码:
//动态链接库中的代码:
DllProcess.h
#pragmaonce
#ifndefDEF_DLL_PORT
#defineDEF_DLL_PORT_declspec(dllimport)
#endif
DllProcess.cpp
//DllProcess.cpp:
定义DLL应用程序的入口点。
//
#include"stdafx.h"
#defineDEF_DLL_PORT_declspec(dllexport)
#include"DllProcess.h"
#include
#ifdef_MANAGED
#pragmamanaged(push,off)
#endif
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:
MessageBox(NULL,_T("卸载成功``````````````````````~!
"),0,0);
break;
}
returnTRUE;
}
#ifdef_MANAGED
#pragmamanaged(pop)
#endif
//源程序代码:
1.MFCEnter.h
//MFCEnter.h:
PROJECT_NAME应用程序的主头文件
//
#pragmaonce
#ifndef__AFXWIN_H__
#error"在包含此文件之前包含“stdafx.h”以生成PCH文件"
#endif
#include"resource.h"//主符号
//CMFCEnterApp:
//有关此类的实现,请参阅MFCEnter.cpp
//
classCMFCEnterApp:
publicCWinApp
{
public:
CMFCEnterApp();
//重写
public:
virtualBOOLInitInstance();
//实现
DECLARE_MESSAGE_MAP()
};
externCMFCEnterApptheApp;
2.MFCEnterDlg.h
//MFCEnterDlg.h:
头文件
//
#pragmaonce
#include"afxwin.h"
#include
#include"afxcmn.h"
#include
#pragmacomment(lib,"Kernel32.lib")
#pragmacomment(lib,"Psapi.lib")
//CMFCEnterDlg对话框
classCMFCEnterDlg:
publicCDialog
{
//构造
public:
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();
DECLARE_MESSAGE_MAP()
public:
afx_msgvoidOnBnClickedEnter();
public:
CEditm_ediProcessID;
public:
CEditm_edtDllPath;
public:
afx_msgvoidOnBnClickedGetdllPath();
public:
afx_msgvoidOnBnClickedUnist();
afx_msgvoidGetToolShot();
afx_msgvoidInitList();
public:
CListCtrlm_ListProcess;
public:
afx_msgvoidOnBnClickedOpenprocess();
public:
afx_msgvoidOnNMClickListProcess(NMHDR*pNMHDR,LRESULT*pResult);
public:
afx_msgvoidOnNMDblclkListProcess(NMHDR*pNMHDR,LRESULT*pResult);
};
3.MFCEnter.cpp
//MFCEnter.cpp:
定义应用程序的类行为。
//
#include"stdafx.h"
#include"MFCEnter.h"
#include"MFCEnterDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//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();
//标准初始化
//如果未使用这些功能并希望减小
//最终可执行文件的大小,则应移除下列
//不需要的特定初始化例程
//更改用于存储设置的注册表项
//TODO:
应适当修改该字符串,
//例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
CMFCEnterDlgdlg;
m_pMainWnd=&dlg;
INT_PTRnResponse=dlg.DoModal();
if(nResponse==IDOK)
{
//TODO:
在此处放置处理何时用“确定”来关闭
//对话框的代码
}
elseif(nResponse==IDCANCEL)
{
//TODO:
在此放置处理何时用“取消”来关闭
//对话框的代码
}
//由于对话框已关闭,所以将返回FALSE以便退出应用程序,
//而不是启动应用程序的消息泵。
returnFALSE;
}
4.MFCEnterDlg.cpp
//MFCEnterDlg.cpp:
实现文件
//
#include"stdafx.h"
#include"MFCEnter.h"
#include"MFCEnterDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//用于应用程序“关于”菜单项的CAboutDlg对话框
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//对话框数据
enum{IDD=IDD_ABOUTBOX};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持
//实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
END_MESSAGE_MAP()
//CMFCEnterDlg对话框
CMFCEnterDlg:
:
CMFCEnterDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMFCEnterDlg:
:
IDD,pParent)
{
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCMFCEnterDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
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,&CMFCEnterDlg:
:
OnBnClickedEnter)
ON_BN_CLICKED(IDC_GETDLL_PATH,&CMFCEnterDlg:
:
OnBnClickedGetdllPath)
ON_BN_CLICKED(IDC_UNIST,&CMFCEnterDlg:
:
OnBnClickedUnist)
ON_BN_CLICKED(IDC_OPENPROCESS,&CMFCEnterDlg:
:
OnBnClickedOpenprocess)
//ON_NOTIFY(HDN_ITEMDBLCLICK,0,&CMFCEnterDlg:
:
OnHdnItemdblclickListProcess)
//ON_NOTIFY(LVN_COLUMNCLICK,IDC_LIST_PROCESS,&CMFCEnterDlg:
:
OnLvnColumnclickListProcess)
ON_NOTIFY(NM_CLICK,IDC_LIST_PROCESS,&CMFCEnterDlg:
:
OnNMClickListProcess)
ON_NOTIFY(NM_DBLCLK,IDC_LIST_PROCESS,&CMFCEnterDlg:
:
OnNMDblclkListProcess)
END_MESSAGE_MAP()
//CMFCEnterDlg消息处理程序
BOOLCMFCEnterDlg:
:
OnInitDialog()
{
CDialog:
:
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);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动
//执行此操作
SetIcon(m_hIcon,TRUE);//设置大图标
SetIcon(m_hIcon,FALSE);//设置小图标
//TODO:
在此添加额外的初始化代码
InitList();
returnTRUE;//除非将焦点设置到控件,否则返回TRUE
}
voidCMFCEnterDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//如果向对话框添加最小化按钮,则需要下面的代码
//来绘制该图标。
对于使用文档/视图模型的MFC应用程序,
//这将由框架自动完成。
voidCMFCEnterDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND,reinterpret_cast
//使图标在工作矩形中居中
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);
}
else
{
CDialog:
:
OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSORCMFCEnterDlg:
:
OnQueryDragIcon()
{
returnstatic_cast
}
voidCMFCEnterDlg:
:
OnBnClickedEnter()
{
//TODO:
在此添加控件通知处理程序代码
//获得目标进程句柄
//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)
{
MessageBox(_T("进程句柄获取失败~!
"));
return;
}
//获得线程函数(LoadLibrary)的地址
//1.得到kernel32.dll的句柄
hDll=GetModuleHandle(_T("Kernel32.dll"));
if(NULL==hDll)
{
CloseHandle(hProcess);
MessageBox(_T("获得线程函数句柄失败~!
"));
return;
}
//2.通过句柄获得函数的地址
#ifdef_UNICODE
LPTHREAD_START_ROUTINEfarProc=(LPTHREAD_START_ROUTINE)GetProcAddress(hDll,"LoadLibraryW");
#else
LPTHREAD_START_ROUTINEfarProc=GetProcAddress(hDll,"LoadLibraryA");
#endif
if(NULL==farProc)
{
CloseHandle(hProcess);
MessageBox(_T("获取进程函数失败~!
"));
return;
}
//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);
CloseHandle(hProcess);
MessageBox(_T("写入失败~!
"));
}
//执行远程线程
hRemoteThread=CreateRemoteThread(hProcess,NULL,0,farProc,lpStart,0,NULL);
if(NULL==hRemoteThread)
{
i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自动 内存 驻留 程序 要点