史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   請益 已找出遊戲內暫存記憶體位置該如何製作程式? (http://forum.slime.com.tw/thread245437.html)

eric10104 2009-03-29 10:25 AM

請益 已找出遊戲內暫存記憶體位置該如何製作程式?
 
各位前輩們好 小弟沒有實際經驗 不懂之處請多包涵

小弟在修改某一款遊戲的數值 已得知遊戲內暫存記憶體位置

而這項記憶體位置是共用的

礙於遊戲本身的bug只能借助修改程式 想寫出一款直接修改內定記憶體的程式

請問該如何著手? 請前輩們賜教 謝謝 !

=============================================

目前修改的方式:

必須先到球員編輯區 再回到桌面修改內定記憶體位置 , 修改每位球員都必須要到球員個人編輯區 , 才能找到球種記憶體位置.

每位球員的預設球路記憶體位置都是同一個 , 遊戲內定每位球員只有五種球路 , 但有十一種球路可以選.

修改完畢必須在遊戲內儲存


預設伸卡球(第1種球路位址)
0374027F--->球種編號
0374027A--->movement
03740280--->speed
03740281--->control

預設滑球(第2種球路位址)
0374027C--->球種編號
0374027D--->speed
03740276--->control
03740277--->movement

預設圈指變速球(第3種球路位址)
03740279--->球種編號
03740272--->speed
03740273--->control
03740274--->movement

快速球(第4種球路位址)
0374026e--->球種編號
0374026f--->speed
03740270--->control
03740271--->movement


二縫線球(第5種球路位址)
03740269--->movement
0374026b--->球種編號
0374026c--->speed
0374026d--->control

球種編號+中英文名稱
00-->Fastbal 四縫線速球
01-->Slider 滑球
02-->Curve ball 曲球
03-->Changeup 變速球
04-->Screwbal 螺旋球
05-->Kunckle ball 蝴蝶球
06-->Sinker 伸卡球
07-->Splitter 叉指速球
08-->Cut Fastball 卡特球
09-->2-seam FB 二縫線速球
0a-->Fork ball 指叉球
0b-->Power Curve 大曲球
0c-->12-6 Curve 12-6 曲球
0d-->Circle Change 圈指變速球
0e-->Palm ball 掌心球
0f-->knuckle Curve 彈指曲球
10-->Slurve 滑曲球
11-->Eephus 小便球
12-->沒球種

=============================================

想修改程式為可在程式上直接調整各種球路 控球 ,速度 , 軌跡 以及修改每位投手的球種 , 並且可以修改完就自動存入記憶體.

eric10104 2009-03-29 01:25 PM

想請教必須用到哪些指令? 不是要前輩們幫忙寫程式 請別誤會 ~

mini 2009-03-29 02:58 PM

在 win api 裡有兩個可用指令
ReadProcessMemory 與 WriteProcessMemory

VB範例:
如何掃描外部程式的記憶體
http://sunh.hosp.ncku.edu.tw/~cww/html/q00534.html

如何讀寫外部程式的記憶體
http://sunh.hosp.ncku.edu.tw/~cww/html/q00486.html

eric10104 2009-03-29 09:38 PM

謝謝mini 板大回覆

小弟對win api 不是很熟悉 , 試問板大幾個簡易問題 , 幾個簡單問題 , 請別介意 ,

直接使用VB , 參照網址內的語法下去撰寫?

有些記憶體位置我不明白該如何加入 , 小弟不是本科系 , 對C語言認知只有一些 ,

不太明白有些動作該如何去執行 , 有勞 mini 板大幫忙 , 謝謝.

mini 2009-03-30 08:03 PM

引用:

作者: eric10104 (文章 2130891)
謝謝mini 板大回覆

小弟對win api 不是很熟悉 , 試問板大幾個簡易問題 , 幾個簡單問題 , 請別介意 ,

直接使用VB , 參照網址內的語法下去撰寫?

有些記憶體位置我不明白該如何加入 , 小弟不是本科系 , 對C語言認知只有一些 ,

不太明白有些動作該如何去執行 , 有勞 mini 板大幫忙 , 謝謝.

他都寫得很清楚
Read/WriteProcessMemory(ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
所以 lpBaseAddress: 這是要讀取或是寫入的基底位址
就是 記憶體位置

Win API 不是只有 VB能用
C/C++ 要用的話是以引入 .h檔方式

不熟程式語言的話
基本上還是建議你用工具去改
像個人都用 GameMaster

eric10104 2009-03-31 04:19 PM

貌似這種? 原始碼是在外國論壇詢問的 , 他向我說明用 C++ 可以用您講的

WriteProcessMemory 直接 寫 Value 落 "Address"

程式語言這方面不是很懂 , 我也是以 FPE 和 GM8修改 , 因為這款遊戲目前 Bug 還很多
, 想編譯這款修改器 , 幫助更多人







#include <windows.h> // add the windows.h

HANDLE g_hProcess;
DWORD g_arList; // Fill the address you want
int iVal; // Fill the value you want

BOOL WriteMemory(DWORD dwAddr, DWORD dwValue)
{
return ::WriteProcessMemory(g_hProcess, (LPVOID)dwAddr, &dwValue, sizeof(DWORD), NULL);
}

int main()
{
char szFileName[] = "target.exe";
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi;
::CreateProcess(NULL, szFileName, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, π);
::CloseHandle(pi.Thread);
g_hProcess = pi.Process;
if(WriteMemory(g_arList, iVal))
printf("Write data Sucess!\n");
::CloseHandle(g_hProcess);
return 0;
}

eric10104 2009-04-01 11:34 AM

我已經大概知道編程 , 但是卻無法修改遊戲中的數值 , 請高手指正我哪邊錯誤了 ? 謝謝 !

程式可以運行 , 我在輸入 address 有加上16進位的 0x , value 這是修改直接要得值 ?

開啟時會叫出client.exe , client.exe會顯示 0x440004= 7474

代碼是外國高手幫忙的 , 我不知到哪邊錯誤 , 請版上高手幫幫忙 謝謝 ~

遊戲暫存器: 03740268

必須要先到球員編輯區,輸入暫存器位址,才有辦法更改

此為GM8和FPE修改法

這支程式卻讀不到內部的位址,不知到哪邊有錯誤?
====================================

首先 run MemoryEdit.exe
佢會 CreateProcess and run Client.exe
Client.exe 會 不斷 咁 print 會 int 既 address and value

之後 MemoryEdit.exe 會要你 input 個 address 你要 edit 既
個 address 可以 抄返 Client.exe Show 出 o黎 既
e.g. 010E9008 就 input 0x010E9008 <= 0x 開頭 hex
之後 要你 input 個 value e.g. input 8888

之後 等 5 秒

check 返 Client.exe
佢個 value 會 唔同左

=====================================


Client.exe

引用:

#include <windows.h>
#include <iostream>

int addr = 7474;

int main()
{
int i=0;

while(++i < 1000)
{
std::cout << &addr << " = " << addr << std::endl;
Sleep(1000);
}
return 0;
}

=====================================

MemoryEdit.exe

引用:

#include <windows.h>
#include <iostream>
#include <string>

using namespace std;

HANDLE g_hProcess;
DWORD g_arList;
int iVal;

BOOL WriteMemory(DWORD dwAddr, DWORD dwValue)
{
return ::WriteProcessMemory(g_hProcess, (LPVOID)dwAddr, &dwValue, sizeof(DWORD), NULL);
}

int main()
{
char szFileName[] = "Client.exe";

STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi;
::CreateProcess(NULL, szFileName, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si,&pi);
cout << "Please enter the addr [0x1234567...]: ";
cin >> hex >> g_arList;
cout << "Please enter the value: ";
cin.clear();
cin >> dec >> iVal;
Sleep(5000);

CloseHandle(pi.hThread);
g_hProcess = pi.hProcess;

if(WriteMemory(g_arList, iVal))
cout << "Memory: " << g_arList << " [Written]\n";

CloseHandle(g_hProcess);
return 0;
}


mini 2009-04-01 02:54 PM

我想你可能有點誤解

這兩個程式是這樣的
client.exe 相當於你要作手腳的程式 (這裡是用來模擬示範當作 遊戲主執行檔 用的)
而 MemoryEdit.exe 會自動執行client.exe這個程式

client.exe因為只是模擬假設他是個遊戲
而內容
是簡單的把某變數不斷印出
變數的記憶體位址 = 7474

而 MemoryEdit.exe 可輸入上面的 變數的記憶體位址
欲改寫的值
輸入後
client.exe 就會顯示
變數的記憶體位址 = 欲改寫的值

==================

所以你必須改寫一下 MemoryEdit 之程式碼
把 char szFileName[] = "Client.exe";
之 Client.exe 改成你遊戲的執行檔名稱

接著你就可以輸入第一樓你提供的
記憶體位址來串改
遊戲數值 了

不過
很顯然的 MemoryEdit的設計是假設你的遊戲是一個單純的
只有一個主程序檔 某某某.exe
如果 你的遊戲 是
a.com 呼叫 b.exe 那 MemoryEdit就要改一下設計方式了

個人前面介紹的VB範例 "如何讀寫外部程式的記憶體"
就是一個藉由
視窗標題來獲得相關程序位址等資訊
較正統的範例
也就是
先執行遊戲 再執行遊戲修改軟體

eric10104 2009-04-02 11:12 AM

謝謝 , 我明白這程式的用意了 , 撰寫經驗不足對程式語言認知不太夠 , 要寫出程式真難...

我暫時先放棄製作修改器 , 先搞懂一些函數 , 再來摸索


所有時間均為台北時間。現在的時間是 09:03 AM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1