Перейти к содержанию

Сапёр, взлом бомб


Рекомендуемые сообщения

Тема будет не плохой тренировкой на Дельфи. Взято из интернета.

Результат на картинке (внизу).

Готовый вариант.

unit Unit1; 

interface

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

type

TPole = record
  x: Byte;
  y: Byte;
End;

TForm1 = class(TForm)
   Button1: TButton;
   sg: TStringGrid;
   procedure Button1Click(Sender: TObject);
  private
   SapMap: Tpole;
  public
  end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

Var
hWn: HWND;
PID, hProc, dwReaded: DWord;
buf: Byte;
i, r: Dword;
StartAddr: Dword;

begin
hWn := HWND(FindWindow(nil, PChar('Сапер')));
If IsWindow(hWn) Then
  Begin
  GetWindowThreadProcessId(hWn, PID);
  hProc := OpenProcess(PROCESS_VM_READ, False, PID);
  Try
    If (hProc <> 0) Then
      Begin
      ReadProcessMemory(hProc, ptr($10056AC), @buf, 1, dwReaded);
      SapMap.x := buf;
      ReadProcessMemory(hProc, ptr($10056A8), @buf, 1, dwReaded);
      SapMap.y := buf;

      sg.ColCount := SapMap.x;
      sg.RowCount := SapMap.y;
      For i := 0 To (sg.ColCount - 1) Do
      For r := 0 To (sg.RowCount - 1) Do sg.Cells[i,r] := ' ';

      StartAddr := $01005361;
      For i := 0 To (SapMap.y - 1) Do
          For r := 0 To (SapMap.x - 1) Do 
              Begin 
                 ReadProcessMemory(hProc, ptr((i*$20) + StartAddr + r), @buf, 1, dwReaded); 
                 If (buf = $8F) Then sg.Cells[r, i] := 'X'; 
              End; 
  
      End;

  Finally
  CloseHandle(hProc);
  end;

  end; //If IsWindow(hWn)
end;

end.

saper.gif

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...
  • 1 месяц спустя...
  • 4 недели спустя...

И всё-таки как ломануть Сапёра в Win7? CE при подключении отладчика выдаёт error=50. Olly при попытке открыть exe пишет Unable to start file, а в списке запущенных процессов в Olly запущенного Сапёра вообще нет. Только и получается, что адреса в CE искать без отладчика...

Ссылка на комментарий
Поделиться на другие сайты

Попробуй дизассемблером IDA (она в частности для 64-разрядных приложений) или ищи отладчики под 64-разрядные приложения. Так же возможно сапёр написан на .NET (хотя мало вероятно) и тогда и отладчик ищи под .NET.

О том на какой платформе написано приложение можешь проверить утилитами (не помню какими). ProcessXP подсветит процесс желтым если это .NET. А Paid вроде покажет 64/32 разрядное приложение или какой-нибудь протектор/пакер...

Думаю, можно и без отладчика обойтись, если "смотреть в дампе памяти флажки" (если это не .NET, с ней может быть и иначе)

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

В настройках Сапёра изменять высоту и ширину поля и искать в CE... Далее поставить адреса в исходник в первом посте и скомпилировать... Хотя перед этим надо создать сетку, кнопку и настроить всё это в визуальном редакторе...

Ссылка на комментарий
Поделиться на другие сайты

Тип 1 байт. Нужно изменять первую клетку правым щелчком мышки и искать правилом изменилось и не изменилось.

Одно состояние клетки(пустое) - будет некоторое значение байта

Другое состояние клетки (крестик, вопрос, мина при пустой клетке, мина на которой подорвался, цифра...) будет другое состояние байта.

Ссылка на комментарий
Поделиться на другие сайты

нашел адреса, при начале игры все значения адерсов имеют значение "15", а некоторые "143", смею предположить что значение "143" - мина. жму в игре на эту ячейку со значением "143" - там число.... но после первого хода соседние "143" - мины. почему так?

Ссылка на комментарий
Поделиться на другие сайты

Я не очень понял происходящее. Скорее всего, ты не правильно определяешь позицию мины. Я точно не знаю, но мне кажется, что в зависимости от версии сапёра мины в виртуальной памяти идут рядами жёстко по 32 горизонтали (для сапёра в XP). И без разницы меньше ли у тебя поле по горизонтали в текуще игре - все равно будет ряд в 32 байта.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Навеяло темой о "Function Hacker", только чит мне там не понравился.

Для Win7

Если в инструкции mov [esi+28],bl (88 5E 28 E8 3C EF FF FF) задать регистру "bl" значение "1", то, при запуске новой игры (или же открытии клетки с не_бомбой), будем видеть расположение бомб

123rej.jpg

Находится путем

0 байт - клетки с бомбами закрыты

1 байт - открыли клетку с бомбой и открылось расположение остальных бомб.

Ссылка на комментарий
Поделиться на другие сайты

ANT' date='19 Июнь 2011 - 10:10' timestamp='1308456642' post='3415']Навеяло темой о "Function Hacker", только чит мне там не понравился.

Цель видео показать как работать с программой по нахождению функций отвечающих за то или иное действие. В другой игре может и не быть адреса от значения которого что-то зависит. Это значение может быть в регистре возвращаемой функции... Может быть какое-то мимолётное время в стеке и поймать значение в стеке сканером памяти будет невозможно.

Потом для обмана игры все средства должны быть "на вооружении". С помощью Function Hacker можно случайно сделать читы о которых даже и не подумаешь.

"Function Hacker" может помочь отсеивать функции которые нужно исследовать. И если повезёт, то ты быстро найдёшь ключевые моменты в дизассемблере от которых зависит тот или иной вызов функции. Ты сможешь определить то или иное условие...

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.