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

Создаем Трейнер В Delphi, Используя Winapi


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

Ага, с правами админа заработала, только не много в другую сторону :) Надо код проверять... Ладно, спасибо за помощь, дальше придется с кодом мучаться...

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

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

Итак, в данном учебнике я попробую обьяснить и рассказать, как в Delphi пишутся трейнеры. Вы наверное сразу же подумаете, что писать трейнеры на Delphi убого,т.к. одна пустая форма в скомпилированном состоянии весит аж 300 Кб. Но я постараюсь разрушить этот миф. Писать наш трейнер мы будем без VCL. Но как же так, скажете вы? - Наш будуший трейнер будет написан на чистом WinAPI.

Приведу в свою защиту несколько фактов:

При написании программ на чистом WinAPI,скомпиленный *.exe будет весить ~15 кб (какие перспективы открываются перед нами).

Наше приложение будет работать в несколько раз быстрее.

Один, но существенный минус - нам придётся описывать всё вручную. Но мы с вами живём в век высоких технологий (хе-хе). В решении нашей задачи нам поможет программа под названием APIx. При помощи данной программы мы сможем спроектировать своё приложение как и в Delphi, но на чистом WinAPI.

Как говорится, "меньше слов, ближе к делу".

Кодинг

Я постараюсь как можно подробнее описать весь код нашего будущего трейнера. Поехали !

//Немного оптимизации

{$R-} {проверка диапазона}
{$S-} {проверка стека}
{$A+} {"выравнивание слов"}
program FlatOut;
uses
windows, messages, commctrl; //Используемые модули,только самое нужное!
var
WinClass : TWndClass; //переменная класса TWndClass для создания главного окна
hInst : HWND; //Хендл приложения
Handle : HWND; //локальный хендл
Com1 : HWND; //TGroupBox
Com2 : HWND; //TButton
Com3 : HWND; //TButton
Com4 : HWND; //TStaticText
Com5 : HWND; //TStaticText
Com6 : HWND; //TStaticText
Msg : TMSG; //сообщения
hFont : HWND; //хендл шрифта
win : hwnd; //хендл данного окна
var
WindowName : integer; //имя окна
ProcessId : integer; //ID процесса
ThreadId : integer; //Поток
buf : PChar;
HandleWindow : Integer; //хендл окна игры
write : cardinal;
const //id наших контролов
id_1 = 1; //TGroupBox
id_2 = 2; //TButton
id_3 = 3; //TButton
id_4 = 4; //TStaticText
id_5 = 5; //TStaticText
id_6 = 6; //TStaticText
const
WindowTitle = 'Flat-Out'; //конец формы, начало формы, точный заголовок игры
Address = $01B40C64; //адрес нашего значения в памяти игры
PokeValue = $FFFFFFFF; //значение на которое мы будем менять
NumberOfBytes = 4; //кол-во байт
{$R XPMan.res} //Здесь у меня лежит иконка моего трейнера и манифес,
//это для того что бы все контролы были в стиле XP
procedure Cheating; //Собственно сама процедура изменения значения
begin
WindowName := FindWindow(nil,WindowTitle); //находим окно игры
If WindowName = 0 then //или,обьясняем пользователю чтобы
begin //он запустил игру
MessageBox(win,'Вначале игра,а потом трейнер.','Ошибка',MB_OK or MB_ICONINFORMATION);
end;

ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
GetMem(buf,1);
buf^ := Chr(PokeValue);
WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write);//пишем в наш адресс наше значение
FreeMem(buf);
CloseHandle(HandleWindow);//конец формы, началоформы, закрываем хэндл, чтобы не вылететь с ошибкой
end;

procedure ShutDown; //процедура выхода из программы
begin
DeleteObject(hFont); //удаляем шрифт
UnRegisterClass('Sample Class', hInst); //удаляем окно
ExitProcess(hInst); //закрываем окно
Halt; //на всякий случай
end;

