2020年11月4日,大学开学一个月了吧
这所大学 学的c语言(说实话已经好几年没用了忘得差不多了,这几天都在重现学起)
总代码在最下边
准备详细介绍下昨天(c++)做的水果忍者修改器(新手完全听得懂)
一.首先用CE进行简单的 准确搜索 对应的能直接搜到水果的基址
毕竟是讲C的 多余的CE就不说了
二.既然找到准确地址,那就直接上C语言
用C++写修改器主要方式是去读内存和写内存(这和修改大型游戏差不多的),C语言读写内存需要用到下边这两个函数
-
ReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead);
-
WriteProcessMemory(HANDLE hProcess,LPVOID lpBaseAddress,LPVOID lpBuffer,DWORD nSize,LPDWORD lpNumberOfBytesWritten);
而这两个函数都需要传入一个共同的参数 HANDLE 类型的一个数据(你可以把他当做一个许可证,只有这个许可证才能进行读写函数)
而要获取这个游戏(水果忍者)许可证 需要计算机找到 这个游戏的PID,而PID可以通过句柄来获得,因此我们的思路
句柄-->PID-->许可-->然后修改游戏
1.获取句柄
在C语言中获取句柄的函数为
FindWindow( LPCSTR lpClassName, LPCSTR lpWindowName );
具体写法为
-
HWND
hWnd;
-
hWnd=
FindWindow(NULL,“这里填游戏名”);
定义一个HWND类型的 hWnd来接收句柄
"这里填游戏名" 在c++填为 "Fruit Ninja"(水果忍者的进程名),然后获取的句柄就被存储到hWnd变量中了
2.获取进程PID
获取PID的函数为
GetWindowThreadProcessId();
在这里具体写成
-
DWORD PID;
-
GetWindowThreadProcessId(hWnd,&PID);
定义一个DWORD类型的变量存放PID,GetWindowThreadProcessId()的第一个参数将第一步获取的句柄传入,然后返回本进程的PID,咱们在参数二处<&PID>接收。
3.获取许可
获取许可的写法为
-
HANDLE lsProcess=
0;
-
lsProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
PROCESS_ALL_ACCESS的意思是获取全部许可,参数二填上一步获取到的PID
同样lsProcess存放许可
三.修改游戏
修改游戏对应的就是这两个函数
-
ReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead);
-
WriteProcessMemory(HANDLE hProcess,LPVOID lpBaseAddress,LPVOID lpBuffer,DWORD nSize,LPDWORD lpNumberOfBytesWritten);
-
#include <iostream>
-
#include <windows.h>//需要引用这个头文件
-
DWORD s;
//这个用来存放读取当前的分数
-
DWORD dizhi=
0x0BF308C;
//这个写游戏对应的分数地址
-
//FruitNinja.exe+1B308C
-
do{
-
ReadProcessMemory(lsProcess, (LPVOID)dizhi, &s,
4,
NULL);
-
//参数一 填许可 参数二填地址 参数三存放的位置
-
-
printf(
"当前水果数量:");
-
cout<<s<<
endl;
-
Sleep(
300);
//程序延迟300ms
-
system(
"cls");
//清空控制台
-
}
while(TRUE);
我想一直让他达到一个动态的读取效果,所以做了个死循环一直来读取分数然后打印到控制台
认真查看上方函数的注释,相信你能看得懂
运行效果为下图
上边展示的为读取分数,当然我们要做的是修改分数,直接上代码
-
-
DWORD ss=
999;
//这里填你要改的分数
-
WriteProcessMemory(lsProcess,(LPVOID)dizhi,&ss,
4,
NULL);
-
//参数一填许可 参数二填地址 参数三填要修改的值
因为上了大学嘛,时间变得很充裕,后续会更新更多
望新手多多关注,互相学习
如果有关上边切水果的案例有疑问直接在本平台私信我即可
-
#include <iostream>
-
#include <windows.h>
-
using
namespace
std;
-
-
HWND hq_HWND(char ming[]){
//获取句柄 传入进程名(不加exe)传出HWND (失败返回0)
-
//cout<<ming<<endl;
-
HWND hWnd=FindWindow(
NULL,ming);
-
return hWnd;
-
}
-
-
DWORD hq_PID(HWND hWnd){
//传入句柄 传出pid(失败传出0)
-
DWORD PID;
-
GetWindowThreadProcessId(hWnd,&PID);
-
return PID;
-
}
-
-
HANDLE hq_Process(DWORD PID){
//获取一个许可 返回许可 传入 PID
-
HANDLE lsProcess=
0;
-
lsProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
-
return lsProcess;
-
}
-
-
-
int main(int argc, char** argv) {
-
//cout<<hq_HWND("Tutorial-i386")<<endl; //用于获取句柄
-
//cout<<hq_PID(hq_HWND("Tutorial-i386"))<<endl;//用于获取PID
-
-
-
HANDLE lsProcess;
-
lsProcess=hq_Process(hq_PID(hq_HWND(
"Fruit Ninja")));
-
-
DWORD ss=
999;
-
DWORD dizhi=
0x0BF308C;
-
//FruitNinja.exe+1B308C
-
DWORD s;
-
-
do{
-
ReadProcessMemory(lsProcess, (LPVOID)dizhi, &s,
4,
NULL);
-
printf(
"当前水果数量:");
-
cout<<s<<
endl;
-
Sleep(
300);
-
system(
"cls");
-
}
while(TRUE);
-
-
//WriteProcessMemory(lsProcess,(LPVOID)dizhi,&ss,4,NULL);
-
-
-
return
0;
-
}
-
转载:https://blog.csdn.net/O8088/article/details/109499360