ntldr
22.04.2010, 20:58
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#define STRUCT_BASE 0x1005330 //VA структуры в процессе сапера, в разных билдах винды может быть по разному.
#define OBJECT_NONE 0x0F //Разные объекты на минном поле
#define OBJECT_BORDER 0x10 //граница поля
#define OBJECT_OPEN 0x40 //открытая пустая клетка
#define OBJECT_MINE_E 0x8A //Раскрытая мина
#define OBJECT_MINE 0x8F //Скрытая мина
typedef struct _MINEINFO { //Структура данных о минном поле
DWORD numOfMines; //кол-во мин
DWORD width; //Ширина поля
DWORD height; //Высота поля
DWORD reserved; // :confused:
BYTE field[27][32]; //Массив мин
} MINEINFO,*PMINEINFO;
int main()
{
DWORD pid,buf,op;
DWORD addr = STRUCT_BASE;
GetWindowThreadProcessId(FindWindow(NULL,"Сапер"),&pid); //Определяем PID по хендлу окна сапера
HANDLE hproc = OpenProcess(PROCESS_VM_READ,NULL,pid); //Открываем процесс на чтение
if(!hproc)
{
printf("Can't open process %d! Error %d!",pid,GetLastError());
_getch();
return -1;
}
PMINEINFO localfield;
localfield=(PMINEINFO)malloc(sizeof(MINEINFO)); //динамически выделяем память под массив. Можно было и статически, но я поздно это понял и решил не переделывать
ReadProcessMemory(hproc,(LPCVOID)addr,localfield,s izeof(MINEINFO),&buf); //Копируем структуру к себе
int counter = 0; //Счетчик смещения в массиве
for(int j=0;j<localfield->height+2;j++)//цикл рисует минное поле в консоли
{
for(int i=0;i<localfield->width+2;i++)
{
switch(localfield->field[j][i])
{
case OBJECT_OPEN:printf("-");break;
case OBJECT_NONE:printf("-");break;
case OBJECT_BORDER:printf("0");break;
case OBJECT_MINE:printf("*");break;
case OBJECT_MINE_E:printf("X");break;
default:if((localfield->field[j][i] & 0x40) == 0x40)//Если не объект минного поля и взведен 0х40, значит это цифра.
printf("%d",localfield->field[j][i]&0x3f);
else
printf("?",localfield->field[j][i]); //Мало ли что
break;
}
//printf(" %.2X ",localfield->field[j][i]);
counter++;
}
printf("\r\n");
}
_getch();
return 0;
}
Соответственно при запущенном сапере запустить чит, выведет положение всех мин, и других объектов, может быть кому-то пригодится.
http://dl.dropbox.com/u/3104173/pwnmine.rar - проект VS2008
http://dl.dropbox.com/u/3104173/pwnmine.exe - бинарник
Код под ANSI.
#include <conio.h>
#include <stdio.h>
#define STRUCT_BASE 0x1005330 //VA структуры в процессе сапера, в разных билдах винды может быть по разному.
#define OBJECT_NONE 0x0F //Разные объекты на минном поле
#define OBJECT_BORDER 0x10 //граница поля
#define OBJECT_OPEN 0x40 //открытая пустая клетка
#define OBJECT_MINE_E 0x8A //Раскрытая мина
#define OBJECT_MINE 0x8F //Скрытая мина
typedef struct _MINEINFO { //Структура данных о минном поле
DWORD numOfMines; //кол-во мин
DWORD width; //Ширина поля
DWORD height; //Высота поля
DWORD reserved; // :confused:
BYTE field[27][32]; //Массив мин
} MINEINFO,*PMINEINFO;
int main()
{
DWORD pid,buf,op;
DWORD addr = STRUCT_BASE;
GetWindowThreadProcessId(FindWindow(NULL,"Сапер"),&pid); //Определяем PID по хендлу окна сапера
HANDLE hproc = OpenProcess(PROCESS_VM_READ,NULL,pid); //Открываем процесс на чтение
if(!hproc)
{
printf("Can't open process %d! Error %d!",pid,GetLastError());
_getch();
return -1;
}
PMINEINFO localfield;
localfield=(PMINEINFO)malloc(sizeof(MINEINFO)); //динамически выделяем память под массив. Можно было и статически, но я поздно это понял и решил не переделывать
ReadProcessMemory(hproc,(LPCVOID)addr,localfield,s izeof(MINEINFO),&buf); //Копируем структуру к себе
int counter = 0; //Счетчик смещения в массиве
for(int j=0;j<localfield->height+2;j++)//цикл рисует минное поле в консоли
{
for(int i=0;i<localfield->width+2;i++)
{
switch(localfield->field[j][i])
{
case OBJECT_OPEN:printf("-");break;
case OBJECT_NONE:printf("-");break;
case OBJECT_BORDER:printf("0");break;
case OBJECT_MINE:printf("*");break;
case OBJECT_MINE_E:printf("X");break;
default:if((localfield->field[j][i] & 0x40) == 0x40)//Если не объект минного поля и взведен 0х40, значит это цифра.
printf("%d",localfield->field[j][i]&0x3f);
else
printf("?",localfield->field[j][i]); //Мало ли что
break;
}
//printf(" %.2X ",localfield->field[j][i]);
counter++;
}
printf("\r\n");
}
_getch();
return 0;
}
Соответственно при запущенном сапере запустить чит, выведет положение всех мин, и других объектов, может быть кому-то пригодится.
http://dl.dropbox.com/u/3104173/pwnmine.rar - проект VS2008
http://dl.dropbox.com/u/3104173/pwnmine.exe - бинарник
Код под ANSI.