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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2010, 15:26   #1
SuperDuper
Новичок
Джуниор
 
Регистрация: 22.08.2010
Сообщений: 3
По умолчанию Delphi игнорирует параметр

Решил сделать анлим время в демо версии Mafia II. Разумеется игра DMA, но я без проблем нашел все указатели и через CE после перезапуска все идеально видит.
Пишу на Delphi код чтобы считать значение из ячейки времени, дабы проверить верно ли все работает, а далее записываю значение которое мне нужно. Но появилась проблема, делфи ни в какую не видит что я ему в указателях пишу.

В самом низу поста я выложил абсолютно весь код программы, на форме всего лишь Кнопка1 и два лейбела.

Проблема скорее всего, я даже на 99% уверен что имеено в данной части кода:
Код:
address :=GetModuleBase(ProcessId,'mafia2.exe')+$017E12F4;
Прога тупо игнорирует 'mafia2.exe', там можно написать хоть что, выдает одно и тоже. Хотя в случае с Dll который описан чуток ниже, прога сразу начинала выдавать ерунду либо вообще отказывалась работать.
Если убрать 017E12F4, то он считывает и выводит из памяти значение 0, а если добавить этот адрес, то он выводит его значение а не Mafia2.exe+$017E12F4


mafia2.exe+017E12F4
0x6C
0x4C
Выше два смещения, все работает в CE, но ничего не работает в проге.

Также в свое время делали другую программу, Там была такая же ерунда, код взят именно оттуда, который работал на ура, но там заместо Mafia2.exe было Game.dll, вот и кидает на сомнения именно эта часть кода, тем более что при изменении Mafia2.exe в коде, программа должна реагировать, но ей пофигу.


Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Tabs, ComCtrls, StdCtrls, ExtCtrls,TlHelp32, jpeg, Menus, ShellAPI,
  OleCtrls, SHDocVw, Buttons, Grids, XPMan;



type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    Function GetModuleBase(PID: DWord; moduleName: PChar): dword;
    procedure hpp;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

    WindowName,ProcessId,ThreadId,HandleWindow: integer;
  outbytes: cardinal;
  buf,address,result,address2,address3,sizebyte: dword;
  value: Word;
  h:hwnd;


implementation

{$R *.dfm}

Function Tform1.GetModuleBase(PID: Cardinal; moduleName: PWideChar):dword;
var
   snapshot: THandle;
   modules: TModuleEntry32;
begin
  result := 0;
  snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId);
  modules.dwSize := sizeof(TModuleEntry32);
  if Module32First(snapshot, modules) then
    While Module32Next(snapshot, modules) do
    if StrComp(moduleName, modules.szModule) = 0 then
      begin
       CloseHandle(snapshot);
       result := dword(modules.modBaseAddr);
       exit;
      end;
   CloseHandle(snapshot);
end;

procedure Tform1.hpp;
var
   tmp: integer;
  byte1: Byte;
begin
address :=GetModuleBase(ProcessId,'mafia2.exe')+$017E12F4;  // вот эта зловещая строчка
     showmessage(inttostr(address));
      HandleWindow :=FindWindow(nil, 'Mafia II');
        if(HandleWindow  <> 0) then
          GetWindowThreadProcessId(HandleWindow  ,@ProcessId);
          h := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
          if(h <> 0) then
            begin
              if(ReadProcessMemory(h, Pointer(address), @buf, sizeof(DWORD), outbytes) and (outbytes = sizeof(DWORD))) then
                begin
                 showmessage(inttostr(buf));
                end;
              CloseHandle(h);
            end;     
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
hpp;
end;

end.
SuperDuper вне форума Ответить с цитированием
Старый 22.08.2010, 18:00   #2
SuperDuper
Новичок
Джуниор
 
Регистрация: 22.08.2010
Сообщений: 3
По умолчанию

Так стало известно что GetModuleBase используется для Dll'шек онли. А какую функцию использовать для .exe'шников?
SuperDuper вне форума Ответить с цитированием
Старый 22.08.2010, 18:14   #3
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Тут есть общая концепция поиска под С++. Думаю, переписать не составит труда.
http://www.unfair-gamers.com/forum/s...d.php?tid=1413
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 22.08.2010, 19:51   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Хех, хотите я угадаю базовый адрес Mafia II с первого раза?

$400000
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 22.08.2010, 20:12   #5
SuperDuper
Новичок
Джуниор
 
Регистрация: 22.08.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Хех, хотите я угадаю базовый адрес Mafia II с первого раза?

$400000
Попробовал я от него отталкиваться, увы привело вообще не туда куда нужно. Вы просто так это написали?

Цитата:
Тут есть общая концепция поиска под С++. Думаю, переписать не составит труда.
http://www.unfair-gamers.com/forum/s...d.php?tid=1413
Спасибо, понял что нужно хакать exe, но переписать будет сложновато пока что, с C++ еще не знаком, изучаю делфи.
SuperDuper вне форума Ответить с цитированием
Старый 22.08.2010, 21:46   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от SuperDuper Посмотреть сообщение
Вы просто так это написали?
Нет. В 99.9% базовый адрес exe = $40000. Можете проверить это в Process Explorer.

Хотя.... ASLR, наверно включен. Тогда да, не $40000
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 23.08.2010, 21:28   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Код:
Function GetImageBase(PID: Cardinal): dword;
var snapshot: THandle;
    modules: TModuleEntry32;
begin
  snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID);
  modules.dwSize := sizeof(TModuleEntry32);
  if Module32First(snapshot, modules) then result := dword(modules.modBaseAddr)
  else result := 0;
  CloseHandle(snapshot);
end;
Кстати, очень оригинально, особенно учитывая тот факт, что в переменной processid лежит 0
Код:
Function Tform1.GetModuleBase(PID: Cardinal; moduleName: PWideChar):dword;
var
   snapshot: THandle;
   modules: TModuleEntry32;
begin
  result := 0;
  snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId);
пыщь
JTG вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Параметр SQL Dem6 БД в Delphi 1 11.12.2009 17:51
Компилятор игнорирует ошибочный код N1KeL Помощь студентам 8 29.11.2009 21:22
отправка аипи+параметр по почте (Delphi/PHP) dyonysos Помощь студентам 0 05.10.2009 19:12
компилятор игнорирует переменные, объясните dextering Общие вопросы Delphi 23 15.06.2009 11:58
Параметр Инночка БД в Delphi 7 19.04.2008 15:33