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

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

Восстановить пароль Регистрация
 
 
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
29.07.2016, 12:00     Динамическое приложение с использованием шаблонов/конфигов #1
Есть файл 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

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

C++ Cоздание итератора с использованием шаблонов
Программирование задачи на двумерные и одномерные массивы с использованием шаблонов C++
C++ Программирование задачи на двумерные и одномерные массивы с использованием шаблонов 2
C++ Программирование задачи на двумерные и одномерные массивы с использованием шаблонов 3
Задача с использованием шаблонов классов в С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4324 / 3745 / 1260
Регистрация: 14.04.2014
Сообщений: 14,698
29.07.2016, 12:46     Динамическое приложение с использованием шаблонов/конфигов #2
Описать все возможные структуры данных и выбирать нужную в самой программе.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
30.07.2016, 08:37  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #3
Цитата Сообщение от nmcf Посмотреть сообщение
Описать все возможные структуры данных и выбирать нужную в самой программе.
Это первое что пришло в голову, но решение окажется слишком громоздким
было:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <windows.h>
 
int main(int argc, char* argv)
{
    int number;
 
    std::cout << "Write 1 or 2" << std::endl;
    std::cin >> number;
 
    // here a code for read config
 
    if (number == 1)
    {
        // Read One.cfg
    }
    else if (number == 2)
    {
        // Read Two.cfg
    }
    else
    {
        return 0;
    }
 
    MYTYPE variable = myData;
    std::cout << variable << std::endl;
 
    std::cin.get();
    return 0;
}

стало:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <windows.h>
 
int main(int argc, char* argv)
{
    int number;
 
    std::cout << "Write 1 or 2" << std::endl;
    std::cin >> number;
 
    if (number == 1)
    {
        int variable = 1234567;
        std::cout << variable << std::endl;
    }
    else if (number == 2)
    {
        unsigned char variable = 5;
        std::cout << variable << std::endl;
    }
    else
    {
        return 0;
    }
 
    std::cin.get();
    return 0;
}


Добавлено через 35 секунд
и это лишь для такого примитивного кода, который использовал в качестве примера для наглядности

Добавлено через 59 секунд
ну и плюс ко всему дублирование кода неизбежать

Добавлено через 1 час 6 минут
Цитата Сообщение от nmcf Посмотреть сообщение
Описать все возможные структуры данных и выбирать нужную в самой программе.
Вот такой код получился
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
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <fstream>
#include <windows.h>
#include <string>
 
void readConfig(std::string name, std::string &type, std::string &data);
 
int main(int argc, char* argv)
{
    // Step 1
    int number;
    std::string MYTYPE;
    std::string MYDATA;
 
    std::cout << "Write 1 or 2" << std::endl;
    std::cin >> number;
 
    // Step 2
    if (number == 1)
    {
        readConfig("cfg/One.cfg", MYTYPE, MYDATA);
    }
    else if (number == 2)
    {
        readConfig("cfg/Two.cfg", MYTYPE, MYDATA);
    }
    else
    {
        return 0;
    }
 
    // Step 3
    if (MYTYPE == "int")
    {
        int variable = atoi(MYDATA.c_str());
        std::cout << variable << std::endl;
    }
    else if (MYTYPE == "unsigned char")
    {
        unsigned char variable = atoi(MYDATA.c_str());
        std::cout << variable << std::endl;
    }
    else if (MYTYPE == "float")
    {
        float variable = atof(MYDATA.c_str());
        std::cout << variable << std::endl;
    }
 
    return 0;
}
 
void readConfig(std::string name, std::string &type, std::string &data)
{
    std::ifstream First(name);
 
    getline(First, type);
    type = type.substr(9);
 
    getline(First, data);
    data = data.substr(9);
}
Добавлено через 1 минуту
Write 1 or 2
1
1234567
Для продолжения нажмите любую клавишу . . .
Write 1 or 2
2
15
Для продолжения нажмите любую клавишу . . .

