Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

!= Работа с памятью StarCraft:BW=! [D7, WinXP]


a[x]el ©   (2004-06-28 02:20:00) 

Я делаю утилиту для игры StarCraft: BroodWar и мне нужно
заменять текстовое значение в памяти, так как память динамическая, то
нужный мне адрес постоянно меняется. Получается, что мне каждый раз
нужно находить его заново. Утилита которую я делаю - это НЕ трейнер,но принцип
работы такой же.
Вот какой код я нашёл для записи значения в определённый адрес памяти :

Var WindowName : integer;
   ProcessId : integer;
   ThreadId : integer;
   buf,buf2 : PChar;
   HandleWindow : Integer;
   write : cardinal;
   Adress: integer;

Const WindowTitle = 'Brood War';
    Address = $0449010C;
     PokeValue = $32;
     NumberOfBytes = 1;

implementation

{$R *.dfm}
//WRITE NEW VALUE
procedure TForm1.Button1Click(Sender: TObject);
begin
WindowName := FindWindow(nil,WindowTitle);
    If WindowName = 0 then
      begin
      MessageDlg('Игра должна быть запущена до трейнера. Запустите ее, потом трейнер', mtwarning,[mbOK],0);
      end;
 ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
 HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
 GetMem(buf,1);
 buf^ := Chr(PokeValue);
 WriteProcessMemory(HandleWindow,ptr(Adress),buf,NumberOfBytes,write);
 FreeMem(buf);
 CloseHandle(HandleWindow);
 Adress:= Adress;
end;


Как мне осуществить поиск и записать туде не одну букву а слово.
Получается мне надо с каждой буквой увеличивать адрес на 1?
Может кто-нибудь писал трейнер или знает как это делается?
Заранее благодарен!


Digitman   (2004-06-28 09:23:00) [1]


> так как память динамическая, то
> нужный мне адрес постоянно меняется


> Как мне осуществить поиск


см. ф-цию VirtualQueryEx()

циклический вызов этой ф-ции с нужными параметрами позволит перечислить регионы страниц памяти целевого процесса, хранящие данные

в каждой итерации цикла для каждого перечисляемого региона (регион описывается нач.вирт.адресом и размером, кратным 4к) выполняй скользящий поиск по АП региона искомой строки, адрес найденной строки и есть искомый адрес


Наверх

Титульная страница Поиск, карта сайта Написать письмо