1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
using
System;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
namespace
PlantsVsZombiesTool
{
/// <summary>
///
/// </summary>
public
partial
class
Form1 : Form
{
public
Form1()
{
InitializeComponent();
}
private
void
Form1_Load(
object
sender, EventArgs e)
{
}
//启动无线阳光
private
void
btnGet_Click(
object
sender, EventArgs e)
{
if
(Helper.GetPidByProcessName(processName) == 0)
{
MessageBox.Show(
"哥们启用之前游戏总该运行吧!"
);
return
;
}
if
(btnGet.Text ==
"启用-阳光无限"
)
{
timer1.Enabled =
true
;
btnGet.Text =
"关闭-阳光无限"
;
}
else
{
timer1.Enabled =
false
;
btnGet.Text =
"启用-阳光无限"
;
}
}
private
void
timer1_Tick(
object
sender, EventArgs e)
{
if
(Helper.GetPidByProcessName(processName) == 0)
{
timer1.Enabled =
false
;
btnGet.Text =
"启用-阳光无限"
;
}
int
address = ReadMemoryValue(baseAddress);
//读取基址(该地址不会改变)
address = address + 0x768;
//获取2级地址
address = ReadMemoryValue(address);
address = address + 0x5560;
//获取存放阳光数值的地址
WriteMemory(address, 0x1869F);
//写入数据到地址(0x1869F表示99999)
timer1.Interval = 1000;
}
//启动无线金钱
private
void
btnMoney_Click(
object
sender, EventArgs e)
{
if
(Helper.GetPidByProcessName(processName) == 0)
{
MessageBox.Show(
"哥们启用之前游戏总该运行吧!"
);
return
;
}
if
(btnMoney.Text ==
"启用-金钱无限"
)
{
timer2.Enabled =
true
;
btnMoney.Text =
"关闭-金钱无限"
;
}
else
{
timer2.Enabled =
false
;
btnMoney.Text =
"启用-金钱无限"
;
}
}
private
void
timer2_Tick(
object
sender, EventArgs e)
{
if
(Helper.GetPidByProcessName(processName) == 0)
{
timer2.Enabled =
false
;
btnMoney.Text =
"启用-金钱无限"
;
}
int
address = ReadMemoryValue(baseAddress);
//读取基址(该地址不会改变)
address = address + 0x82C;
//获取2级地址
address = ReadMemoryValue(address);
address = address + 0x28;
//得到金钱地址
WriteMemory(address, 0x1869F);
//写入数据到地址(0x1869F表示99999)
timer2.Interval = 1000;
}
private
void
btnGo_Click(
object
sender, EventArgs e)
{
if
(Helper.GetPidByProcessName(processName) == 0)
{
MessageBox.Show(
"哥们启用之前游戏总该运行吧!"
);
return
;
}
int
address = ReadMemoryValue(baseAddress);
//读取基址(该地址不会改变)
address = address + 0x82C;
//获取2级地址
address = ReadMemoryValue(address);
address = address + 0x24;
int
lev = 1;
try
{
lev =
int
.Parse(txtLev.Text.Trim());
}
catch
{
MessageBox.Show(
"输入的关卡格式不真确!默认设置为1"
);
}
WriteMemory(address, lev);
}
//读取制定内存中的值
public
int
ReadMemoryValue(
int
baseAdd)
{
return
Helper.ReadMemoryValue(baseAdd, processName);
}
//将值写入指定内存中
public
void
WriteMemory(
int
baseAdd,
int
value)
{
Helper.WriteMemoryValue(baseAdd, processName, value);
}
private
int
baseAddress = 0x006A9EC0;
//游戏内存基址
private
string
processName =
"PlantsVsZombies"
;
//游戏进程名字
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
using
System;
using
System.Text;
using
System.Diagnostics;
using
System.Runtime.InteropServices;
namespace
PlantsVsZombiesTool
{
public
abstract
class
Helper
{
[DllImportAttribute(
"kernel32.dll"
, EntryPoint =
"ReadProcessMemory"
)]
public
static
extern
bool
ReadProcessMemory
(
IntPtr hProcess,
IntPtr lpBaseAddress,
IntPtr lpBuffer,
int
nSize,
IntPtr lpNumberOfBytesRead
);
[DllImportAttribute(
"kernel32.dll"
, EntryPoint =
"OpenProcess"
)]
public
static
extern
IntPtr OpenProcess
(
int
dwDesiredAccess,
bool
bInheritHandle,
int
dwProcessId
);
[DllImport(
"kernel32.dll"
)]
private
static
extern
void
CloseHandle
(
IntPtr hObject
);
//写内存
[DllImportAttribute(
"kernel32.dll"
, EntryPoint =
"WriteProcessMemory"
)]
public
static
extern
bool
WriteProcessMemory
(
IntPtr hProcess,
IntPtr lpBaseAddress,
int
[] lpBuffer,
int
nSize,
IntPtr lpNumberOfBytesWritten
);
//获取窗体的进程标识ID
public
static
int
GetPid(
string
windowTitle)
{
int
rs = 0;
Process[] arrayProcess = Process.GetProcesses();
foreach
(Process p
in
arrayProcess)
{
if
(p.MainWindowTitle.IndexOf(windowTitle) != -1)
{
rs = p.Id;
break
;
}
}
return
rs;
}
//根据进程名获取PID
public
static
int
GetPidByProcessName(
string
processName)
{
Process[] arrayProcess = Process.GetProcessesByName(processName);
foreach
(Process p
in
arrayProcess)
{
return
p.Id;
}
return
0;
}
//根据窗体标题查找窗口句柄(支持模糊匹配)
public
static
IntPtr FindWindow(
string
title)
{
Process[] ps = Process.GetProcesses();
foreach
(Process p
in
ps)
{
if
(p.MainWindowTitle.IndexOf(title) != -1)
{
return
p.MainWindowHandle;
}
}
return
IntPtr.Zero;
}
//读取内存中的值
public
static
int
ReadMemoryValue(
int
baseAddress,
string
processName)
{
try
{
byte
[] buffer =
new
byte
[4];
IntPtr byteAddress = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0);
//获取缓冲区地址
IntPtr hProcess = OpenProcess(0x1F0FFF,
false
, GetPidByProcessName(processName));
ReadProcessMemory(hProcess, (IntPtr)baseAddress, byteAddress, 4, IntPtr.Zero);
//将制定内存中的值读入缓冲区
CloseHandle(hProcess);
return
Marshal.ReadInt32(byteAddress);
}
catch
{
return
0;
}
}
//将值写入指定内存地址中
public
static
void
WriteMemoryValue(
int
baseAddress,
string
processName,
int
value)
{
IntPtr hProcess = OpenProcess(0x1F0FFF,
false
, GetPidByProcessName(processName));
//0x1F0FFF 最高权限
WriteProcessMemory(hProcess, (IntPtr)baseAddress,
new
int
[] { value }, 4, IntPtr.Zero);
CloseHandle(hProcess);
}
}
}
|