再说游戏修改(100分)

  • 主题发起人 主题发起人 michael.ma
  • 开始时间 开始时间
M

michael.ma

Unregistered / Unconfirmed
GUEST, unregistred user!
1.游戏修改器好像修改不了 罗马复兴这个游戏,why?<br>2.听说 win api ToolHelp32 &nbsp;在win2000 (nt) 下用不了<br>3。如何搜索内存,并用Read(write)ProcessMemory 读写<br>最终要解决的问题:如何修改帝国里面的food wood....哪位老兄有好办法?我查看了以前的<br>帖子好像都七零八散的,有没有系统一点的,对这类问题来个彻底解决。<br><br>下面有一例,好像有关系。但为什么readprocessmemory 从 $00800001 开始,<br>不从$00000000开始;程序运行结果 读出来的都是 00 00 ……,没有其他1什么的,<br>难道在win2000下读不了吗?<br><br>procedure TForm1.Button1Click(Sender: TObject); <br>var <br>FSnapshotHandle:THandle; <br>FProcessEntry32:TProcessEntry32; <br>Ret : BOOL; <br>ProcessID : integer; <br>ProcessHndle : THandle; <br>lpBuffer:pByte; <br>nSize: DWORD; <br>lpNumberOfBytesRead: DWORD; <br>i:integer; <br>s:string; <br>begin <br>FSnapshotHandle:=CreateToolhelp32Snapshot(<br>TH32CS_SNAPPROCESS,0);<br>//创建系统快照 <br>FProcessEntry32.dwSize:=Sizeof(FProcessEntry32); <br>//先初始化 FProcessEntry32 的大小 <br>Ret:=Process32First(FSnapshotHandle,FProcessEntry32); <br>while Ret do <br>begin <br>s:=ExtractFileName(FProcessEntry32.szExeFile); <br>if s='Project1.exe' then<br>begin <br>ProcessID:=FProcessEntry32.th32ProcessID; <br>s:=''; <br>break; <br>end; <br>Ret:=Process32Next(FSnapshotHandle,FProcessEntry32); <br>end; <br>//循环枚举出系统开启的所有进程,找出"Kernel32.dll" <br>CloseHandle(FSnapshotHandle); <br>Memo1.Lines.Clear ; <br>memo1.lines.add('Process ID '+IntToHex( <br>FProcessEntry32.th32ProcessID,8)); <br>memo1.lines.Add('File name '+FProcessEntry32.szExeFile); <br>////输出进程的一些信息 &nbsp;<br>nSize:=4; <br>lpBuffer:=AllocMem(nSize);<br>ProcessHndle:=OpenProcess(PROCESS_VM_READ,false,ProcessID);<br>memo1.Lines.Add ('Process Handle '+intTohex(ProcessHndle,8));<br>//caption:=inttohex( 95,2);<br>for i:=$00800001 to $0080005f do<br>begin <br>ReadProcessMemory( <br>ProcessHndle, <br>Pointer(i),<br>lpBuffer, <br>nSize, <br>lpNumberOfBytesRead <br>); <br>s:=s+intTohex(lpBuffer^,2)+' '; <br>//读取内容 <br>if (i mod 16) =0 then <br>begin <br>Memo1.Lines.Add(s);<br>s:=''; <br>end; <br>//格式化输出 <br>end; <br>FreeMem(lpBuffer,nSize); <br>CloseHandle(ProcessHndle); <br>//关闭句柄,释放内存 <br>end;
 
ToolHelp 在NT下没有,要查Registry,但在Win2k下有。到MSDN下查一下。<br>但是,当程序执行会有一个Security Descriptor, 大部分情况下都会禁止<br>你改他的memory,除非你是个debugger.把游戏安到ME下玩吧。
 
直接使用秘籍不是很简单么
 
1:罗马可能加密过<br>2:psapi
 
一样的问题:http://www.delphibbs.com/delphibbs/dispq.asp?lid=512543<br>&gt;这个问题的关键在于StarCraft的内存地址的确定,大家都没有提到这一点,其实、<br>&gt;sc的两种资源的内存地址是变化的,所以只能用softice反汇编之来确定其地址。<br>&nbsp; 同星际争霸一样,直接用ReadxxxMemory是行不通的,只Debug。<br><br>&gt;为什么readprocessmemory 从 $00800001 开始<br>&nbsp; 进程的内存映射有一个起始地址。在Delphi中,可以设定可执行文件的映射起始地址——Image base<br>(Project - Options - Linker - Memory sizes)。好好看一看Windows的内存管理方式吧。<br><br>&gt;$00800001<br>&nbsp; 为什么要用常量,动态检测它的起始地址不行吗?(我这里是77e60000,Win2K) Delphi32深度历险中<br>有一个FindProc控件,非常好用。
 
接受答案了.
 
后退
顶部