Треньор правите на Visual C

В тази статия ще ви покажа как да се направи треньор, с помощта на Visual C ++. В написването на тази статия Бутнах факта, че когато аз се опитвах да се намери в интернет най-малко известна информация за това как да се направи проста треньор в VC, всички намерих бяха статии, показващи примери за C / C ++, както и главно в Делфи и MASM. Изглежда, че в тази ситуация, че е възможно да се използва материал от статии за C / C ++, ако не и едно "но" - силна привързаност VC ++ класове, в резултат на което някои API функции не се държат както трябва. По-късно ще стане ясно.







Това е, което ни трябва:

Самата игра. Избрах една интересна RPG - Avernum 3 (отнеме)

Програмата въведете GameHack TSearch или потърсете ни конкретните стойности в паметта. Аз предпочитам TSearch, защото, по мое мнение, това е най-функционалният от всички такива програми. Въпреки, че този въпрос на избор на всеки един от. (Отнемете)

Visual C ++. Аз трябва версия 6.0, така че урока ще бъдат направени по него. Версия не е много принципна, както знаете :)

HP character'a 0x00C1C050 първите 2 байта
MP character'a 0X00C1C054 първите 4 байта

HP втори character'a 0x00C1C420 2 байта
MP втори character'a 0x00C1C424 4 байта

HP трета character'a 0x00C1C7F0 2 байта
MP трета character'a 0x00C1C7F4 4 байта

HP четвърти character'a 0x00C1CBC0 2 байта
MP четвърти character'a 0x00C1CBC4 4 байта

Ние се обръщаме към най-важните и творческия процес - пишете ни треньор. Трябва ли да се направи, разбира се, с помощта на функцията API, защото тя ще бъде по-лесно, а програмата ще работи много по-бързо. Тук е необходимо да функция (вж техните описания в позоваването на API Win32):

SetTimer
FindWindow
GetThreadProcessId
OpenProcess
WriteProcessMemory
GetAsyncKeyState
KillTimer
CloseHandle

Teper ще създаде нов проект за buduyuschego треньор. Започнете Visual C и Davie File-> New. В прозореца, който се показва, изберете вида на MFC AppWizard (Търсейки), име на проекта, наберете - Avernum3tr. Davie Next. Изберете Dialog базирани. Напред. След това махнете Active X и за кутия - те ни дават не nafig необходимо. Всички Davie Finish и получавате рамка. Както можете да видите AppWizard е генерирала dialogovoo прозорец за нас, подобно на много код, който инициализира много глупости. Можете да незабавно да изтриете статичен текст и две копченца на прозореца - те също са ненужни.

Име на курса - CAvernum3trDlg
Номер на обекта е - CAvernum3trDlg
функции държави - OnIntiDialog

и кликнете върху Редактиране код. Тъй като тази функция е създадена, ние стигнем до част от код на функцията, която се нарича при създаването на нашия прозорец. Там се инициализира ни таймер. Добавен преди завръщането TRUE шевове ред:

SetTimer (1, 100, NULL);

По този начин, при стартирането на нашия треньор, ще създаде таймер. че ще изпрати съобщение до нашия прозорец WM_TIMER около 4 пъти в секунда (втори параметър). Но след като сме създали таймер при стартиране, е необходимо да го унищожи на изхода от треньор. Davie Ctrl + W отново и се добавя функцията WM_DESTROY (мисля ясно как) и PUSH Edit код. Напиши там:

Добре, да преминем към часовника на процесора. Ctrl + W и добавя WM_TIMER функция и да преминете към своя код. Тук. Тази функция ще се нарича всеки път, когато таймерът работи. Както вече сте разбрали, тогава ние ще напишете кода, който ще отговаря за наваксване натиснат клавиши и ние трябва да направим нещо, за което, всъщност, създава треньор :)







