#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,"Tutorial-i386");
DWORD PID;
GetWindowThreadProcessId(hWnd,&PID);
HANDLE lsProcess;
lsProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
cout<<ScanAddress(lsProcess,"2983AC0400008D45D4",0)<<endl;
//2983AC0400008D45D4對應下圖的0x0042578F地址的特征碼
cout<<hanshu_dizhi<<endl;
return 0;
}

除錯輸出 (78414633)我腦子抽了一直以為錯了 然后用系統自帶的計算器將這個轉為16進制 算出4AC8329 (對應 上圖紅色部分04 AC 83 29) 對應(0x0042578F地址)修改也是對著這個地址修改的,
2020/11/5 但是感覺缺點東西 如果能直接回傳出 0x0042578F 這個地址太棒了,看看這兩天能不能研究出來
2020/11/5 感謝(ID南南)解決了上述問題,在函式中 已經取到特征碼對應的地址 hanshu_dizhi來記錄這個地址
未來幾天將用特征碼定位 進行其他游戲分析
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/206307.html
標籤:其他
上一篇:「泉州一中基地賽20180519」第四題題解 (代碼注釋有時間再補)
下一篇:JS判斷物件型別方法_typeof怎么用_instanceof怎么用_constructor怎么用_Object.prototype.toString()怎么用