Добавлено через 18 часов 20 минут
Думал попробовать с шаблонами
C++
1
2
3
4
5
6
7
template<typename H, typename A, typename M>
struct Character {
    H hp;
    A ap;
    M money;
    void someActions() {}
};
и вот что из этого вышло...
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
#include <iostream>
#include <fstream>
#include <windows.h>
#include <string>
 
template<typename H, typename A, typename M>
struct Character {
    H hp;
    A ap;
    M money;
    void someActions() {}
};
struct Data { std::string hp, ap, mp; };
 
void readConfig(std::string name, Data &s);
 
int main(int argc, char* argv)
{
    int number;
    Data data;
 
    std::cout << "Write 1 or 2" << std::endl;
    std::cin >> number;
 
    if (number == 1)
    {
        readConfig("cfg/hl.cfg", data);
    }
    else if (number == 2)
    {
        readConfig("cfg/gtavc.cfg", data);
    }
    else
    {
        return 0;
    }
 
    std::string health = data.hp.substr(14);
    std::string armour = data.ap.substr(14);
    std::string money = data.mp.substr(13);
 
    if (health == "int")
    {
        if (armour == "int")
        {
            if (money == "int")
            {
                Character<int, int, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<int, int, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<int, int, float> character;
                character.someActions();
            }
        }
        else if (armour == "unsigned char")
        {
            if (money == "int")
            {
                Character<int, unsigned char, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<int, unsigned char, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<int, unsigned char, float> character;
                character.someActions();
            }
        }
        else if (armour == "float")
        {
            if (money == "int")
            {
                Character<int, float, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<int, float, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<int, float, float> character;
                character.someActions();
            }
        }
    }
    else if (health == "unsigned char")
    {
        if (armour == "int")
        {
            if (money == "int")
            {
                Character<unsigned char, int, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<unsigned char, int, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<unsigned char, int, float> character;
                character.someActions();
            }
        }
        else if (armour == "unsigned char")
        {
            if (money == "int")
            {
                Character<unsigned char, unsigned char, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<unsigned char, unsigned char, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<unsigned char, unsigned char, float> character;
                character.someActions();
            }
        }
        else if (armour == "float")
        {
            if (money == "int")
            {
                Character<unsigned char, float, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<unsigned char, float, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<unsigned char, float, float> character;
                character.someActions();
            }
        }
    }
    else if (health == "float")
    {
        if (armour == "int")
        {
            if (money == "int")
            {
                Character<float, int, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<float, int, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<float, int, float> character;
                character.someActions();
            }
        }
        else if (armour == "unsigned char")
        {
            if (money == "int")
            {
                Character<float, unsigned char, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<float, unsigned char, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<float, unsigned char, float> character;
                character.someActions();
            }
        }
        else if (armour == "float")
        {
            if (money == "int")
            {
                Character<float, float, int> character;
                character.someActions();
            }
            else if (money == "unsigned char")
            {
                Character<float, float, unsigned char> character;
                character.someActions();
            }
            else if (money == "float")
            {
                Character<float, float, float> character;
                character.someActions();
            }
        }
    }
    //
 
    return 0;
}
 
void readConfig(std::string name, Data &s)
{
    std::ifstream fin(name);
 
    std::getline(fin, s.hp);
    std::getline(fin, s.hp);
    std::getline(fin, s.hp);
    std::getline(fin, s.hp);
    std::getline(fin, s.hp);
    std::getline(fin, s.hp);
    std::getline(fin, s.hp);
    std::getline(fin, s.hp);
    std::getline(fin, s.hp);
    std::getline(fin, s.hp);
    std::getline(fin, s.hp);
    std::getline(fin, s.hp);
    std::getline(fin, s.hp);
    std::getline(fin, s.hp);
 
    std::getline(fin, s.ap);
    std::getline(fin, s.ap);
    std::getline(fin, s.ap);
    std::getline(fin, s.ap);
    std::getline(fin, s.ap);
 
    std::getline(fin, s.mp);
    std::getline(fin, s.mp);
    std::getline(fin, s.mp);
    std::getline(fin, s.mp);
    std::getline(fin, s.mp);
}

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


