製作遊戲修改器
加入52破解也有一段時間了, 今天給大家帶了一個教程. 第一是為了分享, 第二為了記錄下來, 在將來不會忘記怎麼去做.
本次教程從最基礎的內容開始, 講述如何去製作一個遊戲修改器的全部過程, 從分析內存數據開始到破解器的開發等出發做起.
0x00:
注:
VC等IDE也可以.
相關文件會在後面添加下載連結
0x01:
使用CE查詢分析遊戲內存數據首先打開遊戲, 開始遊戲, 然後暫停遊戲.
這時候使用CE打開PlantsVsZombies.exe進程
在CE中輸入當前陽光值的大小, 默認一開始是50, 點擊首次查詢
會出現很多地址, 別擔心, 我們進一步繼續挖掘.
再回到遊戲裡面, 等待收集一個陽光值.
再到CE中輸入75點擊再次掃描, 現在的結果比較好了, 只有一個值了.
雙擊這個地址, 添加到地址列表裡面, 驗證找的對不對, 可以修改這個地址的值,
在遊戲中查看陽光值是否發生變化, 在這裡我就不再演示了.
這個地址上面右擊選擇, 找出是什麼改寫了了這個地址
回到遊戲中去種一顆植物, 會在列表中找到一個操作.
點擊詳細信息
可以看到一些彙編代碼, 和寄存器的值. 我們先記錄下來
其中有一個mov指令, 這個是寫入內存值的操作, 偏移是0x5578, 那麼其實它寫入的地址為EDI+0x5578
這個我看一下EDI寄存器的值是: 0x20C8DCA8
我們再次回到CE中勾選hex, 輸入EDI寄存器的值, 點擊新的掃描
這次找到的東西也不少, 也是比較麻煩的, 只能根據經驗和多次嘗試了.
這裡有一個小技巧, 首先去找那些和別的地址不太一樣的地址, 比如我在這裡就比較輕鬆的找到了.
好了, 到了這一步, 我們點擊手動添加地址, 勾選指針, 輸入我們找的那個地址和上面的偏移值.
如果是這樣的, 說明我們找的沒錯
下一步, 我們在第二個指針上面右擊, 這次選擇找出是什麼訪問了這個地址
選擇第一個, 切換到遊戲裡面
很快在列表裡面出現好多訪問
我們選擇其中任意一個地址, 看一下詳細信息, 找到可能值為ESI寄存器的值, 我們去查詢一下, 出現我們想要的結果了
圖中我們看到了地址為綠色的, 第一個綠色的地址就是我們要找的地址.
我們再次記錄一下這個
我們找到的地址是: 0x7794F8 偏移: 0x868
下一步, 手動添加地址
勾選指針, 輸入我們找到的地址: 0x7794F8, 偏移0x868
再點擊添加指針, 輸入偏移0x5578, OK.
最後的結果, 可以在第三個地址修改值, 看看遊戲中的陽光值變化.
第一步完成了, 找到了我們最終要使用的地址和偏移值.
0x02:
修改器的開發, 我們這裡使用C語言首先了解一下做修改器的關鍵API:
BOOL ReadProcessMemory(
HANDLE hProcess,
PVOID pvAddressRemote,
PVOIDpvBufferLocal,
DWORD dwSize,
PDWORDpdwNumBytesRead
);
參數:
hProcess [in]遠程進程句柄, 被讀取者
pvAddressRemote [in]遠程進程中內存地址, 從具體何處讀取
pvBufferLocal [out]本地進程中內存地址, 函數將讀取的內容寫入此處
dwSize [in]要傳送的字節數, 要寫入多少
pdwNumBytesRead [out]實際傳送的字節數, 函數返回時報告實際寫入多少
BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPVOID lpBuffer,
DWORD nSize,
LPDWORD lpNumberOfBytesWritten
);
參數:
hProcess [in]遠程進程句柄, 被讀取者
lpBaseAddress [in]要寫的內存首地址, 再寫入之前, 此函數將先檢查目標地址是否可用, 並能容納待寫入的數據.
lpBuffer [in]指向要寫的數據的指針.
nSize [in]要寫入的字節數.
返回值
非零值代表成功.
0x03:原理
修改器的基本原理就是讀取遊戲線程的內存數據, 根據我們之前找到的計算方式, 在最後得到地址寫入陽光值.關鍵代碼實現
DWORD d1, d2;
// 得到0x7794f8地址的內存值, 其值保存到d1, d2為真實讀到數據的大小, 這裡如果不為4則讀取錯誤
ReadProcessMemory(hProc, (void *)0x7794f8, &d1, 4, &d2);
printf("0x%X 0x%X\n", d1, d2);
// 得到上面地址+0x868的內存值
ReadProcessMemory(hProc, (void *)(d1+0x868), &d1, 4, &d2);
printf("0x%X 0x%X\n", d1, d2);
// 要寫入陽光值的地址
ads_ps = d1+0x5578;
// 得到上面地址+0x5578的內存值
ReadProcessMemory(hProc, (void *)(d1+0x5578), &d1, 4, &d2);
// 輸出當前陽光值的大小
printf("%d 0x%X\n", d1, d2);
printf("ads_ps: 0x%X\n", ads_ps);
// 在我計算出來的地址裡面寫入陽光值的大小
WriteProcessMemory(hProc,(void *)ads_ps, &value, 4, NULL); //寫內存
0x04:
最後來一個效果圖, 希望這個教程會幫助大家學習
0x05:
下載地址:
PlantsVsZombies: http://pan.baidu.com/s/1kVDck5L 密碼: 7ooj
修改器源碼: http://pan.baidu.com/s/1c1HJRu4 密碼: wa2n
解壓密碼: 52pojie
--官方論壇
www.52pojie.cn
--推薦給朋友
公眾微信號:吾愛破解論壇
或搜微信號:pojie_52