Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > А как узнать сегмент данных проги?


Автор: Underdark 20.10.2004, 12:03
Кто пользовался самой популярной ломалкой игр - ArtMoney - тот в курсе, что ко всему она выдаёт адреса переменных(тех, которых мы имеем желание поменять).

Я хотел бы немного облегчить себе жизнь и написать программулину, которая меняет в игрушке XXX сразу группу переменных. :hehe Адреса всех переменных вводятся в параметрах и не меняются в течении работы. НО!!! Загвоздка в том, что ArtMoney нам выдаёт только смещение переменных, а сегмент данных каждый раз меняется(если я не ошибаюсь, то он у каждой программы один, иначе УМНЫЕ ЛЮДИ поправьте меня!!!). А как узнать этот сегмент при условии, что я XXX уже запустил?

З.Ы. Надеюсь, я понятно изложился... :) Буду признателен за любой ответ. :sample

Автор: Mad 20.10.2004, 12:10
Поправим :)

Понятие сегментовумерло вместе с 16-ти битными системами.

Так. что тот адрес, который выдала тебе ломалка перердаеш прямо в ReadProcessMemory или WriteProcessMemory и все ок :)

Автор: Underdark 20.10.2004, 13:52
То бишь, если я правильно всё понял, OS просто привязывает к процессам какие-то области памяти, в которых прога нуждается, и таким образом разбиение идет не сегментами, а "процессами"... :yasno

Тады, другой вопрос :) Handle процесса - где его наковырять? Это случайно не его мы видим в Диспетчере Задач?

Автор: Girder 20.10.2004, 15:03
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/openprocess.asp

Пример использования:
Код
procedure ReadWriteDWord(pID:Cardinal; Value:DWord; lpBaseAdr:DWord);
var op:Cardinal;
   OldValue:DWord;
   i:Cardinal;
begin
op:=OpenProcess(PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_VM_OPERATION,false,pID);
if op<>0 then
 begin
  //Читаем 4 байта
  if ReadProcessMemory(op,Pointer(lpBaseAdr),@OldValue,SizeOf(OldValue),i)and(i=SizeOf(OldValue)) then
   begin
    //...
   end;
  //Записываем 4 байта
  if WriteProcessMemory(op,Pointer(lpBaseAdr),@Value,SizeOf(Value),i)and(i=SizeOf(Value)) then
   begin
    //...
   end;
  CloseHandle(op);
 end;
end;

Автор: Mad 20.10.2004, 15:07
Цитата(Underdark @ 20.10.2004, 13:52)
случайно не его мы видим в Диспетчере Задач

Нет, это ID процесса, передаеш его в OpenProcess() и получаеш хандл.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)