procedure About; //наше окно о программе
begin
MessageBox(win, ' [C0DED]: bY g-l-u-k [TeaM - X] ' +#13#10+
' ' +#13#10+
' GreatZzz....: ' +#13#10+
' ' +#13#10+
' Baron_Gede,6aHguT,AllexY ' +#13#10+
' And all TeaM - X Members ! ' +#13#10+
' ' +#13#10+
' Write on pure Delphi (WinAPI) ' +#13#10+
' Сopyright (g-l-u-k)R 2004-2005 ' +#13#10+
' ' +#13#10+
' http://www.team-x.ru ' +#13#10+
' e-mail : g-l-u-k@rambler.ru ' +#13#10+
' ' +#13#10+
' GEngine v0.1 ' +#13#10+
' All Right Reserved ',
'About',MB_OK or MB_ICONINFORMATION);
end;

function WindowProc(hwnd, msg, wparam, lparam: longint): longint; stdcall; //обработчик сообщений
begin
Result := DefWindowProc(hwnd, msg, wparam, lparam);
case Msg of
WM_COMMAND:
case LoWord(wParam) of
id_2 :
if HiWord(wParam) = bn_Clicked then
About; //если пользователь нажимает на кнопку "About",получат свой About
id_3 :
if HiWord(wParam) = bn_Clicked then
ShutDown; //если выход то......
end;

WM_DESTROY:
ShutDown;
end;
end;
begin
hInst := GetModuleHandle(nil);
with WinClass do
begin
Style := CS_PARENTDC; //стиль класса главного окна
hIcon := LoadIcon(hInstance, IDI_APPLICATION); //иконка программы
lpfnWndProc := @WindowProc; //назначение обработчика сообщений
hInstance := hInst;
hbrBackground := COLOR_BTNFACE + 1; //цвет окна
lpszClassName := 'Sample Class'; //класс окна
hCursor := LoadCursor(0, IDC_ARROW); //активный курсор
end;

InitCommonControls;
RegisterClass(WinClass); //регистрация класса в сис-ме
{Создание главного окна программы}
Handle := CreateWindowEx(0, 'Sample Class', '[FlatOut] Trainer +1',
WS_OVERLAPPED or WS_SYSMENU or
WS_VISIBLE,
503, 345, 234, 222,
0, 0,
hInst, nil);
{Создание шрифта}
hFont := CreateFont(
-12, 0, 0, 0, 0, 0, 0, 0,
DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH or FF_DONTCARE, 'Terminal');
Com1:=CreateWindow(
'Button',
'Trainer Options:' ,
WS_CHILD or BS_GROUPBOX or WS_VISIBLE,
2,2,222,165, Handle, id_1, hInst,nil);
SendMessage(Com1,WM_SETFONT,hFont,0);
Com2 := CreateWindow(
'Button',
'About',
WS_CHILD or BS_TEXT or WS_VISIBLE,
3, 171, 74, 20,Handle, id_2, hInst, nil);
SendMessage(Com2,WM_SETFONT,hFont,0);
Com3 := CreateWindow(
'Button',
'Quit',
WS_CHILD or BS_TEXT or WS_VISIBLE,
148, 171, 74, 20,Handle, id_3, hInst, nil);
SendMessage(Com3,WM_SETFONT,hFont,0);
Com4 :=CreateWindow(
'Static',
'[F1] :...: More Money' ,
WS_CHILD or SS_LEFT or SS_NOTIFY or WS_VISIBLE,
51,25,117,17,Handle, id_4, hInst,nil);
SendMessage(Com4,WM_SETFONT,hFont,0);
Com5:=CreateWindow(
'Static',
'[C0DED] :...: g-l-u-k [TeaM - X]' ,
WS_CHILD or SS_LEFT or SS_NOTIFY or WS_VISIBLE or WS_DISABLED,
32,145,180,17,Handle, id_5, hInst,nil);
SendMessage(Com5,WM_SETFONT,hFont,0);
Com6:=CreateWindow(
'Static',
'[R.Mouse] :...: About Box ' ,
WS_CHILD or SS_LEFT or SS_NOTIFY or WS_VISIBLE,
26,50,190,17,Handle, id_6, hInst,nil);
SendMessage(Com6,WM_SETFONT,hFont,0);
//Цикл сбора сообщений
while(GetMessage(Msg, Handle, 0, 0)) do
begin
TranslateMessage(Msg); //приём сообщений
if (GetAsyncKeyState(vk_f1 ) <> 0) then Cheating; //если нажата клавиша F1,читим игру
if (GetAsyncKeyState(vk_RButton) <> 0) then About; //если нажата правая кнопка мыши,то показываем About
if (GetAsyncKeyState(vk_Escape ) <> 0) then ShutDown;
DispatchMessage(Msg); //удаление сообщений из очереди
end;

