Перегляньте відео нижче, щоб дізнатися, як встановити наш сайт як веб-програму на головному екрані.
Замітка: This feature may not be available in some browsers.
А что возникли сложности?



А что там такого сложного? Не фиг делать пройти... Правда, бывает, нужно именно угадывать, где мина, а не вычислять... Вот тогда и могут быть проколы. Ну я проходил и тоже неоднократно. НА других уровнях просто не играю - неинтересно
На новичке вкладывался только в 8 с![]()

Frosty сказав(ла):Ты программер? Тогда можно решить все как на первом курсе...[BR/]Статью вставляю с хакера ибо та, которой воспользовался когда-то я была куда менее подробной.[BR/][BR/]Для начала скопируем из системной папки сам файл winmine.exe. Осмотрим его внешне. Потыкаем по полю наугад .... ты попал на мину - проиграл, ну ладно, не беда! Смотрим верхнее меню, там есть пункт "Новая игра". Нажимаем и видим, что поле заполнено по-новому. Давайте посмотрим, что происходит по выбору этого пункта....[BR/][BR/]Загружаем Сапера в W32Dasm: [BR/][BR/]видим, что ID этого пункта меню равен [ID=01FEh]. В поиске вбиваем это значение, ищем... Находим это: [BR/][BR/]01001DD3 |.3D FE010000 CMP EAX, 1FE [BR/]01001DD8 |.0F84 EA000000 JE 01001EC8[BR/]именно тут и происходит выбор нашего пункта, идем по этому адресу. А тут: [BR/]01001EC8 |>E8 AD170000 CALL 0100367A[BR/]Хорошо, идем в эту процедуру... Она начинается так: [BR/]0100367A /$A1 AC560001 MOV EAX, DWORD PTR DS:[10056AC][BR/]0100367F |.8B0D A8560001 MOV ECX, DWORD PTR DS:[10056A8][BR/]По этим адресам лежат число клеток по X и Y, они (эти адреса) нам понадобятся!. Шагая по этой подпрограмме можно найти адрес с которого начинается рэндомно заполняющаяся карта... у меня он равен: 01005360h. Ну и начиная с этого адреса идут клетки поля, если в них находиться значение 8F, значит тут мина, иначе стоит FF, а начало и конец строки определяются как 10h, причем строчки находятся друг от друга на интервале 20h.[BR/][BR/]Этого нам достаточно для написания программы. На форме находится sg: TStringGrid... [BR/][BR/]Вот код: [BR/][BR/]unit Unit1; [BR/][BR/]interface [BR/][BR/]uses [BR/]Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, [BR/]Dialogs, StdCtrls, Grids; [BR/][BR/]type [BR/]TPole = record [BR/]x: Byte; [BR/]y: Byte; [BR/]End; [BR/][BR/]type [BR/]TForm1 = class(TForm) [BR/]Button1: TButton; [BR/]sg: TStringGrid; [BR/]procedure Button1Click(Sender: TObject); [BR/]private [BR/]SapMap: Tpole; [BR/]public [BR/]end; [BR/][BR/]var [BR/]Form1: TForm1; [BR/][BR/]implementation [BR/][BR/]{$R *.dfm} [BR/][BR/]procedure TForm1.Button1Click(Sender: TObject); [BR/]Var [BR/]hWn: HWND; [BR/]PID, hProc, dwReaded: DWord; [BR/]buf: Byte; [BR/]i, r: Dword; [BR/]StartAddr: Dword; [BR/]begin [BR/]hWn := HWND(FindWindow(nil, PChar('Сапер'))); [BR/]If IsWindow(hWn) Then [BR/]Begin [BR/]GetWindowThreadProcessId(hWn, PID); [BR/]hProc := OpenProcess(PROCESS_VM_READ, False, PID); [BR/]Try [BR/]If (hProc <> 0) Then [BR/]Begin [BR/]ReadProcessMemory(hProc, ptr($10056AC), @buf, 1, dwReaded); [BR/]SapMap.x := buf; [BR/]ReadProcessMemory(hProc, ptr($10056A8), @buf, 1, dwReaded); [BR/]SapMap.y := buf; [BR/][BR/]sg.ColCount := SapMap.x; [BR/]sg.RowCount := SapMap.y; [BR/]For i := 0 To (sg.ColCount - 1) Do [BR/]For r := 0 To (sg.RowCount - 1) Do sg.Cells[i,r] := ' '; [BR/][BR/]StartAddr := $01005361; [BR/]For i := 0 To (SapMap.y - 1) Do [BR/]Begin [BR/]For r := 0 To (SapMap.x - 1) Do [BR/]Begin [BR/]ReadProcessMemory(hProc, ptr((i*$20) + StartAddr + r), @buf, 1, dwReaded); [BR/]If (buf = $8F) Then sg.Cells[r, i] := 'X'; [BR/]End; [BR/]End; [BR/][BR/]End; [BR/]Finally [BR/]CloseHandle(hProc); [BR/]End; [BR/]End; [BR/]end; [BR/][BR/]end.


Snyp сказав(ла):гы.... ))))[br]
[br]
ну я проходил.... неоднократно..... на новичке ваще рекорд 7 секунд....
Ты программер? Тогда можно решить все как на первом курсе...
Статью вставляю с хакера ибо та, которой воспользовался когда-то я была куда менее подробной.
Для начала скопируем из системной папки сам файл winmine.exe. Осмотрим его внешне. Потыкаем по полю наугад .... ты попал на мину - проиграл, ну ладно, не беда! Смотрим верхнее меню, там есть пункт "Новая игра". Нажимаем и видим, что поле заполнено по-новому. Давайте посмотрим, что происходит по выбору этого пункта....
Загружаем Сапера в W32Dasm:
видим, что ID этого пункта меню равен [ID=01FEh]. В поиске вбиваем это значение, ищем... Находим это:
01001DD3 |.3D FE010000 CMP EAX, 1FE
01001DD8 |.0F84 EA000000 JE 01001EC8
именно тут и происходит выбор нашего пункта, идем по этому адресу. А тут:
01001EC8 |>E8 AD170000 CALL 0100367A
Хорошо, идем в эту процедуру... Она начинается так:
0100367A /$A1 AC560001 MOV EAX, DWORD PTR DS:[10056AC]
0100367F |.8B0D A8560001 MOV ECX, DWORD PTR DS:[10056A8]
По этим адресам лежат число клеток по X и Y, они (эти адреса) нам понадобятся!. Шагая по этой подпрограмме можно найти адрес с которого начинается рэндомно заполняющаяся карта... у меня он равен: 01005360h. Ну и начиная с этого адреса идут клетки поля, если в них находиться значение 8F, значит тут мина, иначе стоит FF, а начало и конец строки определяются как 10h, причем строчки находятся друг от друга на интервале 20h.
Этого нам достаточно для написания программы. На форме находится sg: TStringGrid...
Вот код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TPole = record
x: Byte;
y: Byte;
End;
type
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
Begin
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;
End;
Finally
CloseHandle(hProc);
End;
End;
end;
end.

Новичок - 9 сек;
Любитель - 55 сек;
Профи. - 276 сек!!!![]()
![]()
![]()


Новичок - 9 сек;
Любитель - 55 сек;
Профи. - 276 сек!!!![]()
![]()
![]()

Праздравляю!!! я тож очень радовался в своё времяAleon сказав(ла):Я ПРОШЕЛ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
