原理介紹:先用CE分析出特征碼(不講),然后利用上次博客分享的C++特征碼遍歷的方式查詢到特征碼對應的地址,
然后進行簡單的讀寫地址操作來實作 ①植物不死
①植物不死
自己CE先找到堅強果血量,這個簡單(就是根據僵尸咬植物進行血量減少的判斷)就不講了,

然后查看是什么改寫了這個地址,然后除錯追蹤到這里

記錄此處的特征碼 83 46 40 FC 8B 4E 40 C7 86 B4
上代碼
#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
//引數分別為:行程句柄、特征碼、偏移、讀取長度、開始掃描位地置、掃描結束位置
uintptr_t hanshu_dizhi; //記錄特征碼對應的地址
uintptr_t ScanAddress(HANDLE process, char *markCode, int nOffset, unsigned long dwReadLen = 4, uintptr_t StartAddr = 0x400000, uintptr_t EndAddr = 0x7FFFFFFF, int InstructionLen = 0)
{
//************處理特征碼,轉化成位元組*****************
if (strlen(markCode) % 2 != 0) return 0;
//特征碼長度
int len = strlen(markCode) / 2; //獲取代碼的位元組數
//將特征碼轉換成byte型 保存在m_code 中
BYTE *m_code = new BYTE[len];
for (int i = 0; i < len; i++)
{
//定義可容納單個字符的一種基本資料型別,
char c[] = { markCode[i * 2], markCode[i * 2 + 1], '\0' };
//將引數nptr字串根據引數base來轉換成長整型數
m_code[i] = (BYTE)::strtol(c, NULL, 16);
}
//每次讀取游戲記憶體數目的大小
const DWORD pageSize = 4096;
//查找特征碼
//每頁讀取4096個位元組
BYTE *page = new BYTE[pageSize];
uintptr_t tmpAddr = StartAddr;
//定義和特征碼一樣長度的標識
int compare_one = 0;
while (tmpAddr <= EndAddr)
{
::ReadProcessMemory(process, (LPCVOID)tmpAddr, page, pageSize, 0); //讀取0x400000的記憶體資料,保存在page,長度為pageSize
//在該頁中查找特征碼
for (int i = 0; i < pageSize; i++)
{
if (m_code[0] == page[i])//有一個位元組與特征碼的第一個位元組相同,則搜索
{
for (int j = 0; j<len - 1; j++)
{
if (m_code[j + 1] == page[i + j + 1])//比較每一個位元組的大小,不相同則退出
{
compare_one++;
}
else
{
compare_one = 0;
break;
}//如果下個對比的位元組不相等,則退出,減少資源被利用
}
if ((compare_one + 1) == len)
{
// 找到特征碼處理
//賦值時要給初始值,避免沖突
uintptr_t dwAddr = tmpAddr + i + nOffset;
uintptr_t ullRet = 0;
::ReadProcessMemory(process, (void*)dwAddr, &ullRet, dwReadLen, 0);
//cout<<dwAddr<<endl;
//這里的dwAddr已經對應的是搜索到的地址
//地址輸出的也是10進制 需要轉化為16進制
hanshu_dizhi=dwAddr;//記錄地址
if (InstructionLen)
{
ullRet += dwAddr + dwReadLen;
}
return ullRet;
}
}
}
tmpAddr = tmpAddr + pageSize - len;//下一頁搜索要在前一頁最后長度len 開始查找,避免兩頁交接中間有特征碼搜索不出來
}
return 0;
}
int main(){
HWND hWnd;
hWnd=FindWindow(NULL,"植物大戰僵尸中文版");
DWORD PID;
GetWindowThreadProcessId(hWnd,&PID);
HANDLE lsProcess;
lsProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
cout<<ScanAddress(lsProcess,"834640FC8B4E40C786B4",0)<<endl;
cout<<hanshu_dizhi<<endl;
DWORD ss=0x90909090;//90對應nop 無操作
WriteProcessMemory(lsProcess,(LPVOID)hanshu_dizhi,&ss,4,NULL);
cout<<"植物不死開啟" <<endl;
return 0;
}
成功

上邊代碼只是對前兩期博客所學內容的應用,看不懂請轉入
https://blog.csdn.net/O8088/article/details/109514148 特征碼
https://blog.csdn.net/O8088/article/details/109499360 讀寫記憶體
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/212251.html
標籤:python
上一篇:騰訊 在我過往人生中的一些記憶
下一篇:路由器的子介面
