如何用c语言制作 植物大战僵尸阳光修改器

-------------------------------------------------------------------------------------------------------------------------
1.工具:vs2017,Spy++,Cheat Engine 7.0
 
--------------------------------------------------------------------------------------------------------------------------
2.API:
 
方法名称:OpenProcess
位置:Kernel32.dll
OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。
1.函数原型
HANDLE OpenProcess(
DWORD dwDesiredAccess, 
BOOL bInheritHandle, 
DWORD dwProcessId
);
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.返回类型

 

===================================

ReadProcessMemory是一个内存操作函数, 其作用为根据进程句柄读入该进程的某个内存空间;函数原型为BOOL ReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead); 由布尔声明可以看出, 当函数读取成功时返回1, 失败则返回0, 具体参数含义将在下文中指出。 
 
ReadProcessMemory
BOOL ReadProcessMemory(
HANDLE hProcess,
PVOID pvAddressRemote,
PVOIDpvBufferLocal, 
DWORD dwSize, 
PDWORDpdwNumBytesRead
);
实际应用
hProcess [in]远程进程句柄。 被读取者
pvAddressRemote [in]远程进程中内存地址。 从具体何处读取
pvBufferLocal [out]本地进程中内存地址. 函数将读取的内容写入此处
dwSize [in]要传送的字节数。要写入多少
pdwNumBytesRead [out]实际传送的字节数. 函数返回时报告实际写入多少

------------------------------------------------------------------------------------------------------------------------------------------

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;
}

posted @ 2020-04-24 19:41  SALTED____FISH  阅读(841)  评论(0)    收藏  举报