Что меня настораживает так это такое огромное ветвление с кучей if-else и способ чтения конфига

Наверняка есть более разумный вариант создать переменную с типом, который указан в конфиге
т.е.
C++
1
2
type_name_from_cfg myVariable = 123456;
myVariable += 100
nmcf
4324 / 3745 / 1260
Регистрация: 14.04.2014
Сообщений: 14,698
30.07.2016, 09:19     Динамическое приложение с использованием шаблонов/конфигов #4
Цитата Сообщение от dailydose Посмотреть сообщение
Думал попробовать с шаблонами
Шаблон существует только до компиляции. Это не поможет.

Делай универсальную. Каких там условий много? У тебя всего три секции: HEALTH, ARMOUR и MONEY.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
30.07.2016, 10:51  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #5
Цитата Сообщение от nmcf Посмотреть сообщение
У тебя всего три секции: HEALTH, ARMOUR и MONEY
Три секции это для примера, на самом деле их 6: health, armour, money, magazine, ammo, gren
Кликните здесь для просмотра всего текста
Цитата Сообщение от config.h
#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

Цитата Сообщение от nmcf Посмотреть сообщение
Каких там условий много?
файл main.cpp строчки 42-212
C++
1
if(health == "int") if (armour == "int") etc....
Цитата Сообщение от nmcf Посмотреть сообщение
Делай универсальную.
Вот что собственно и пытаюсь.
Попробую полностью объяснить суть задачи:

Есть класс Game, который работает с памятью игры, т.е. пишет/читает её.
Game.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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#pragma once
#ifndef GAME_H
#define GAME_H
 
class Game
{
public:
    Game();
    ~Game();
 
    bool playerIsDead();
    void updatePoints();
    void updateAmmo();
    void freezePoints();
    void freezeAmmo();
    void addMoney(TYPE_MONEY money);
 
private:
    struct pointers { MYLONG health, armour, money, magazine, ammo, gren, temp; };
    struct modules  { MYLONG health, armour, money, magazine, ammo, gren; };
    struct counts   { short health, armour, money, magazine, ammo, gren; };
    struct sizes    { short health, armour, money, magazine, ammo, gren, mylong; };
    struct maximals
    {
        TYPE_HEALTH health;
        TYPE_ARMOUR armour;
        TYPE_MAGAZINE magazine;
        TYPE_AMMO ammo;
        TYPE_GREN gren;
    };
 
    pointers ptr;
    modules module;
    counts cnt;
    sizes sz;
    maximals max;    
 
    HANDLE hProc;
    int pId;
    float fTempData;
    int iTempData;
    short sTempData;
    unsigned char cTempData;
 
    static DWORD offsetsHealth[], offsetsArmour[], offsetsMoney[];
    static DWORD offsetsGren[], offsetsMagazine[], offsetsAmmo[];
 
 
    MYLONG getModule(LPSTR lpModuleName, DWORD dwProcessId);
    MYLONG getPointer(MYLONG module, MYLONG address, DWORD *offsets, short count);
    void refreshData(MYLONG ptr, float max, short sz);
    void refreshData(MYLONG ptr, int max, short sz);
    void refreshData(MYLONG ptr, short max, short sz);
    void refreshData(MYLONG ptr, unsigned char max, short sz);
};
 
#endif

Game.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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include "lib/config.h"
#include "lib/Trainer.h"
#include "lib/Game.h"
 
DWORD Game::offsetsHealth[] = { OFFSETS_HEALTH };
DWORD Game::offsetsArmour[] = { OFFSETS_ARMOUR };
DWORD Game::offsetsMoney[] = { OFFSETS_MONEY };
 
DWORD Game::offsetsMagazine[] = { OFFSETS_MAGAZINE };
DWORD Game::offsetsAmmo[] = { OFFSETS_AMMO };
DWORD Game::offsetsGren[] = { OFFSETS_GREN };
 
