Смілянський форум

Ласкаво просимо

* Погода 
* Правила   * Учасники
* Вхід   * Реєстрація
Об'яви форума

Смілянський форум засвідчує свою підтримку українському народу. Ми засуджуємо дії російської влади, що нахабно ввела свої збройні сили на територію України.
Ми єдина, незалежна держава і вторгнення на нашу територію - це порушення суверенності України.
Слава Україні !


Сьогодні: 10 Грудня, 2018 11:46

Часовий пояс UTC + 2 годин [ DST ]




Створити нову тему Ця тема закрита, ви не можете редагувати повідомлення і писати відповіді  [ 4 повідомлень ] 
Автор Повідомлення
 Тема повідомлення: Трейнер с использованием WinAPI
ПовідомленняДодано: 07 Лютого, 2007 2:10 
Офлайн
Активіст
Активіст
Аватар користувача

З нами з: 20 Вересня, 2006 17:31
Повідомлення: 1109
Звідки: Aperture Laboratories
Репутація: 224
Знайшов статтю, подумав може комусь цікаво буде :)
Тільки що спробував зробить таке. Вийшло...

Вступление

Итак, в данном учебнике я попробую обьяснить и рассказать, как в 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 с использованием WinAPI [часть 2]


Вступление

Вашему вниманию предоставляется вторая часть учебника о написании небольших трейнеров на 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;

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 - это мусорогенеротор". Исходники данного трейнера можно скачать здесь.

В скором времени я планирую написать ещё один учебник, о том как бороться с DMA в Delphi.

_________________
We do what we must, because we can.


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 07 Лютого, 2007 11:45 
Офлайн
=)
Аватар користувача

З нами з: 19 Вересня, 2006 21:42
Повідомлення: 5460
Звідки: b53
Репутація: 578
зачем етот трейнер?

_________________
Зображення
Противник ищущий ваши ошибки, полезнее чем друг желающий их скрыть!


Догори
 Профіль  
 
ПовідомленняДодано: 07 Лютого, 2007 14:58 
Офлайн
Анімешник
Анімешник

З нами з: 17 Січня, 2007 22:57
Повідомлення: 2337
Репутація: 156
Rayne написав:
"Надеюсь, что данным учебником я сумел опровергнуть следующее мнение, что "Delphi - это мусорогенеротор"


=))

напомнило анегдот:
Вопрос: Как взламать банкомат?
Ответ: Берем ноутбук, кувалду, идем к банкомату, трошим его кувалдой, забираем деньги...
Вопрос: А зачем же тогда ноутбук???
Ответ: А какой же вы хакер без ноутбука?!!

Классы делфи - всего лишь обертка на вин-апи, которая глючит и тормозит не по деццки. В премере просто обошлись без этой обертки, сделав из делфей простой паскакаль :)


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 08 Лютого, 2007 19:44 
Офлайн
Експерт
Експерт
Аватар користувача

З нами з: 02 Листопада, 2006 19:48
Повідомлення: 536
Звідки: Смела
Репутація: 19
ет точно, но вопрос - нелегче в нете найти ето? на крайняк есть АртМани

_________________
http://www.maniz.com.ua/


Догори
 Профіль  
 
Показувати повідомлення за:  Сортувати за  
Створити нову тему Ця тема закрита, ви не можете редагувати повідомлення і писати відповіді  [ 4 повідомлень ] 

Часовий пояс UTC + 2 годин [ DST ]


Хто зараз онлайн

Зараз переглядають цей форум: Немає зареєстрованих користувачів і 1 гість


Ви не можете створювати нові теми у цьому форумі
Ви не можете відповідати на теми у цьому форумі
Ви не можете редагувати ваші повідомлення у цьому форумі
Ви не можете видаляти ваші повідомлення у цьому форумі
Ви не можете додавати файли у цьому форумі

Вперед:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Український переклад © 2005-2011 Українська підтримка phpBB
*Мобільна версія