Всем привет! И сегодняшняя новость будет о написании небольшой программы, которая позволит подглядывать в стандартную Windows-игру — «Сапер«. Если честно, то я до сих пор не умею толком играть в Сапера, вот и возникла такая идея, сделать такую небольшую программу, в демонстрационных целях возможностей программирования под Windows.
Для начала давайте найдем сам исполняемый файл игры Сапер и откроем его в каком-нибудь дизассемблере. Я выбрал программу W32Dasm, Вы же можете выбрать совершенно любой другой, нам просто необходимо немного проанализировать игру. Сам исполняемый файл находится в system32 под названием winmine.exe. Открываем его через программу и смотрим, что при нажатии в игре на мину, игровое поле заполняется значением 8F. То есть, это означает, что в ячейке есть мина, а нам больше и ничего и не надо, если этого значения нет, то соответственно нет и мины.
«Девелопить» программу будем в среде разработки Delphi, я выбрал IDE Delphi 7. Создаем в нем новый проект и размещаем на нем следующие компоненты:
- TStringGrid
- TButton
TStringGrid нам понадобится для того, чтобы отображать, где установлены мины, а делать это мы будем по нажатию на TButton. Итак, создали проект, теперь на событие OnClick нашей кнопки мы напишем следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
hwn:HWND;
PID,hProc,dwReader,i,j,StartAddr:DWORD;
buf:Byte;
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,dwReader);
Map.x:=buf;
ReadProcessMemory(hProc,ptr($10056A8),@buf,1,dwReader);
Map.y := buf;
StringGrid1.ColCount:=Map.x;
StringGrid1.RowCount:=Map.y;
for i:=0 to StringGrid1.ColCount-1 do
for j:=0 to StringGrid1.RowCount-1 do
StringGrid1.Cells[i,j]:='';
StartAddr:=$01005361;
for i:=0 to Map.y-1 do
begin
for j:=0 to Map.x-1 do
begin
ReadProcessMemory(hProc,ptr((i*$20)+StartAddr+j),@buf,1,dwReader);
if buf=$8F then
StringGrid1.Cells[j,i]:='X';
end;
end;
end;
finally
CloseHandle(hProc);
end;
end;
end;
Все довольно просто. Получаем дескриптор нашего окна игры «Сапер«, затем записываем в буфер память приложения, определяем размеры выбранной сетки в игре, задаем их TStringGrid и ищем в памяти те ячейки, которые равны 8F, если такая имеется, то ячейке TStringGrid присваиваем значения — «Х». Вот что у меня получилось:
Вот видите все как просто, так что теперь очень легко Вам будет в него играть, удачи. В конце статьи прикладываю программу W32Dasm и исходные коды, проверенные в IDE Delphi 7. До новых встреч, в следующих статьях!
Также советуем почитать на PressDev.RU
Короткая ссылка: http://pressdev.ru/?p=208