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://www.uj5u.com/houduan/222931.html
標籤:java
上一篇:用 Python 實作掃雷小游戲
