Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
dailydose
overmind
336 / 116 / 30
Регистрация: 21.07.2016
Сообщений: 573
#1

Динамическое приложение с использованием шаблонов/конфигов - C++

29.07.2016, 12:00. Просмотров 939. Ответов 45
Метки нет (Все метки)

Есть файл main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <windows.h>
 
int main(int argc, char* argv)
{
    int number;
    std::cin >> number;
 
    if(number == 1)
        // read file First.cfg
    else if(number == 2)
        // read file Two.cfg
    else
        // write error
 
    MYTYPE variable = myData;
    std::cout << variable << std::endl;
    return 0;
}
и есть так называемые конфиг файлы
Цитата Сообщение от First.cfg
MYTYPE = int
myData = 1234567
Цитата Сообщение от Two.cfg
MYTYPE = unsigned char
myData = 15
Как можно организовать данную затею?

з.ы. для полноты картины:
main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <windows.h>
 
int main(int argc, char* argv)
{
    /*
        здесь код для получения нужных значений из конфига
    */
    struct Character {
        TYPE_HEALTH hp;
        TYPE_ARMOUR ap;
        TYPE_MONEY money;
    };
    struct modules { unsigned long health, armour, money, magazine, ammo, gren; };
 
    DWORD offsetsHealth[] = { OFFSETS_HEALTH };
    DWORD offsetsArmour[] = { OFFSETS_ARMOUR };
    DWORD offsetsMoney[] = { OFFSETS_MONEY };
    modules module;
 
    module.health = getModule(MODULE_HEALTH, pId);
    module.armour = getModule(MODULE_ARMOUR, pId);
    module.money = getModule(MODULE_MONEY, pId);
 
    ptr.health = getPointer(module.health, ADR_HEALTH, offsetsHealth, cnt.health);
    ptr.armour = getPointer(module.armour, ADR_ARMOUR, offsetsArmour, cnt.armour);
    ptr.money = getPointer(module.money, ADR_MONEY, offsetsMoney, cnt.money);
 
    /*
        здесь остальной код программы
    */
 
    std::cin.get();
    return 0;
}

gtavc.cfg
Кликните здесь для просмотра всего текста
Код
// +++++++++++++++++++++++++++++++ //
GAME_PROCESS = "gtavc.exe"
TRAINER_TITLE = "GTA Vice City Trainer +3"

// x86 = 32
// x64 = 64
CPU_BIT = 32
// +++++++++++++++++++++++++++++++ //

// 1 byte  = unsigned char
// 2 bytes = short
// 4 bytes = int
// float   = float
TYPE_HEALTH =  int
ADR_HEALTH = 0x00168A4C
MODULE_HEALTH = "Core.dll"
OFFSETS_HEALTH = 0x480

TYPE_ARMOUR = float
ADR_ARMOUR = 0x00168A4C
MODULE_ARMOUR = "Core.dll"
OFFSETS_ARMOUR = 0x774

TYPE_MONEY float
ADR_MONEY = 0x1498EA2
MODULE_MONEY = "gtavc.exe"
OFFSETS_MONEY = 0x3b4

hl.cfg
Кликните здесь для просмотра всего текста
Код
// +++++++++++++++++++++++++++++++ //
GAME_PROCESS = "hl.exe"
TRAINER_TITLE = "Half-Life Trainer +3"

// x86 = 32
// x64 = 64
CPU_BIT = 32
// +++++++++++++++++++++++++++++++ //

// 1 byte  = unsigned char
// 2 bytes = short
// 4 bytes = int
// float   = float
TYPE_HEALTH = unsigned char
ADR_HEALTH = 0x00768B4C
MODULE_HEALTH = "hl.exe"
OFFSETS_HEALTH = 0x123

TYPE_ARMOUR = short
ADR_ARMOUR = 0x00668A42
MODULE_ARMOUR = "hl.dll"
OFFSETS_ARMOUR = 0x5a0

TYPE_MONEY = float
ADR_MONEY = 0x2428EA1
MODULE_MONEY = "hl.exe"
OFFSETS_MONEY = 0x3b4


Добавлено через 6 минут
На данный момент использую подключение файла config.h с таким вот содержимым
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#pragma once
#ifndef SETTINGS_H
#define SETTINGS_H
 
 
// +++++++++++++++++++++++++++++++ //
#define GAME_PROCESS "KFGame.exe"
#define TRAINER_TITLE "Killing Floor 2 Trainer +3"
 
