emmmmmmm,战役模式加上这一次用外挂打通已经是第四次了,开心(๑•̀ㅂ•́)و✧
下面给出我这次使用ce找到的金钱及冷却时间的地址:
金钱:“game.exe”+00635DB4 + 24c
建筑物冷却:
第一个建筑物:“game.exe”+00433A80 + 24
第二个建筑物:“game.exe”+00433AB0 + 24
第三个建筑物:“game.exe”+00433AE0 + 24
。。。
规律就是第一个地址+0x30
一下同理.
防御类冷却:
第一个:“game.exe”+00434914 + 24
。。。
兵类:
第一个:“game.exe”+00435748 + 24
。。。
坦克类:
第一个:“game.exe”+004365AC + 24
下面为***c++代码:
请看懂后根据自己需求修改:
#include <bits/stdc++.h> #include <iostream> #include <Windows.h> #include <Tlhelp32.h> #include <stdio.h> #include <time.h> using namespace std; void changeMoney(); void enableDebugPriv(); bool init(string gameName); int FindPID(string ProcessName); HMODULE fnGetProcessBase(DWORD PID); DWORD GetLastErrorBox(HWND hWnd, LPSTR lpTitle) ; uintptr_t FindDMAAddy(uintptr_t ptr, vector<unsigned int> offsets); HWND hwnd; //程序的地址,类似于一个int DWORD procID; HANDLE handle; //基地址cstrike.exe unsigned int BaseAddress; uintptr_t ReadMemory(uintptr_t addr) { uintptr_t t; bool state = ReadProcessMemory(handle, (LPVOID)addr, &t, sizeof(t), 0); if(!state)return false; return t; } void changeMoney() { int money = 20000; //"game.exe"+00635DB4 vector<unsigned int> offsets; offsets.push_back(0x00635DB4); offsets.push_back(0x24c); uintptr_t addr = FindDMAAddy(BaseAddress,offsets); //printf("%x\n",addr); //写入实际的money WriteProcessMemory(handle, (LPVOID)addr, &money, sizeof(money), 0); } void electric() { //1.1 //"game.exe"+00433A80 int complete=53; vector<unsigned int> offsets; offsets.push_back(0x00433A80); offsets.push_back(0x24); uintptr_t addr = FindDMAAddy(BaseAddress,offsets); if(addr==BaseAddress)return; WriteProcessMemory(handle, (LPVOID)addr, &complete, sizeof(complete), 0); } void freshBuilding() { //1.1 "game.exe"+00433A80 int complete=53; unsigned int offset1 = 0x00433A80; for(int i=0;i!=8;i++) { vector<unsigned int> offsets; offsets.push_back(offset1+0x30*i); offsets.push_back(0x24); uintptr_t addr = FindDMAAddy(BaseAddress,offsets); if(addr==BaseAddress)continue; uintptr_t t = ReadMemory(addr); if(t<uintptr_t(53)) { WriteProcessMemory(handle, (LPVOID)addr, &complete, sizeof(complete), 0); } } } void freshDeffence() { //2.1 "game.exe"+00434914 int complete=53; unsigned int offset1 = 0x00434914; for(int i=0;i!=8;i++) { vector<unsigned int> offsets; offsets.push_back(offset1+0x30*i); offsets.push_back(0x24); uintptr_t addr = FindDMAAddy(BaseAddress,offsets); if(addr==BaseAddress)continue; uintptr_t t = ReadMemory(addr); if(t<uintptr_t(53)) { WriteProcessMemory(handle, (LPVOID)addr, &complete, sizeof(complete), 0); } } } void freshSoldier() { //3.1 "game.exe"+00435748 int complete=53; unsigned int offset1 = 0x00435748; for(int i=0;i!=8;i++) { vector<unsigned int> offsets; offsets.push_back(offset1+0x30*i); offsets.push_back(0x24); uintptr_t addr = FindDMAAddy(BaseAddress,offsets); if(addr==BaseAddress)continue; uintptr_t t = ReadMemory(addr); if(t<uintptr_t(53)) { WriteProcessMemory(handle, (LPVOID)addr, &complete, sizeof(complete), 0); } } } void freshTank() { //4.1 "game.exe"+004365AC int complete=53; unsigned int offset1 = 0x004365AC; for(int i=0;i!=8;i++) { vector<unsigned int> offsets; offsets.push_back(offset1+0x30*i); offsets.push_back(0x24); uintptr_t addr = FindDMAAddy(BaseAddress,offsets); if(addr==BaseAddress)continue; uintptr_t t = ReadMemory(addr); if(t<uintptr_t(53)) { WriteProcessMemory(handle, (LPVOID)addr, &complete, sizeof(complete), 0); } } } int main() { while(1) { if(!init("game.exe")) { cout<<"修改器初始化失败!"<<endl; Sleep(10000); } else { changeMoney();//修改金钱 freshBuilding(); freshDeffence(); freshSoldier(); freshTank(); Sleep(3000);//暂停5秒,实战得提高刷新频率 //break; } } CloseHandle(handle); return 0; } bool init(string gameName) { procID=FindPID(gameName); //cout<<procID<<endl; //获取进程句柄 handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID); if (handle == NULL) { cout << "There is no such a process!" << endl; Sleep(3000); return 0; } HMODULE hModule = fnGetProcessBase(procID); if(hModule==NULL) { return 0; } BaseAddress = (UINT_PTR)hModule; return 1; } //通过PID获取基地址 HMODULE fnGetProcessBase(DWORD PID) { //获取进程基址 HANDLE hSnapShot; //通过CreateToolhelp32Snapshot和线程ID,获取进程快照 hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID); if (hSnapShot == INVALID_HANDLE_VALUE) { GetLastErrorBox(NULL,"can't create Snapshot!"); return NULL; } MODULEENTRY32 ModuleEntry32; ModuleEntry32.dwSize = sizeof(ModuleEntry32); if (Module32First(hSnapShot, &ModuleEntry32)) { do { TCHAR szExt[5]; strcpy(szExt, ModuleEntry32.szExePath + strlen(ModuleEntry32.szExePath) - 4); for (int i = 0;i < 4;i++) { if ((szExt[i] >= 'a')&&(szExt[i] <= 'z')) { szExt[i] = szExt[i] - 0x20; } } if (!strcmp(szExt, ".EXE")) { CloseHandle(hSnapShot); return ModuleEntry32.hModule; } } while (Module32Next(hSnapShot, &ModuleEntry32)); } CloseHandle(hSnapShot); return NULL; } // 显示错误信息 DWORD GetLastErrorBox(HWND hWnd, LPSTR lpTitle) { LPVOID lpv; DWORD dwRv; if (GetLastError() == 0) return 0; dwRv = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPSTR)&lpv, 0, NULL); MessageBox(hWnd, (LPCSTR)lpv, lpTitle, MB_OK); if(dwRv) LocalFree(lpv); SetLastError(0); return dwRv; } uintptr_t FindDMAAddy(uintptr_t ptr, vector<unsigned int> offsets) { uintptr_t addr = ptr; uintptr_t t; for (unsigned int i = 0; i != offsets.size(); i++) { //printf("%x %x\n",addr,offsets[i]); addr += offsets[i]; //printf("%x\n",addr); if(i<offsets.size()-1)//最后一次只加偏移量,不用读取了 { bool state = ReadProcessMemory(handle, (LPVOID)addr, &t, sizeof(t), 0); if(!state) { cout<<"error in reading memory!"<<endl; return ptr; } addr = t; } } return addr; } int FindPID(string ProcessName) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if(hProcessSnap == INVALID_HANDLE_VALUE) { cout << "CreateToolhelp32Snapshot Error!" << endl;; return false; } BOOL bResult =Process32First(hProcessSnap, &pe32); int num(0); while(bResult) { if(pe32.szExeFile==ProcessName) { return pe32.th32ProcessID; } bResult = Process32Next(hProcessSnap,&pe32); } CloseHandle(hProcessSnap); return -1; }