Game::Game()
{
    pId = Trainer::getProcessIdByName(GAME_PROCESS);
    hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);
 
    module.health = getModule(MODULE_HEALTH, pId);
    module.armour = getModule(MODULE_ARMOUR, pId);
    module.money = getModule(MODULE_MONEY, pId);
    module.magazine = getModule(MODULE_MAGAZINE, pId);
    module.ammo = getModule(MODULE_AMMO, pId);
    module.gren = getModule(MODULE_GREN, pId);
 
    cnt.health = _countof(offsetsHealth) - 1;
    cnt.armour = _countof(offsetsArmour) - 1;
    cnt.money = _countof(offsetsMoney) - 1;
    cnt.magazine = _countof(offsetsMagazine) - 1;
    cnt.ammo = _countof(offsetsAmmo) - 1;
    cnt.gren = _countof(offsetsGren) - 1;
 
    sz.health = sizeof(TYPE_HEALTH),
    sz.armour = sizeof(TYPE_ARMOUR),
    sz.money = sizeof(TYPE_MONEY),
    sz.magazine = sizeof(TYPE_MAGAZINE),
    sz.ammo = sizeof(TYPE_AMMO),
    sz.gren = sizeof(TYPE_GREN),
    sz.mylong = sizeof(MYLONG);
}
 
Game::~Game()
{
    CloseHandle(hProc);
}
 
bool Game::playerIsDead()
{
    ptr.health = getPointer(module.health, ADR_HEALTH, offsetsHealth, cnt.health);
    ptr.armour = getPointer(module.armour, ADR_ARMOUR, offsetsArmour, cnt.armour);
    /* iTempData ??? if TYPE_HEALTH int then iTempData else fTempData/cTempdata */
    ReadProcessMemory(hProc, (LPCVOID)ptr.health, &iTempData, sz.health, NULL);
    return iTempData < 1;
}
 
// update health and armour Points
void Game::updatePoints()
{
    refreshData(ptr.health, max.health, sz.health);
    refreshData(ptr.armour, max.armour, sz.armour);
}
 
// update Grenades, magazine and fullammo capacity
void Game::updateAmmo()
{
    // Update grenades
    ptr.gren = getPointer(module.gren, ADR_GREN, offsetsGren, cnt.gren);
    refreshData(ptr.gren, max.gren, sz.gren);
    
    // Update magazine
    ptr.magazine = getPointer(module.magazine, ADR_MAGAZINE, offsetsMagazine, cnt.magazine);
    refreshData(ptr.magazine, max.magazine, sz.magazine);
 
    // Update ammo capacity
    ptr.ammo = getPointer(module.ammo, ADR_AMMO, offsetsAmmo, cnt.ammo);
    refreshData(ptr.ammo, max.ammo, sz.ammo);
}
 
void Game::freezePoints()
{
    // set pointers
    ptr.health = getPointer(module.health, ADR_HEALTH, offsetsHealth, cnt.health);
    ptr.armour = getPointer(module.armour, ADR_ARMOUR, offsetsArmour, cnt.armour);
 
    // save max data to struct
    ReadProcessMemory(hProc, (LPVOID)ptr.health, &max.health, sz.health, NULL);
    ReadProcessMemory(hProc, (LPVOID)ptr.armour, &max.armour, sz.armour, NULL);
}
 
void Game::freezeAmmo()
{
    // set pointers
    ptr.magazine = getPointer(module.magazine, ADR_MAGAZINE, offsetsMagazine, cnt.magazine);
    ptr.ammo = getPointer(module.ammo, ADR_AMMO, offsetsAmmo, cnt.ammo);
    ptr.gren = getPointer(module.gren, ADR_GREN, offsetsGren, cnt.gren);
    ReadProcessMemory(hProc, (LPVOID)ptr.magazine, &max.magazine, sz.magazine, NULL);
 
    // save max data to struct
    ReadProcessMemory(hProc, (LPVOID)ptr.ammo, &max.ammo, sz.ammo, NULL);
    ReadProcessMemory(hProc, (LPVOID)ptr.gren, &max.gren, sz.gren, NULL);
}
 
