诛仙之老婆不挂
女朋友玩诛仙游戏,老是不注意看血,给她买了大红,每天总要挂那么几次。于是DIY了个程序,专门监视血量,自动补血。
考虑一共要用到
1、找到游戏窗体;
2、读取内存;
3、键盘消息
这些.NET实现起来没VC++方便,所以用VC++开发了。不过一直搞ASP.NET开发,对VC不是很在行,开发起来还是很费力气的。
首先,用CE搞出了诛仙血量的一级基址(008F77D4,注:2007年6月16号), 偏移量 28 和 254。
然后要定时检测。在OnOK() 事件写入
接下来注册OnTimer事件
这里用到的GetValue();函数是取内存血量的
OK,这就读取到内存中诛仙的血量了。
OK,这样就搞定了,量身定制的不死外挂,除非被秒,哈哈。
2007年6月16日
考虑一共要用到
1、找到游戏窗体;
2、读取内存;
3、键盘消息
这些.NET实现起来没VC++方便,所以用VC++开发了。不过一直搞ASP.NET开发,对VC不是很在行,开发起来还是很费力气的。
首先,用CE搞出了诛仙血量的一级基址(008F77D4,注:2007年6月16号), 偏移量 28 和 254。
然后要定时检测。在OnOK() 事件写入
KillTimer(1);
SetTimer(1,500,NULL);
UpdateData(FALSE);
意思是如果重复点击了按钮事件,先去除计时器,然后再设置。时间间隔半秒。SetTimer(1,500,NULL);
UpdateData(FALSE);
接下来注册OnTimer事件
1 void CMyDlg::OnTimer(UINT nIDEvent)
2 {
3 // TODO: Add your message handler code here and/or call default
4
5 int value = GetValue();
6 if(value == -2)
7 {
8 KillTimer(1);
9 AfxMessageBox("请先运行游戏!");
10 return;
11 }
12 if(value < 350)
13 {
14 INPUT input[2];
15 input[0].type = input[1].type = INPUT_KEYBOARD;
16 input[0].ki.wVk = input[1].ki.wVk = VK_F7;
17 input[0].ki.dwFlags = 0;
18 input[1].ki.dwFlags = KEYEVENTF_KEYUP;
19 Sleep(2000);
20 BYTE b = SendInput(2, input, sizeof(INPUT));
21 }
22 }
直接锁定了血量要大于350,否则发送F7按键。使用到INPUT结构,不能不引用#include <winable.h>了。2 {
3 // TODO: Add your message handler code here and/or call default
4
5 int value = GetValue();
6 if(value == -2)
7 {
8 KillTimer(1);
9 AfxMessageBox("请先运行游戏!");
10 return;
11 }
12 if(value < 350)
13 {
14 INPUT input[2];
15 input[0].type = input[1].type = INPUT_KEYBOARD;
16 input[0].ki.wVk = input[1].ki.wVk = VK_F7;
17 input[0].ki.dwFlags = 0;
18 input[1].ki.dwFlags = KEYEVENTF_KEYUP;
19 Sleep(2000);
20 BYTE b = SendInput(2, input, sizeof(INPUT));
21 }
22 }
这里用到的GetValue();函数是取内存血量的
1 int CMyDlg::GetValue()
2 {
3 DWORD pid;
4 hWnd=::FindWindow(NULL,TEXT("Element Client"));
5 if(!hWnd)
6 {
7 return -2;
8 }
9 GetWindowThreadProcessId(hWnd,&pid);
10 HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
11
12 LPVOID lpBaseAddress=(LPVOID)0x8F77D4;
13 DWORD dwValue;
14
15 DWORD dwValue3;
16
17 DWORD dwValue5;
18
19
20 if(!::ReadProcessMemory(hProcess,lpBaseAddress,&dwValue,sizeof(DWORD),0)) return -1;
21 LPVOID dwValue2=(LPVOID)(dwValue+40);
22
23 if(!::ReadProcessMemory(hProcess,dwValue2,&dwValue3,sizeof(DWORD),0)) return -1;
24 LPVOID dwValue4=(LPVOID)(dwValue3+596);
25
26 if(!::ReadProcessMemory(hProcess,dwValue4,&dwValue5,sizeof(DWORD),0)) return -1;
27
28 return (int)dwValue5;
29 }
用FindWindow(NULL,TEXT("Element Client"));获得诛仙的句柄,加入获取不到返回-2,这也就是为什么OnTimer中得到-2会提示要启动游戏了。用到了基址0x8F77D4,偏移量要转换成10进制用来加减,28 = 40,254 = 596;2 {
3 DWORD pid;
4 hWnd=::FindWindow(NULL,TEXT("Element Client"));
5 if(!hWnd)
6 {
7 return -2;
8 }
9 GetWindowThreadProcessId(hWnd,&pid);
10 HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
11
12 LPVOID lpBaseAddress=(LPVOID)0x8F77D4;
13 DWORD dwValue;
14
15 DWORD dwValue3;
16
17 DWORD dwValue5;
18
19
20 if(!::ReadProcessMemory(hProcess,lpBaseAddress,&dwValue,sizeof(DWORD),0)) return -1;
21 LPVOID dwValue2=(LPVOID)(dwValue+40);
22
23 if(!::ReadProcessMemory(hProcess,dwValue2,&dwValue3,sizeof(DWORD),0)) return -1;
24 LPVOID dwValue4=(LPVOID)(dwValue3+596);
25
26 if(!::ReadProcessMemory(hProcess,dwValue4,&dwValue5,sizeof(DWORD),0)) return -1;
27
28 return (int)dwValue5;
29 }
OK,这就读取到内存中诛仙的血量了。
OK,这样就搞定了,量身定制的不死外挂,除非被秒,哈哈。
2007年6月16日