Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2013, 12:02   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию Delphi/Assembler. Запись в чужой указатель.

Доброго времени суток!

Пишу игровой треинер. Игру я придумал сам себе.
Код:
Type
  TMyObject = class
  private
    fValue:Integer;
  public
    property CurrentValue:Integer read fValue;
    procedure ChangeValue;
  end;
Есть вот такой объект.
Моя задача читать и записывать в fValue из чужой программы.

Запись проходит сюда:
Код:
mov [ebp-48], edx
Где [ebp-48] - указатель на число.

CheatEngine показывает, что само число живет здесь: $0012D450

Написал второй проект:
Код:
const
  cAddr = $0012D498; //EBP
  cOffset = $48;    
  cBaseAddr = cAddr - cOffset;

  procedure TForm4.Button1Click(Sender: TObject);
var
  hW: HWND;
  hProc, hWProcID: THandle;
  iVal1, iVal2: Integer;
  Dummy: NativeUInt;
begin
  hW := FindWindow(nil, PChar('Example #16644'));
  if hW <> INVALID_HANDLE_VALUE then
  begin
    GetWindowThreadProcessId(hW, @hWProcID);
    if hWProcID <> INVALID_HANDLE_VALUE then
    begin
      hProc := OpenProcess(PROCESS_VM_READ or PROCESS_VM_OPERATION or
        PROCESS_VM_WRITE, False, hWProcID);
      try
        if hProc <> INVALID_HANDLE_VALUE then
        begin
          if ReadProcessMemory(hProc, Ptr(cBaseAddr), @iVal1, SizeOf(Integer),
            Dummy) then
          begin
            ShowMessage('Прочитали: ' + IntToStr(Dummy) + ' Байта' + #10 +
              'Число в памяти: ' + IntToStr(iVal1));
            iVal1 := 1001;
            if WriteProcessMemory(hProc, Ptr(cBaseAddr), @iVal1, SizeOf(Integer),
              Dummy) then
            begin
              ShowMessage('Записали: ' + IntToStr(Dummy) + ' Байта' + #10 +
                'Число: ' + IntToStr(iVal1));
            end;
          end;
        end;
      finally
        CloseHandle(hProc);
      end;
    end;
  end;
end;
Читаю значение на ура. А вот не записывает он. Ну ни в какую....
Точнее записывает, но может я как-то не правильно записываю?
Записывает на ура. В CheatEngine показывает что $0012D450 имеет значение 1001.

Но при вызове кода:
Код:
procedure TMainForm.Button1Click(Sender: TObject);
begin
  if not Assigned(MyObject) then
    Exit;
  ValueDesc.Caption := Format(CValStr, [MyObject.CurrentValue]);
end;
Значение в $0012D450 принимает неизвестное мне число, и не отображает то, что я хочу(я хочу увидеть 1001 на экране).

Если писать в само $0012D450 то эффект тот же.

Как быть?
Человек_Борща вне форума Ответить с цитированием
Старый 17.02.2013, 14:17   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
А вот не записывает он. Ну ни в какую
Т.е. WriteProcessMemory дает ошибку?
Код:
           
 SetLastError(0);
 if WriteProcessMemory(hProc, Ptr(cBaseAddr), @iVal1, SizeOf(Integer),
              Dummy) then
            begin
              ShowMessage('Записали: ' + IntToStr(Dummy) + ' Байта' + #10 +
                'Число: ' + IntToStr(iVal1));
            end else RaiseLastOSError();
Что показывает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.02.2013, 14:44   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Нет нет. И чтение и запись - все просто шоколадно.
Я хочу чтобы программа показала то, что я туда записал, но этого не происходит хотя адрес, куда я записал, содержит новое значение.

Вот проект. Посмотрите.
Вложения
Тип файла: rar GameTrainer.rar (2.88 Мб, 5 просмотров)
Человек_Борща вне форума Ответить с цитированием
Старый 17.02.2013, 15:34   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

//дабл-пост.. о_О

Последний раз редактировалось Человек_Борща; 17.02.2013 в 15:42.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск и запись в файл(Assembler) Bullrock Помощь студентам 1 08.01.2013 12:34
Составить программу, в которой переменная-указатель ссылается на запись: technomaster Помощь студентам 0 10.03.2012 13:26
assembler.tasm. Запись результата в файл .txt квант Помощь студентам 0 15.12.2011 00:12
Запись\Открытие файла на Assembler devilmm Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 17.01.2010 16:53
Чужой Listbox[Delphi] VilAm Помощь студентам 0 21.11.2009 09:20