void Game::addMoney(TYPE_MONEY money)
{
    ptr.money = getPointer(module.money, ADR_MONEY, offsetsMoney, cnt.money);
    ReadProcessMemory(hProc, (LPVOID)ptr.money, &money, sz.money, NULL);
    money += MONEY_AMMOUNT;
    WriteProcessMemory(hProc, (LPVOID)ptr.money, &money, sz.money, NULL);
}
 
MYLONG Game::getModule(LPSTR lpModuleName, DWORD dwProcessId)
{
    MODULEENTRY32 lpModuleEntry = { 0 };
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
 
    if (!hSnapShot)
        return NULL;
    lpModuleEntry.dwSize = sizeof(lpModuleEntry);
    BOOL bModule = Module32First(hSnapShot, &lpModuleEntry);
    while (bModule)
    {
        if (!strcmp(lpModuleEntry.szModule, lpModuleName))
        {
            CloseHandle(hSnapShot);
            return (MYLONG)lpModuleEntry.modBaseAddr;
        }
        bModule = Module32Next(hSnapShot, &lpModuleEntry);
    }
    CloseHandle(hSnapShot);
    return NULL;
}
 
MYLONG Game::getPointer(MYLONG module, MYLONG address, DWORD* offsets, short count)
{
    ReadProcessMemory(hProc, (LPCVOID)(module + address), &ptr.temp, sz.mylong, NULL);
 
    if (count == -1)
    {
        return ptr.temp;
    }
 
    for (int i = 0; i < count; i++)
    {
        ReadProcessMemory(hProc, (LPCVOID)(ptr.temp + offsets[i]), &ptr.temp, sz.mylong, NULL);
    }
    return ptr.temp + offsets[count];
}
 
void Game::refreshData(MYLONG ptr, float max, short sz)
{
    ReadProcessMemory(hProc, (LPCVOID)ptr, &fTempData, sz, NULL);
 
    if (max > fTempData)
    {
        WriteProcessMemory(hProc, (LPVOID)ptr, &max, sz, NULL);
    }
}
 
void Game::refreshData(MYLONG ptr, int max, short sz)
{
    ReadProcessMemory(hProc, (LPCVOID)ptr, &iTempData, sz, NULL);
 
    if (max > iTempData)
    {
        WriteProcessMemory(hProc, (LPVOID)ptr, &max, sz, NULL);
    }
}
 
void Game::refreshData(MYLONG ptr, short max, short sz)
{
    ReadProcessMemory(hProc, (LPCVOID)ptr, &sTempData, sz, NULL);
 
    if (max > sTempData)
    {
        WriteProcessMemory(hProc, (LPVOID)ptr, &max, sz, NULL);
    }
}
 
void Game::refreshData(MYLONG ptr, unsigned char max, short sz)
{
    ReadProcessMemory(hProc, (LPCVOID)ptr, &cTempData, sz, NULL);
 
    if (max > cTempData)
    {
        WriteProcessMemory(hProc, (LPVOID)ptr, &max, sz, NULL);
    }
}


Делаю универсальный трейнер для любой игры. Всё прекрасно работает,но как я писал выше
-Каждый раз нужно менять содержимое файла config.h под конкретную игру, который подключается в main.cpp
-Каждый раз после внесения изменений в этот конфиг нужно снова компилировать приложение
Что естественно неудобно.

