以下转载至本人QQ空间。如有雷同,纯属巧合。
连连看有很多种,比如网页的连连看、水晶连连看等,对于不同的连连看需要量身订做外挂。
下面看一下效果图,你自然知道是哪款游戏的连连看。
一、参考资料
郁金香老师的VC外挂教程的初级篇——前4、5课的视频教程可以免费观看,后面要收费,但是可以下到源代码,既然源代码都有了,对于一个程序员来说,一切就变得简单了。
http://www.yjxsoft.net/VC++jc.html
二、编写原因
既然人家都有了源代码,为什么我还要自己编写一个呢?原因如下:
1、郁金香老师也是教大家通过读取内存的方式来查找连连看方块阵列的基址,因此存在游戏版本及操作系统的问题。郁金香当时连连看的版本的基址和现在连连看的基址已经不是同一个,因此他的游戏源代码已经不能适用。需要从新通过CE(Cheat Engine)查找,方法正好在郁金香视频教程免费的那部分里面可以看到。
2、只要改一下郁金香老师里面的那个基址就可以了,但是他写的那个外挂,太霸道了,还能自动挂机,自动开始,见到连连看就秒杀,太过于“血腥”。
3、他的外挂不好的地方在于需要点击外挂窗口上“秒杀”按钮,我改了一下,通过RegisterHotKey的方式申请了windows系统热键,可以使用快捷键方式,按一下快捷键就根据算法消掉一组,一直按着不放就会一直消掉,相当于秒杀的效果,这样还可以玩一下再按一下让人感觉不到外挂的存在。
三、实现方法
1. 快捷键使用(HotKey注册方法)
1)建立MFC基于对话框的工程,创建OnCreate和OnDestroy事件函数
2)在OnCreate中或者OnInitDialog中添加以下代码
RegisterHotKey(m_hWnd,1101,0, VK_F11); //注册申请F11
RegisterHotKey(m_hWnd,1102,0, VK_F10); //注册申请F10
//以上1101和1102是自己定义的,但是不能与MFC系统产生的控件相同,否则可能出错。
3)在OnDestroy中取消热键,退出程序就会中止快捷键
UnregisterHotKey( m_hWnd, 1101);
UnregisterHotKey( m_hWnd, 1102);
4)在h头文件的类里面创建热键回调函数
LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
5)在cpp的消息映射中添加ON_MESSAGE(WM_HOTKEY,OnHotKey),这是MFC的消息机制
BEGIN_MESSAGE_MAP(CGameLLKDlg, CDialog)
//{{AFX_MSG_MAP(CGameLLKDlg)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_HOTKEY,OnHotKey)
END_MESSAGE_MAP()
6)创建OnHotKey函数,在该函数中完成外挂代码
2.主代码
LRESULT CGameLLKDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
POINT p;
bEnableDebugPriv(); //提升权限
hwnd = ::FindWindow(NULL, "QQ游戏 - 连连看角色版"); //这个是VC6.0的调用方法
DWORD hProcessId;
byte chessdata[11][19];
RECT r1;
::GetWindowThreadProcessId(hwnd, &hProcessId); //得到窗口进程
::GetWindowRect(hwnd,&r1); //得到窗口大小
HANDLE processH = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, hProcessId); //打开进程
DWORD byread;
LPCVOID pbase=(LPCVOID)0x0012A444; //XP下棋盘数据基址
if(wParam == 1102) //判断是否是Win7
{
pbase=(LPCVOID)0x0012A480;; //Win7下棋盘数据基址
}
LPVOID nbuffer=(LPVOID)&chessdata; //存放棋盘数据
::ReadProcessMemory(processH,pbase,nbuffer,11*19,&byread);
ClearPiar(); //这个函数是郁金香老师教程里面的代码,作用是消除其中一对方块
::CloseHandle(processH);
return 0;
}
3. 权限提升函数bEnableDebugPriv();
bool CGameLLKDlg::bEnableDebugPriv()
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
return false;
}
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) {
CloseHandle(hToken);
return false;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) {
CloseHandle(hToken);
return false;
}
return true;
}
4. ClearPair函数,这个函数是消除方块的算法函数,这里就不引用了,郁金香老师的教程里面有,也可以自己写。就是将数组里面相等而且满足界面上折两下以内能达到的方格清除。
四、操作及外挂缺陷
1. 在XP下每按F11一次可消掉一对方格,在win7下需要按F10,这个是由申请的系统热键及代码判断决定的
2. 可在OnInitDialog里面加上ShowWindow(SW_MINIMIZE)实现开机最小化
3.由于是读内存,因此跟之前的扫雷外挂一样,根据该游戏的版本及操作系统而决定内存的基址,因此只要游戏开发厂商一旦更改软件版本就很有可能造成该外挂无法使用,呵呵...对于我而言也就是用CE再找一次而已,总之,没有能够实现万能就是它的缺陷、
4.游戏全局内存分配还与操作系统有关,本外挂仅支持32位下的XP和Win7两个系统,其它的也得从新找基址,只要找到改一下基址就OK。