end.

Как вы видите писать трейнеры в Delphi на чистом WinAPI не так уж и сложно. У меня размер EXE файла получился ~19 кб (Попробуйте меньше). В следующей статье я раскажу вам второй способ написания трейнера на WinAPI

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

Вашему вниманию предоставляется вторая часть учебника о написании небольших трейнеров на Delphi c использованием WinAPI.Данная статья поможет тем,кто по каким-то причинам не разобрался или не понял,как пишутся маленькие по размеру трейнера из предыдущей части данного учебника.На сей раз мы будем писать наш трейнер на WinAPI с использованием ресурсов.Данный способ намного проше,чем первый,а так же я приведу пример как блокировать программы,которые шпионят за нашим трейнером.Опять-таки приведу аргументы в пользу данного метода написания трейнеров:

" Писать нам наш трейнер будет легче,так как работаем мы с ресурсами.Для этого нам нужен хороший редактор ресурсов (Restorator или ResHaker),я предпочитаю 2-ой. " По идеи данный способ позволит нам скостить ~ 1-1,5 кб.

В крайности я вдаваться не буду,так что приступим.

Кодинг

Для начала нам придётся создать в блокноте файл trainer.rc,который будет содержать следующие строки:

======================trainer.rc============================

100 DIALOG 0, 0, 173, 69
STYLE DS_SETFONT | DS_CENTER | WS_CAPTION | WS_SYSMENU
CAPTION "[FlatOut] Trainer +1"
FONT 8, "Terminal"
{
PUSHBUTTON "About", 102, 2, 52, 36, 15, BS_FLAT
PUSHBUTTON "Close", 101, 132, 52, 38, 15, BS_FLAT
GROUPBOX "Trainer options: ", -1, 1, -1, 172, 51
LTEXT "[C0DED] <--::--> bY g-l-u-k [TeaM - X]", -1, 7, 36, 164, 12, WS_DISABLED
LTEXT "[F1] :.......: More Money", -1, 7, 9, 126, 12, WS_DISABLED
}

======================trainer.rc============================

После создания этого файла перетащите его на brcc32.exe,который лежит в папке "Program Files\Borland\Delphi7\Lib".После этого получам trainer.res,который подлинкуем к нашему трейнеру.

program FlatOut; //Опять будем ломать FlatOut

uses

windows, messages

; //Именно по этому наш трейнер должен весить

//меньше,если помните то в прошлой части учебника мы использовали //ещё и commctrl.

const
ID_ABOUT = 102; //Номера контролов нашего ресурса
ID_EXIT = 101;
Elapse = 10; //Нужен для таймера
aboutcap = 'About'; //Наш About Dialog
aboutmsg = ' [C0DED]: bY g-l-u-k [TeaM - X] ' +#13#10+
' ' +#13#10+
' GreatZzz....: ' +#13#10+
' ' +#13#10+
' Baron_Gede,6aHguT,AllexY ' +#13#10+
' And all TeaM - X Members ! ' +#13#10+
' ' +#13#10+
' Write on pure Delphi (WinAPI) ' +#13#10+
' copyright (g-l-u-k)R 2004-2005 ' +#13#10+
' ' +#13#10+
' http://www.team-x.ru ' +#13#10+
' e-mail : g-l-u-k@rambler.ru ' +#13#10+
' ' +#13#10+
' GEngine v0.1 ' +#13#10+
' All Right Reserved ';

WindowTitle = 'Flat-Out'; //Название окна игры
Address = $01B40C64;//Адресс нашего значения
PokeValue = $FFFFFFFF;//наше значение
NumberOfBytes = 4;//Кол-во байт