Сейчас же хочу чтобы приложение(трейнер) работало на основе конфига, который будет выбран в начале работы программы. Т.е. захотел трейнер под GTA:VC - пожалуйста, под HalfLife - ради бога.
Вся проблема в том, что в разных играх типы переменных для HP,AP,MONEY,AMMO, etc... разные, т.е. в одной игре броня может быть float, в другой int, в третьей вообще unsigned char.
nmcf
4324 / 3745 / 1260
Регистрация: 14.04.2014
Сообщений: 14,698
30.07.2016, 10:59     Динамическое приложение с использованием шаблонов/конфигов #6
У тебя сами секции однотипные. Из этого исходи. Сделаешь для одной, а после будешь для всех использовать.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
30.07.2016, 11:05  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #7
Цитата Сообщение от nmcf Посмотреть сообщение
У тебя сами секции однотипные. Из этого исходи. Сделаешь для одной, а после будешь для всех использовать.
Можно подробнее? "Сделаешь для одной" но как? третьи сутки уже бьюсь

Не по теме:

думал уже оставить эту затею и оставить как есть - каждый раз компилить под новую игру, что есесно не есть гуд

nmcf
4324 / 3745 / 1260
Регистрация: 14.04.2014
Сообщений: 14,698
30.07.2016, 11:18     Динамическое приложение с использованием шаблонов/конфигов #8
Одну секцию сделай под все типы. Потом будешь использовать для остальных.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
30.07.2016, 11:35  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #9
Цитата Сообщение от nmcf Посмотреть сообщение
Одну секцию сделай под все типы. Потом будешь использовать для остальных.
эм... так ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
            //readCFG(); // TYPE_HEALTH int
            // std::string health = "int";
            
            if (health == "int")
            {
                //...
            }
            else if (health == "short")
            {
                //...
            }
            else if (health == "unsigned char")
            {
                //...
            }
            else if (health == "float")
            {
                //...
            }
Цитата Сообщение от nmcf Посмотреть сообщение
Одну секцию сделай под все типы
не пойму что конкретно имеешь ввиду
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
30.07.2016, 11:51     Динамическое приложение с использованием шаблонов/конфигов #10
Цитата Сообщение от dailydose Посмотреть сообщение
не пойму что конкретно имеешь ввиду
у вас какая то каша в голове.
в коде соответственно - такая же каша.

дизайн вашего конфига выглядит примерно так:
C++
1
2
3
4
5
6
7
8
9
#include <tools/ini.h>
 
int main()
{
    tools::ini config("sample.ini");
    const std::string& name = config["name"];
    const int health        = config["health"];
    const float speed       = config["speed"];
}
при загрузке ini файла, конфиг парсит текст.
определяя текстовое имя ключа,
и текстовое значение ключа.
данные заносятся в std::map<std::string, std::string>

далее, в выражении:
C++
1
const int health = config["health"];
выполняется поиск ключа "health",
а его значение преобразуется к типу int
руками стандартной библиотеки.
если преобразование законное - все хорошо.
иначе покажет ошибку.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
30.07.2016, 12:13  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #11
Цитата Сообщение от hoggy Посмотреть сообщение
при загрузке ini файла, конфиг парсит текст.
определяя текстовое имя ключа,
и текстовое значение ключа.
данные заносятся в std::map<std::string, std::string>
проблемы прочитать файл нет, этому особого внимания не уделял и пока просто считывал строки getline();
но за идею с .ini спасибо, возьму на заметку.

Цитата Сообщение от hoggy Посмотреть сообщение
const int health = config["health"];
выполняется поиск ключа "health",
а его значение преобразуется к типу int
руками стандартной библиотеки.
проблема в том что я не знаю какой тип данных использует игра для хранения значения жизней
Цитата Сообщение от dailydose Посмотреть сообщение
в разных играх типы переменных для HP,AP,MONEY,AMMO, etc... разные, т.е. в одной игре броня может быть float, в другой int, в третьей вообще unsigned char.
Добавлено через 2 минуты

Не по теме:

hoggy, вы мне в прошлый раз очень сильно помогли в реализации этого класса(Game)
изначально код был полной как вы говорите кашей, с использованием только статических методов/полей.
за что вам и спасибо огромное, надеюсь и эту задачку удастся решить