Тук ние стигаме до точката, защо. В действителност, много от статиите на писане треньор C / C ++ не е работило през ВХ. Опитайте се да напишете функция на тялото ON_WM_TIMER функция FindWindow на (и да видим на повърхността представа за параметрите на функцията:

CWnd * FindWindow (LPCTSTR lpszClassName, LPCTSTR plszWindowName);

и да я сравни с това, което имаме нужда от:

HWND FindWindow (LPCTSTR lpszClassName, LPCTSTR plszWindowName);

Фактът, че първият вариант е член функция на класа на нашите прозорци (знам, Chto звучи сложно, но все пак), и поради това се връща малко по-различен вид. Какво да се прави. И ние ще направим това тук - да създаде своя собствена независима общ клас, ние ще използваме не само в този прог. Ако имаме такъв клас, а след това следващия път, когато пишете следващата си треньор, можете просто да добавите този клас за проекта, vpisheshsya в таймер функция на тялото само за няколко линии (по-късно ще разберете защо) и всички - готово. Това, приятелю, класове - просто супер възможност PLO. Да, разбира се, че ще отнеме известно време, но велик го запишете по-късно. Не ми ли вярвате - погледнете.

Fingers фен - lepim клас:

Точно в прозореца ClassView изберете раздела и кликнете с десния бутон на Avernum3tr класове. Изберете Нов клас. В прозореца, който се показва, изберете:

тип Class Generic клас
Наименование CProcess

и Davie OK и ще видите, че той се появи в списъка на класовете на нашия проект. Ако натиснете върху иконата на "+" до името на новия ни клас, ще видите, че има две функции страни - конструктор и деструктор.
Сега ще ви покажем как да добавите една функция, а останалите, които сте добавили лично. Задръжте десния бутон на мишката върху нашия клас и изберете Добавяне на член функция. В отворилия се прозорец, напишете следното:

Функция дръжка тип
Функция Декларации cOpenProcess (Чар * p_ClassName, знак * p_WindowName)
достъп Public

HWND hWindow;
DWORD PID;

hWindow = FindWindow (p_ClassName, p_WindowName);
ако (hWindow)
GetWindowThreadProcessId (hWindow, PID);
се върне. OpenProcess (PROCESS_ALL_ACCESS фалшиво, PID);
>
върне NULL;

Трябва да получите следното:

Дръжка CProcess :: cOpenProcess (Чар * p_ClassName, знак * p_WindowName)
HWND hWindow;
DWORD PID;

hWindow = FindWindow (p_ClassName, p_WindowName);
ако (hWindow)
GetWindowThreadProcessId (hWindow, PID);
се върне. OpenProcess (PROCESS_ALL_ACCESS фалшиво, PID);
>
върне NULL;
>

По същия Макаров пиша следните функции:

булев CProcess :: FindProcess (Чар * p_WindowTitle)
ако (процес == NULL)
процес = това-> cOpenProcess (NULL, p_WindowTitle);
>
ако (процес)
isrunning = вярно;
върнете isrunning;
>
още
върне FALSE;

булев CProcess :: IsRunning ()
върнете isrunning;
>

булев CProcess :: IsKeyPressed (инт ключ)
ако (IsRunning ()) възвръщаемост ((GetAsyncKeyState (ключ) 1) == 1);
върне FALSE;
>

булев CProcess :: WriteByteToProcess (DWORD p_Adress, BYTE p_Value)
DWORD байта;

ако (isrunning)
възвръщаемост (WriteProcessMemory
(Процес (невалидни *) (p_Adress), (невалидни *) (p_Value), 1, байта) = 0)!;
>
върне FALSE;
>

О, да, щях да забравя - добави в клас на две частни променливи (вдясно click-> Добавяне на член променлива):

Дръжка pocess
булев isrunning

Отворете раздела (вдясно) FileView Avernum3trDlg.cpp файл и в горната част (в края на краищата # include'ov пиши:

Това ще създаде глобална променлива от тип CProcess нарича игра. Така че ние ще говорим за нашия клас и с играта (през него)

Сега обратно към нашия ON_WM_TIMER функция. Впише там е това парче - Мисля, че ако възникне му разбиране на проблемите:

ако (! провери)
game.FindProcess ( "Avernum 3");
>
още
ако (game.IsKeyPressed (VK_F4))
game.WriteByteToProcess (0x00c1c050, 0xFF);
game.WriteByteToProcess (0x00c1c051, 0x10);
>

ако ((проверка! GetAsyncKeyState (VK_F4)))
MessageBox ( "Zapusti igru ​​snachala.", "Lameru", MB_OK);
>

Сега съставяне на проекта и да го стартирате. Kind трябва да бъде проблем - пренаписване, като у дома си. Не пускайте игра, натиснете F4 - проклятия улов. Сега започнете играта, да създадете характер. и в игра натиснете F4 - спечелят здравето на бонуси. Други възможности за запълване само по себе си - това е за вас като домашна работа.