var
Msg : TMSG;
Win : HWND;
WindowName : Integer;
ProcessId : Integer;
ThreadId : Integer;
hInst : Dword;
Buf : PChar;
HandleWindow : Integer;
Write : Cardinal;

{$R trainer.res} //Наш ресурс в котором хранится окно трейнера

//Вот самая интересная часть нашего трейнера,процедура роверки.

//Если TrainerSPY активен,то мы обломим следящего за нашим //трейнером.

function IsTrainerSpyActive:bool;
var
hProcess,hKernel:dword;
addr:pointer;
b:byte;
dummy:cardinal;
proc:pchar;
begin
result:=false;
proc:='WriteProcessMemory';
if FindWindowExA(0,0,nil,'Trainer Spy')<>0 then
begin
result:=true;
exit;
end;

hProcess:=GetCurrentProcess;
hKernel:=LoadLibrary('kernel32.dll');
if hKernel<>0 then
begin
addr:=GetProcAddress(hKernel,proc);
ReadProcessMemory(hProcess,addr,@b,1,dummy);
FreeLibrary(hKernel);
if b=204 then result:=true;
end;
end;

//Процедура взлома игры,описывать полностью не буду,опишу только //самое главное.

procedure Cheating;
begin
if IsTrainerSpyActive then //если TrainerSpy запушен, то вырубаемся
begin
MessageBox(0,'Выруби шпион.','Ошибка зашиты',MB_OK or MB_ICONERROR);
exit;
end;

WindowName := FindWindow(nil,WindowTitle);
If WindowName = 0 then
begin
MessageBox(win,'Игра должна быть запушенна до трейнера','Ошибка',MB_OK or MB_ICONINFORMATION);
end;

ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);

GetMem(buf,1);
buf^ := Chr(PokeValue);
WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write);
FreeMem(buf);
CloseHandle(HandleWindow);
end;

procedure Quit; //процедура выхода из программы
begin
EndDialog(win,0);
Halt;
end;[/code

[code]procedure DoTimer; //Дополнительна зашита от шпионов
begin
CreateFileA('C:\logwmemory.bin',$40000000,1,nil,2,1,0);
hInst:= GetModuleHandle(nil);
SetTimer(hInst,1,Elapse,@DoTimer);
end;

//Обработчик событий нашего окна
function SettingsDlgProc(Window : hWnd; Msg,WParam,LParam : Integer): Integer; StdCall;
begin
case Msg of
wm_InitDialog : begin
end;

wm_Close : DestroyWindow(Win);
wm_Destroy : PostQuitMessage(0);
end;

Result := 0;
case Msg of
WM_COMMAND : begin
if wParam = ID_EXIT then Quit; //Ели нажата кнопка выхода,выходим
if wParam = ID_ABOUT then MessageBox(Win,aboutmsg,aboutcap,MB_OK or MB_ICONINFORMATION);//А это наш //about
end;
end;
end;

//Процедура создания главного окна
Procedure RunSettings;
begin
Win := CreateDialog(hInstance,PCHar(100),0,@SettingsDlgProc);
Showwindow(Win,SW_SHOW);
Updatewindow(Win);
end;
begin
RunSettings;
while GetMessage(Msg,0,0,0) do
begin
//Цикл сбора сообщений
TranslateMessage(Msg);
if (GetAsyncKeyState(VK_F1) <> 0) then Cheating;//Горячая клавиша
DispatchMessage(Msg);
end;

end.

В заключении данного учебника я ещё раз повторюсь, что писать трейнера на Delphi не только можно но и нужно. У меня трейнер получился ~19 кб. После сжатия FSG 2.0 вышло ~11 кб, ну это уже по божески. От себя я добавлю следующее, "Delphi самый простой в изучении язык программирования. "Надеюсь, что данным учебником я сумел опровергнуть следующее мнение, что "Delphi - это мусорогенеротор".

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

Ага, значит Глюк и статья у меня под носом!)))

Такс, товарисч пользователь-=CaliberWerkz=-, в будущем обязательно добавлять автора, откуда взято и тп. Иначе буду расценивать как грабеж и наказывать соответствующие.

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

  • 1 год спустя...
  • 1 год спустя...
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...

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

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