HelicopterK52
634 / 177 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
30.07.2016, 12:16     Динамическое приложение с использованием шаблонов/конфигов #12
Цитата Сообщение от dailydose Посмотреть сообщение
проблема в том что я не знаю какой тип данных использует игра для хранения значения жизней
Как же тогда Вы их в игре собираетесь обрабатывать?
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
30.07.2016, 12:21  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #13
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Как же тогда Вы их в игре собираетесь обрабатывать?
сейчас у меня в main.cpp подключен #include<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
#include "lib/config.h"
#include "lib/Trainer.h"
#include "lib/Game.h"
 
int main(int argc, char* argv[])
{
    // Only One Instance of Application
    if(Trainer::trainerIsRun())
    {
        return 0;
    }
    
    // Waiting for Start a GAME... 
    while(!Trainer::gameIsRun())
    {
        Sleep(1000);
    }
 
    // Run the trainer
    Trainer trainer;
    trainer.start();
 
    return 0;
}
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
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

прецпроссесор на заменяет код
C++
1
TYPE_HEALTH health = 100;
на
C++
1
int health = 100;
в зависимости то того что указано в конфиге, этот int может быть и short, float, etc...
Миниатюры
Динамическое приложение с использованием шаблонов/конфигов  
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
30.07.2016, 12:26  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #14
C++
1
2
3
4
5
6
7
8
    struct maximals
    {
        TYPE_HEALTH health;
        TYPE_ARMOUR armour;
        TYPE_MAGAZINE magazine;
        TYPE_AMMO ammo;
        TYPE_GREN gren;
    };
превращается в
C++
1
2
3
4
5
6
7
8
    struct maximals
    {
        int health;
        float armour;
        int magazine;
        float ammo;
        unsigned char gren;
    };
HelicopterK52
634 / 177 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
30.07.2016, 12:27     Динамическое приложение с использованием шаблонов/конфигов #15
Цитата Сообщение от dailydose Посмотреть сообщение
прецпроссесор на заменяет код
Тогда при изменении типа переменной Вам придется всё равно всё перекомпилировать.
Мой Вам совет - сначала разработайте ту самую систему типов,
не нужно всё делать крайне универсально - всё равно не получится.
Дайте пользователям возможность выставлять health в конфигах, но тип этого самого health - не их забота.
Игра регулируется правилами, эти правила жестко заданы в приложении, увы, но изменять абсолютно всё конфигами и скриптами у Вас не получится.
Посмотрите на гигантов, типа Civilization, TES, Fallout и т.д. В этих играх многое можно поменять в конфигах и скриптах - но далеко не всё.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
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
я делаю не игру, а трейнер для любой игры

HelicopterK52
30.07.2016, 12:38
  #17

Не по теме:

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

dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 155
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 минуту
с друзьями на разных машинах в сингл-плеере тестили - всё ок, с этим проблем нет. проблема в универсальности
HelicopterK52
30.07.2016, 12:47
  #19

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2016, 12:50     Динамическое приложение с использованием шаблонов/конфигов
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Ferrari F1
Заблокирован
416 / 290 / 63
Регистрация: 27.01.2015
Сообщений: 1,939
Записей в блоге: 1
Завершенные тесты: 1
30.07.2016, 12:50     Динамическое приложение с использованием шаблонов/конфигов #20
Цитата Сообщение от dailydose Посмотреть сообщение
пока для двух игр Killing Floor и Killing Floor 2, и это не предел
Я сам играю в killing floor, все эти "читерные" значения(лаве, хп, броня, патроны, опыт (на рпг серверах) - все это хранится на стороне сервера), так что есть сомнения в реальной работе твоего чита в сетке (про взлом параметров в одиночке можешь не писать).
Единственное, что мне удалось "поломать", так это steam id, чтобы баны обходить, причем играю на non steam клиенте игры на соотв. no steam серверах, чего уж говорить про нормальные сервера с VAC'ом
Yandex
Объявления
30.07.2016, 12:50     Динамическое приложение с использованием шаблонов/конфигов
Ответ Создать тему
Опции темы

Текущее время: 10:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru