关于基地址如何得来的问题(sadnui兄如果方便请进来)(100分)

  • 主题发起人 主题发起人 HHYWorld
  • 开始时间 开始时间
H

HHYWorld

Unregistered / Unconfirmed
GUEST, unregistred user!
问题:以下两句中的$A35DB4这个基地址是如何得来的,是用Softice还是ollydbg呢?请详细解答。
edit4.Text:= inttostr( DuMem( xpid, DuMem( xpid ,$A35DB4 ) + $24C ) );
XXMem( xpid, DuMem( xpid ,$A35DB4 ) + $24C , strtoint(edit2.Text ) );

上述问题请参照我提出的《请教如何编写游戏修改器(动态分配内存地址)》这个问题进行解答。源程序如下(红色警戒2金钱修改器):
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Timer1: TTimer;
Label2: TLabel;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
Label3: TLabel;
Edit4: TEdit;
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
Function DuMem(pid:DWORD;Addres: Cardinal): Cardinal;
var PHND:THandle; bReadSucceed :BOOL; BytesRead:DWORD;
begin
if pid <> 0 then
begin
PHND := OpenProcess(PROCESS_VM_READ, False,pid);
if PHND <> 0 then
begin
bReadSucceed :=ReadProcessMemory(PHND, Pointer(Addres), @Result, 4, BytesRead);
if bReadSucceed = False then Result := 0 ;
end;
CloseHandle(PHND);
end else
Result := 0;
end;

Function XXMem(pid:DWORD;Addres: Cardinal;zhi:dword): Cardinal;
var PHND:THandle; bReadSucceed :BOOL; BytesRead:DWORD;
begin
if pid <> 0 then
begin
PHND := OpenProcess(PROCESS_ALL_ACCESS, False,pid);
if PHND <> 0 then
begin
bReadSucceed :=WriteProcessMemory(PHND, Pointer(Addres), @zhi, 4, BytesRead);
if bReadSucceed = False then Result := 0 ;
end;
CloseHandle(PHND);
end else
Result := 0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
hRedAlert2 : THandle; xpid:dword;
begin
hRedAlert2 := FindWindow('Red Alert 2', 'Red Alert 2');
if hRedAlert2<> 0 then
begin
GetWindowThreadProcessId(hRedAlert2,xpid);
edit1.Text:= inttostr( xpid );
edit4.Text:= inttostr( DuMem( xpid, DuMem( xpid ,$A35DB4 ) + $24C ) );
XXMem( xpid, DuMem( xpid ,$A35DB4 ) + $24C , strtoint(edit2.Text ) );
end else
begin
edit1.Text:='无';
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
halt;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage('程序设计:又欠'#13#10+'程序测试:安康')
end;

end.
 
通过 OD 跟踪得来的。
 
呵呵,说白了就是不知道如何使用ollydbg去跟踪红色警戒2的金钱基址,所以才提问的[:D][:D],能讲解一下如何使用od进行跟踪吗?
我是这么做的,不知道对不对:
先开游戏,然后用金山游侠之类的工具找到当前金钱的地址,然后开od,然后选择菜单中“文件”中的“附加”,选择游戏,然后ctrl+g输入找到地址,然后下内存访问或写入断点,然后回到游戏,接着就可以找到基址了,可是我照着做了,前面一直都顺利,不过到下断点那里就出现问题了,我下断点之后就无法回到游戏了,所以这里有点问题,请高手赐教,教教我怎么做,谢谢
 
后退
顶部