#pragma once
#include "atltypes.h"
// CGameModifyDlg 新建一个单文档对话框无菜单的项目。
/*mfc模拟按键打开桌面的qq登陆器输入账号密码然后登陆,本来想后台发送双击消息给桌面句柄,但是老是失败。至今不知道怎么后台点击qq,只实现了mouse_event前台点击。谁知道的话可以教教我谢了。如果运行程序时候就开着qq,qq登陆器和你的qq的类名和标题都一样,代码识别出哪个窗口是qq登陆器。还能查看qq游戏连连看剩余方块 修改内存属性禁止读取。本人邮箱liveforrevenge@qq.com附件源码下载地址<a target=_blank href="http://download.csdn.net/detail/u012786754/7446799">http://download.csdn.net/detail/u012786754/7446799</a>
CGameModifyDlg : public CDialogEx
{
// 构造
public:
CGameModifyDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_GAMEMODIFY_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CString m_Block;
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton2();
CString m_ModProperty;
CString m_Property;
afx_msg void OnBnClickedButton3();
private:
DWORD block_addr;
DWORD pID;
HWND cwndHandle;
DWORD gameProperty;
HANDLE pHandle;
public:
afx_msg void OnBnClickedButton4();
private:
POINT pt;
public:
afx_msg void OnBnClickedButton5();
private:
CRect rect;
HWND hwndLv;
public:
VOID RepeatKeyBd(INT repeatCount)
{
do
{
//Sleep(500);
keybd_event(9,0,0,0);
Sleep(200);
keybd_event(9,0,KEYEVENTF_KEYUP,0);
Sleep(200);
} while (--repeatCount !=0);
}
HWND FindWithClassName(HWND ParentWnd, CONST PTCHAR FindClassName);
BOOL IncludeWindow(HWND parentHwnd,PTCHAR className,PTCHAR wndName)
{
HWND hw = ::FindWindowEx(parentHwnd,0,className,wndName);
if(!hw)
return FALSE;
else
return TRUE;
}
VOID EnterAcountOrPassword(PCHAR ap);
};
#include "stdafx.h"
#include "GameModify.h"
#include "GameModifyDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define AccountStr "1234567"//qq账号
#define PasswordStr "1234567"//qq密码
// CGameModifyDlg 对话框
CGameModifyDlg::CGameModifyDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CGameModifyDlg::IDD, pParent)
, block_addr(0)
, pID(0)
, gameProperty(0)
{
pt.x = pt.y = NULL;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_ModProperty = _T("");
m_Property = _T("");
}
void CGameModifyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_Block);
DDX_Text(pDX, IDC_EDIT2, m_ModProperty);
DDX_Text(pDX, IDC_EDIT3, m_Property);
}
BEGIN_MESSAGE_MAP(CGameModifyDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CGameModifyDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CGameModifyDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CGameModifyDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CGameModifyDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON5, &CGameModifyDlg::OnBnClickedButton5)
END_MESSAGE_MAP()
// CGameModifyDlg 消息处理程序
BOOL CGameModifyDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CGameModifyDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(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
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CGameModifyDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CGameModifyDlg::OnBnClickedButton1()
{
// TODO:
UpdateData(TRUE);
//const char *temp_Block = m_Block.GetBuffer(sizeof(m_Block));
DWORD dw_block = _wtoi(m_Block);
block_addr = 0x114E18;
DWORD sizeOfWrite;
cwndHandle = ::FindWindow(L"#32770",L"QQ游戏 - 连连看角色版");
::GetWindowThreadProcessId(cwndHandle,&pID);
pHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pID);
if(!WriteProcessMemory(pHandle,(LPVOID)block_addr,(LPCVOID)&dw_block,sizeof(dw_block),&sizeOfWrite))
{
AfxMessageBox(L"写入失败!");
printf("WriteProcessMemory failed:%d\n",GetLastError());
}
}
void CGameModifyDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
MEMORY_BASIC_INFORMATION mbi;
size_t size = VirtualQueryEx(pHandle,(LPCVOID)block_addr,&mbi,sizeof(MEMORY_BASIC_INFORMATION));
gameProperty = (DWORD)_wtoi(m_ModProperty);
ASSERT(size == sizeof(MEMORY_BASIC_INFORMATION));
if(mbi.Protect == gameProperty)
return;
DWORD oldProper;
if(!VirtualProtectEx(pHandle,(LPVOID)block_addr,4,(DWORD)_wtol(m_ModProperty),&oldProper))
{
AfxMessageBox(L"修改属性出错!");
}
}
void CGameModifyDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
str.Format(L"%ld",gameProperty);
m_Property = str;
UpdateData(FALSE);
}
void CGameModifyDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
HWND hProgMan = ::FindWindow(L"ProgMan", NULL);
if(hProgMan)
{
HWND hShellDefView = ::FindWindowEx(hProgMan, NULL, L"SHELLDLL_DefView", NULL);
if(hShellDefView)
hwndLv = ::FindWindowEx(hShellDefView, NULL, L"SysListView32", NULL);
}
int iMaxCount=ListView_GetItemCount(hwndLv);//图标数
_tprintf(TEXT("%d Items hwnd:%d/r/n"),iMaxCount,hwndLv);
DWORD dwPid;
GetWindowThreadProcessId(hwndLv,&dwPid);//获取进程ID
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,dwPid);//打开进程
if (hProcess==INVALID_HANDLE_VALUE)
{
_tprintf(TEXT("Error Open Process"));//打开进程失败
return ;
}
LVITEM *plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM),
MEM_COMMIT, PAGE_READWRITE);//在目标进程内分配一块小内存
TCHAR *pszName=(TCHAR*)VirtualAllocEx(hProcess, NULL, MAX_PATH*sizeof(TCHAR),
MEM_COMMIT, PAGE_READWRITE);//分配名字
POINT *ppt=(POINT*)VirtualAllocEx(hProcess, NULL, sizeof(POINT),
MEM_COMMIT, PAGE_READWRITE);//获取坐标用
RECT* pItemRc=(RECT*)VirtualAllocEx(hProcess,NULL,sizeof(RECT),MEM_COMMIT,PAGE_READWRITE);
for (int i=0;i<iMaxCount;i++)
{
TCHAR szName[MAX_PATH];
// ListView_GetItemText(hwndLv, i, 0, szName,sizeof(szName));//获取图标名称
LVITEM lv={0};
lv.cchTextMax=MAX_PATH*sizeof(TCHAR);
lv.pszText=pszName;
WriteProcessMemory(hProcess,plvitem,&lv,sizeof(LVITEM),NULL);//吧信息写入
::SendMessage(hwndLv,LVM_GETITEMTEXT,i,(LPARAM)plvitem);//发送消息
ReadProcessMemory(hProcess,pszName,szName,sizeof(szName),NULL);//读取名字
if(!_tcscmp(szName,L"腾讯QQ"))
{
// ListView_GetItemPosition(hwndLv, i, &pt);//获取图标所在坐标
::SendMessage(hwndLv,LVM_GETITEMPOSITION,i,(LPARAM)ppt);
ReadProcessMemory(hProcess,ppt,&pt,sizeof(POINT),NULL);//读取图标坐标
_tprintf(TEXT("%4d,%-4d %s/r/n"),pt.x,pt.y,szName);
::SendMessage (hwndLv,LVM_GETITEMRECT,i,(LPARAM)pItemRc);
ReadProcessMemory(hProcess,pItemRc,&rect,sizeof(RECT),NULL);
}
}
VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);//释放内存 打扫战场
VirtualFreeEx(hProcess, pszName, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, ppt, 0, MEM_RELEASE);
CloseHandle(hProcess);
if(pt.x == NULL && pt.y == NULL)
{
SetDlgItemText(IDC_STATICPT,L"未找到坐标");
return;
}
CString str;
str.Format(L"x坐标为:%d y坐标为%d",pt.x,pt.y);
SetDlgItemText(IDC_STATICPT,str);
/* CDC *dc = GetDlgItem(IDC_STATICPT)->GetDC();
CSize sz = dc->GetTextExtent(str);
CRect cr;
GetDlgItem(IDC_STATICPT)->GetWindowRect(&cr);
ScreenToClient(&cr);
GetDlgItem(IDC_STATICPT)->SetWindowPos(GetParent(),cr.left,cr.right,sz.cx,sz.cy,SWP_NOMOVE);
GetDlgItem(IDC_STATICPT)->ReleaseDC(dc); */
}
void CGameModifyDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
INT x = GetSystemMetrics(SM_CXSCREEN);
INT y = GetSystemMetrics(SM_CYSCREEN);
DWORD px = (pt.x+rect.Width()/4);
DWORD py = (pt.y+rect.Height()/4);
Sleep(200);
::SetCursorPos(px,py);
Sleep(200);
::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
Sleep(200);
::mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
Sleep(200);
::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
Sleep(200);
::mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
Sleep(2000);
/*LRESULT result = ::SendMessage(0x100F8,WM_LBUTTONDBLCLK,MK_LBUTTON,MAKELPARAM(px,py));
Sleep(2000);*///不知道为什么这个不管用,谁知道怎么后台发送双击到桌面指定位置请留言或者密我
HWND desk = ::GetDesktopWindow();
HWND qqLand = FindWithClassName(desk,L"TXGuiFoundation");
if(!qqLand)
{
AfxMessageBox(L"查找qq登录窗口出错");
return;
}
//DWORD qqLandThreadId = GetWindowThreadProcessId(qqLand,NULL);
//AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(),NULL), qqLandThreadId,TRUE);
::SetForegroundWindow(qqLand);
::SetFocus(qqLand);
//AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(),NULL), GetCurrentThreadId(),FALSE);
//RepeatKeyBd(12);
EnterAcountOrPassword(AccountStr);
RepeatKeyBd(1);
EnterAcountOrPassword(PasswordStr);
RepeatKeyBd(6);
Sleep(200);
keybd_event(VK_RETURN,0,0,0);
Sleep(200);
keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
Sleep(200);
}
HWND CGameModifyDlg::FindWithClassName(HWND ParentWnd, CONST PTCHAR FindClassName)
{
HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);
TCHAR ClassName[100];
for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
{
::GetClassName(hChild,ClassName,sizeof(ClassName)/sizeof(TCHAR));
if (_tcscmp(ClassName,FindClassName)==0)
{
if(::IsWindowVisible(hChild))
{
if(IncludeWindow(hChild,L"Edit",L"QQEdit"))
return hChild;
}
}
HWND FindWnd=FindWithClassName(hChild,FindClassName);
if (FindWnd)
return FindWnd;
}
return NULL;
}
VOID CGameModifyDlg::EnterAcountOrPassword(PCHAR ap)
{
INT count = strlen(ap);
CHAR ch;
BYTE bt;
for (INT i = 0;i<count;i++)
{
ch = ap[i];
if(!isdigit(ch))
{
bt = (BYTE)(65+ch-'a');
Sleep(100);
keybd_event(bt,0,0,0);
Sleep(200);
keybd_event(bt,0,KEYEVENTF_KEYUP,0);
Sleep(200);
}
else
{
bt = (BYTE)(96+ch-'0');
Sleep(100);
keybd_event(bt,0,0,0);
Sleep(200);
keybd_event(bt,0,KEYEVENTF_KEYUP,0);
Sleep(200);
}
}
}