// x86 = 32
// x64 = 64
#define CPU_BIT 64
// +++++++++++++++++++++++++++++++ //
 
// 1 byte  = unsigned char
// 2 bytes = short
// 4 bytes = int
// float   = float
#define TYPE_HEALTH int
#define ADR_HEALTH 0x021817C8
#define MODULE_HEALTH "KFGame.exe"
#define OFFSETS_HEALTH 0x714,0x0,0x68,0x460,0x384
 
#define TYPE_ARMOUR unsigned char
#define ADR_ARMOUR 0x021817C8
#define MODULE_ARMOUR "KFGame.exe"
#define OFFSETS_ARMOUR 0x714,0x0,0x68,0x460,0xb40
 
#define TYPE_MONEY float
#define ADR_MONEY 0x021817C8
#define MODULE_MONEY "KFGame.exe"
#define OFFSETS_MONEY 0x714,0x0,0x68,0x254,0x244
 
#endif

Это работает, но:
-Каждый раз нужно менять содержимое этого файла под конкретную игру
-Каждый раз после внесения изменений в этот конфиг нужно снова компилировать приложение
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2016, 12:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическое приложение с использованием шаблонов/конфигов (C++):

Задача с использованием шаблонов классов в С++ - C++
Помогите пожалуйста подредактировать задачу: Разработайте программу, которая бы выполняла одно из указанных пользователем арифметических...

