如何用c语言制作 植物大战僵尸阳光修改器
2.参数
a.dwDesiredAccess:想拥有的该进程访问权限
PROCESS_ALL_ACCESS //所有能获得的权限
PROCESS_CREATE_PROCESS //需要创建一个进程
PROCESS_CREATE_THREAD //需要创建一个线程
PROCESS_DUP_HANDLE //重复使用DuplicateHandle句柄
PROCESS_QUERY_INFORMATION //获得进程信息的权限,如它的退出代码、优先级
PROCESS_QUERY_LIMITED_INFORMATION /*获得某些信息的权限,如果获得了PROCESS_QUERY_INFORMATION,也拥有PROCESS_QUERY_LIMITED_INFORMATION权限*/
PROCESS_SET_INFORMATION //设置某些信息的权限,如进程优先级
PROCESS_SET_QUOTA //设置内存限制的权限,使用SetProcessWorkingSetSize
PROCESS_SUSPEND_RESUME //暂停或恢复进程的权限
PROCESS_TERMINATE //终止一个进程的权限,使用TerminateProcess
PROCESS_VM_OPERATION //操作进程内存空间的权限(可用VirtualProtectEx和WriteProcessMemory)
PROCESS_VM_READ //读取进程内存空间的权限,可使用ReadProcessMemory
PROCESS_VM_WRITE //读取进程内存空间的权限,可使用WriteProcessMemory
SYNCHRONIZE //等待进程终止
b.bInheritHandle:表示所得到的进程句柄是否可以被继承
c.dwProcessId:被打开进程的PID
3.返回类型
===================================
BOOL ReadProcessMemory(HANDLE hProcess,PVOID pvAddressRemote,PVOIDpvBufferLocal, DWORD dwSize, PDWORDpdwNumBytesRead);------------------------------------------------------------------------------------------------------------------------------------------
3.如何用CE找游戏基值
https://www.cnblogs.com/gd-luojialin/p/7789569.html
4-----------------------------------------------------------------------------------------------------------------------------------------
外挂c语言源码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
int main(void)
{
//1.查找植物大战僵尸这个游戏窗口,工具,Spy++
HWND hwnd = FindWindow(L"MainWindow", L"植物大战僵尸中文版");
if (hwnd == NULL)
{
printf("植物大战僵尸僵尸没有运行,请先运行游戏\n");
}
//2.根据窗口句柄获取进程IP
//unsigned long => DWORD
DWORD dwPID = 0;
GetWindowThreadProcessId(hwnd, &dwPID);
if (dwPID == 0)
{
printf("获取进程PID失败,错误代码:%d\n", GetLastError());
return 0;
}
//3.根据PID获取进程句柄
HANDLE hProcess = OpenProcess(
PROCESS_ALL_ACCESS, //进程访问权限
FALSE, //是否可以被继承
dwPID //被打开进程的PID
);
if (NULL == hProcess)
{
printf("打开进程失败,错误代码:%d\n", GetLastError());
}
//4.获取静态地址
DWORD dwSunshineBaseAddress = 0x006A9EC0;
DWORD dwSunshineAddressValue = 0;
DWORD dwSize = 0;
if (false == ReadProcessMemory(hProcess, (void*)dwSunshineBaseAddress, &dwSunshineAddressValue
, sizeof(DWORD), &dwSize))
{
printf("获取静态地址失败,错误代码:%d\n", GetLastError());
return 0;
}
printf("0x%x\n", dwSunshineAddressValue);
//5.一级偏移
DWORD dwSunshineOffsetFirst = 0x768;
DWORD dwSunshineOffsetFirstValue = 0;
if (false == ReadProcessMemory(
hProcess, (void*)(dwSunshineAddressValue + dwSunshineOffsetFirst),
&dwSunshineOffsetFirstValue,
sizeof(DWORD),
&dwSize
))
{
printf("获取一级偏移地址失败,错误代码:%d\n", GetLastError());
return 0;
}
printf("0x%x\n", dwSunshineOffsetFirstValue);
//6.二级偏移获取阳光值
DWORD dwSunshineOffsetSecond = 0x5560;
DWORD dwSunshineNum = 0;
if (false == ReadProcessMemory
(hProcess,
(void*)(dwSunshineOffsetFirstValue + dwSunshineOffsetSecond),
&dwSunshineNum,
sizeof(DWORD),
&dwSize
))
{
printf("获取阳光值失败,错误代码:%d\n", GetLastError());
return 0;
}
printf("阳光值为:%d\n", dwSunshineNum);
//7.修改阳光值
//1)输入修改值
printf("请输入阳光值:");
int xxx;
scanf("%d", &xxx);
//修改阳光值仿函数
if (false == WriteProcessMemory
(hProcess,
(void*)(dwSunshineOffsetFirstValue + dwSunshineOffsetSecond),
&xxx,
sizeof(DWORD),
&dwSize
))
{
printf("修改阳光值失败,错误代码为:%d\n", GetLastError());
return 0;
}
system("pause");
return 0;
}

浙公网安备 33010602011771号