Cоздание итератора с использованием шаблонов - C++
Привет всем! Возникла следующая проблема в шаблонной функции класса возникоет следующая проблемма: expected `;' before 'p' ...

Переписать код с использованием шаблонов - C++
Помогите переписать код через шаблоны , не совсем ясно понимаю , как их в данном случае использовать.. #include &lt;iostream&gt; ...

Выбор валидной функции с использованием шаблонов - C++
Допустим у нас есть две шаблонные функции. Я хочу сделать так, чтобы в случае если может быть вызвана первая, подставлялась она. А во...

Среднее геометрическое с использованием перегруженных функций и шаблонов - C++
Уважаемые форумчане, помогите написать программу: Нужно разработать программу определяющую среднее геометрическое для заданного набора...

Не получается правильно объявить friend перегрузку оператора с использованием шаблонов - C++
Всем привет! Посмотрите код и во вложениях скриншот ошибок, и, пожалуйста, подскажите, что сделал не так. А то я правда уже не знаю, что...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dailydose
overmind
336 / 116 / 30
Регистрация: 21.07.2016
Сообщений: 573
30.07.2016, 12:36  [ТС] #16
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Дайте пользователям возможность выставлять health в конфигах, но тип этого самого health - не их забота.
эти конфиги создаются другим приложением написанным на C++ (CheatTable converter) которое позже напишу.
т.е. есть таблица указателей созданная в CheatEngine. сохраняем её $game_name$.ct.
конвертером преобразую данные из этой таблицы .ct в свой конфиг .cfg/.ini
а это значит что пользователи там врядли будут ковыряться, а если и чтото поменяют - то это их проблема что программа где-то не так работает
// 1 byte = unsigned char
// 2 bytes = short
// 4 bytes = int
// float = float
#define TYPE_HEALTH int
#define ADR_HEALTH 0x021817C8
#define MODULE_HEALTH "KFGame.exe"
#define OFFSETS_HEALTH 0x714,0x0,0x68,0x460,0x384
Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Посмотрите на гигантов, типа Civilization, TES, Fallout
я делаю не игру, а трейнер для любой игры

0
HelicopterK52
30.07.2016, 12:38
  #17

Не по теме:

Цитата Сообщение от dailydose Посмотреть сообщение
я делаю не игру, а трейнер для любой игры
Думаете получится? Даже с ArtMoney не всегда получается "почитерить", а уж с универсальным трейнером - тем более.

0
dailydose
overmind
336 / 116 / 30
Регистрация: 21.07.2016
Сообщений: 573
30.07.2016, 12:43  [ТС] #18
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Думаете получится? Даже с ArtMoney не всегда получается "почитерить", а уж с универсальным трейнером - тем более.
тем не менее всё работает, пока для двух игр Killing Floor и Killing Floor 2, и это не предел
чтобы добавить еще одну игру нужно просто найти указатели на нужные данные, с помощью CheatEngine/ArtMoney/etc,,

Сейчас чтобы получить трейнер для KF1
нужно в проекте просто поменять конфиг
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#pragma once
#ifndef SETTINGS_H
#define SETTINGS_H
 
 
// +++++++++++++++++++++++++++++++ //
#define GAME_PROCESS "KillingFloor.exe"
#define TRAINER_TITLE "Killing Floor Trainer +3"
 
// x86 = 32
// x64 = 64
#define CPU_BIT 32
// +++++++++++++++++++++++++++++++ //
 
// 1 byte  = unsigned char
// 2 bytes = short
// 4 bytes = int
// float   = float
#define TYPE_HEALTH int
#define ADR_HEALTH 0x00168A4C
#define MODULE_HEALTH "Core.dll"
#define OFFSETS_HEALTH 0x480
 
#define TYPE_ARMOUR float
#define ADR_ARMOUR 0x00168A4C
#define MODULE_ARMOUR "Core.dll"
#define OFFSETS_ARMOUR 0x774
 
#define TYPE_MONEY float
#define ADR_MONEY 0x1684AC
#define MODULE_MONEY "Core.dll"
#define OFFSETS_MONEY 0x3b4
 
#define TYPE_MAGAZINE int
#define ADR_MAGAZINE 0x00168A4C
#define MODULE_MAGAZINE "Core.dll"
#define OFFSETS_MAGAZINE 0x43c,0x5a0
 
#define TYPE_AMMO int
#define ADR_AMMO 0x00168A4C
#define MODULE_AMMO "Core.dll"
#define OFFSETS_AMMO 0x43c,0x3c8,0x3bc
 
#define TYPE_GREN int
#define ADR_GREN 0x16926C
#define MODULE_GREN "Core.dll"
#define OFFSETS_GREN 0x3c8,0x3bc
 
#endif
и скомпилировать проект
абсолютно также и для игры KF2:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#pragma once
#ifndef SETTINGS_H
#define SETTINGS_H
 
 
// +++++++++++++++++++++++++++++++ //
#define GAME_PROCESS "KFGame.exe"
#define TRAINER_TITLE "Killing Floor 2 Trainer +3"
 
// x86 = 32
// x64 = 64
#define CPU_BIT 64
// +++++++++++++++++++++++++++++++ //
 
// 1 byte  = unsigned char
// 2 bytes = short
// 4 bytes = int
// float   = float
#define TYPE_HEALTH int
#define ADR_HEALTH 0x021817C8
#define MODULE_HEALTH "KFGame.exe"
#define OFFSETS_HEALTH 0x714,0x0,0x68,0x460,0x384
 
#define TYPE_ARMOUR unsigned char
#define ADR_ARMOUR 0x021817C8
#define MODULE_ARMOUR "KFGame.exe"
#define OFFSETS_ARMOUR 0x714,0x0,0x68,0x460,0xb40
 
#define TYPE_MONEY float
#define ADR_MONEY 0x021817C8
#define MODULE_MONEY "KFGame.exe"
#define OFFSETS_MONEY 0x714,0x0,0x68,0x254,0x244
 
#define TYPE_MAGAZINE short
#define ADR_MAGAZINE 0x021842B0
#define MODULE_MAGAZINE "KFGame.exe"
#define OFFSETS_MAGAZINE 0x8,0x27c,0x470,0x4a4,0x3ac
 
#define TYPE_AMMO int
#define ADR_AMMO 0x021842B0
#define MODULE_AMMO "KFGame.exe"
#define OFFSETS_AMMO 0x8,0x27c,0x7f4,0x4a4,0x558
 
#define TYPE_GREN unsigned char
#define ADR_GREN 0x021842B0
#define MODULE_GREN "KFGame.exe"
#define OFFSETS_GREN 0x38,0x284,0x49c,0x298
 
#endif
так что особого труда нет переделать трейнер под любую игру - нужно лишь знать только указатели

Добавлено через 1 минуту
с друзьями на разных машинах в сингл-плеере тестили - всё ок, с этим проблем нет. проблема в универсальности
0
HelicopterK52
30.07.2016, 12:47
  #19

Не по теме:

Цитата Сообщение от dailydose Посмотреть сообщение
чтобы добавить еще одну игру нужно просто найти указатели на нужные данные
Может я Вас разочарую, но этого не всегда достаточно

0
Ferrari F1
=^_^=
571 / 458 / 94
Регистрация: 27.01.2015
Сообщений: 2,696
Записей в блоге: 1
Завершенные тесты: 1
30.07.2016, 12:50 #20
Цитата Сообщение от dailydose Посмотреть сообщение
пока для двух игр Killing Floor и Killing Floor 2, и это не предел
Я сам играю в killing floor, все эти "читерные" значения(лаве, хп, броня, патроны, опыт (на рпг серверах) - все это хранится на стороне сервера), так что есть сомнения в реальной работе твоего чита в сетке (про взлом параметров в одиночке можешь не писать).
Единственное, что мне удалось "поломать", так это steam id, чтобы баны обходить, причем играю на non steam клиенте игры на соотв. no steam серверах, чего уж говорить про нормальные сервера с VAC'ом
0
dailydose
overmind
336 / 116 / 30
Регистрация: 21.07.2016
Сообщений: 573
30.07.2016, 12:57  [ТС] #21

Не по теме:

Ferrari F1,
спасибо, очень ценная информация

Цитата Сообщение от Ferrari F1 Посмотреть сообщение
твоего чита в сетке
эм...
Цитата Сообщение от dailydose Посмотреть сообщение
с друзьями на разных машинах в сингл-плеере тестили - всё ок


Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Может я Вас разочарую, но этого не всегда достаточно
а что еще может понадобиться?
0
Ferrari F1
=^_^=
571 / 458 / 94
Регистрация: 27.01.2015
Сообщений: 2,696
Записей в блоге: 1
Завершенные тесты: 1
30.07.2016, 13:05 #22
При всем при том, игра написана на UnrealScript, а в нем стандартные типы, как я понял реализованы через классы (как в C#), ковырялся я как-то ради интереса отладчиком в игре, так там вся инфа численная проходит через сопроцессор, т.е. что int , что double - все вычисляется в сопроцессоре. Пытался-пытался, да и плюнул я на все это, мутно там все...

Добавлено через 5 минут
Цитата Сообщение от dailydose Посмотреть сообщение
а что еще может понадобиться?
чтобы реально нормальные читы писать нужно уметь дизассемблировать, потому что взлом игр - это частный случай крекинга, нужно знать win api, также если разрабы предоставляют sdk по игре, можно писать читы и с его помощью (например всякие валхаки, аимы, спидхаки в контре пишутся с использованием вызовов функций source sdk)
1
minore
243 / 117 / 28
Регистрация: 05.02.2015
Сообщений: 652
30.07.2016, 14:01 #23
Кстати, по теме вашего вопроса: я тут подумал, а почему бы не сделать так:
1) создаем класс, в котором изначально все поля имеют максимальный тип (double)
2) создаем функцию - конвертор. в нее передаем 2 параметра: считанный тип переменной, в которую нужно перевести (int) , например, и т.д. и второй аргумент - сама переменная, обязательно передавать по ссылке, не по значению.
в теле функции конвертируем: если первый аргумент double - т.е. совпадает с максимальным, просто возвращаем, ничего не делая.если там другое слово - ну тут уже без if не обойтись, хотя типов переменных сравнительно немного.
далее читаем файл, после прочтения каждой строки вызываем нашу функцию преобразователь с соответствующими параметрами. почему бы и нет?
0
hoggy
Нарушитель
6589 / 2770 / 476
Регистрация: 15.11.2014
Сообщений: 6,123
Завершенные тесты: 1
30.07.2016, 15:11 #24
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от minore Посмотреть сообщение
Кстати, по теме вашего вопроса: я тут подумал, а почему бы не сделать так:
не расширяемый говнокод.
1
dailydose
overmind
336 / 116 / 30
Регистрация: 21.07.2016
Сообщений: 573
30.07.2016, 15:18  [ТС] #25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
#include<Windows.h>
 
#define TYPE_HEALTH int
#define TYPE_ARMOUR float
 
struct Hero
{
    TYPE_HEALTH hp;
    TYPE_ARMOUR ap;
};
 
int main()
{
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 5892);
    Hero hero;
 
    ReadProcessMemory(hProc, (LPCVOID)0x2F7FA480, &hero.hp, sizeof(TYPE_HEALTH), NULL);
    ReadProcessMemory(hProc, (LPCVOID)0x2F7FA774, &hero.ap, sizeof(TYPE_ARMOUR), NULL);
 
    std::cout << "Your health = " << hero.hp << std::endl;
    std::cout << "Your armour = " << hero.ap << std::endl;
    return 0;
}
0
Миниатюры
Динамическое приложение с использованием шаблонов/конфигов  
minore
243 / 117 / 28
Регистрация: 05.02.2015
Сообщений: 652
30.07.2016, 15:21 #26
зато рабочий и пишется за 2 секунды.
1
dailydose
overmind
336 / 116 / 30
Регистрация: 21.07.2016
Сообщений: 573
30.07.2016, 15:27  [ТС] #27
minore,
Цитата Сообщение от minore Посмотреть сообщение
) создаем класс, в котором изначально все поля имеют максимальный тип (double)
пробовал заменить TYPE_HEALTH и TYPE_ARMOUR на double... в итоге ReadProcessMemory неправильно считывает инфу

Цитата Сообщение от main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
#include<Windows.h>
 
//#define TYPE_HEALTH int
//#define TYPE_ARMOUR float
 
struct Hero
{
    double hp;
    double ap;
};
 
int main()
{
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 5892);
    Hero hero;
 
    ReadProcessMemory(hProc, (LPCVOID)0x2F7FA480, &hero.hp, sizeof(int), NULL);
    ReadProcessMemory(hProc, (LPCVOID)0x2F7FA774, &hero.ap, sizeof(float), NULL);
 
    std::cout << "Your health = " << hero.hp << std::endl;
    std::cout << "Your armour = " << hero.ap << std::endl;
    return 0;
}
Your health = -9.25596e+61
Your armour = -9.25596e+61
Для продолжения нажмите любую клавишу . . .

Добавлено через 5 минут
кстати, была похожая идея, но вместо double использовать void*
C++
1
2
3
4
5
struct Hero
{
    void* hp;
    void* ap;
};
0
minore
243 / 117 / 28
Регистрация: 05.02.2015
Сообщений: 652
30.07.2016, 15:30 #28
я про cin.getline говорил. в переменной double или float мы можем хранить 4, а в переменной int - 3.2456 никак. ну если разобрались - хорошо.
1
dailydose
overmind
336 / 116 / 30
Регистрация: 21.07.2016
Сообщений: 573
30.07.2016, 15:32  [ТС] #29
Собственно вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream>
#include<Windows.h>
 
//#define TYPE_HEALTH int
//#define TYPE_ARMOUR float
 
struct Hero
{
    void* hp;
    void* ap;
};
 
int main()
{
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 5892);
    Hero hero;
    int iTmp;
    float fTmp;
 
    ReadProcessMemory(hProc, (LPCVOID)0x2F7FA480, &iTmp, sizeof(int), NULL);
    hero.hp = &iTmp;
    ReadProcessMemory(hProc, (LPCVOID)0x2F7FA774, &fTmp, sizeof(float), NULL);
    hero.ap = &fTmp;
 
    std::cout << "Your health = " << *((int*)hero.hp) << std::endl;
    std::cout << "Your armour = " << *((float*)hero.ap) << std::endl;
    CloseHandle(hProc);
    return 0;
}
Your health = 69
Your armour = 60.25
Для продолжения нажмите любую клавишу . . .
Не знаю что из этого выйдет... Позже отпишусь
0
minore
243 / 117 / 28
Регистрация: 05.02.2015
Сообщений: 652
30.07.2016, 15:53 #30
Повторюсь, Моя версия подходит к первоначальным заданным вами условиям: имеем конфигурационный файл, каждая запись которого состоит из 2 строк:
тип переменной
значение.
чтение файла происходит с помощью библиотеки <iostream>.
и желание сделать так, чтобы h файл не трогать, и программу не собирать каждый раз.
поскольку сначала определяется тип переменной, а уж потом присваивается значение, этот "говнокод" становится универсальным. при использовании другого подхода к извлечению данных из файла данный метод может оказаться абсолютно не работоспособным.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2016, 15:53
Привет! Вот еще темы с ответами:

Сортировка массива с использованием алгоритма стандартной библиотеки шаблонов Sort() - C++
6.Напишите программу на языке программирования С++, сортирующую массив с использованием алгоритма стандартной библиотеки шаблонов sort().

Структура для хранения массива произвольного типа с использованием шаблонов - C++
Здравствуйте. Помогите, пожалуйста, разобраться с кодом программы. Необходимо реализовать структуру для хранения массива произвольного...

Переписать с использованием шаблонов программу поиска заданного слова в файле - C++
Подскажите, пожалуйста, как представить эту задачу,оформив каждый пункт в виде шаблона функции. Все необходимые данные для функций должны...

Поиск с заменой с использованием шаблонов в середине фрагмента эталона для поиска - C++
Написать программу, обеспечивающую поиск с заменой с использованием шаблонов в середине фрагмента эталона для поиска, то есть, программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.07.2016, 15:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru