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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Взять из интернет-страницы текст и заменить в нем символы http://www.cyberforum.ru/cpp-beginners/thread1787149.html
есть страничка: http://anicon.sknt.ru:8000 там есть строчка Currently playing: ____@____@____@___ интересует взять текст ____@____@____@___ и сохранить его в блокноте вместо @ поставить enter возможно ли такое? спасибо.
C++ Разделение класса со статической переменной в многофайловом проекте На ровном месте происходят какие-то непонятные чудеса, как будто бы я шаблонный класс объявляю - если реализация класса находится в заголовочном файле, то всё хорошо, но если я её перенесу в .срр, то у компилятора возникает внезапная слепота и он выдаёт ошибку "неопределённая ссылка на конструктор/метод/и т.п.". В чём жопа-то? Раньше такого не происходило. Это у меня проблемы с IDE/компилятором... http://www.cyberforum.ru/cpp-beginners/thread1787113.html
C++ НОД рекурсия, указатели
Всем привет. Почему в рекурсии ругается на параметры возвращаемые в качестве указателя? int task_1_NOD_R(int *input_1, int *input_2) { if (*input_2== 0) return *input_1; return task_1_NOD_R (*input_1, *input_1 % *input_2); //Тут ругается; }
Исправить ошибки в работе функции C++
Помогите, не работает, компилятор ошибки не выдает. Проблема, кажется, возникает при вызове функции genPass :wall: # include <iostream> # include <cstdlib> # include <ctime> # include <fstream> using namespace std; class Password
C++ Прерывание по таймеру http://www.cyberforum.ru/cpp-beginners/thread1787024.html
Здравствуйте! Возможно ли сделать в консольном приложении на Visual Studio так, чтобы во время работы одного из циклов программы, раз в 100 мс его деятельность прерывалась и выполнялась небольшая отдельная функция?
C++ Применение метапрограммирования Доброго времени суток форумчане. Собственно говоря, как часто применимо метапрограммирование в современном мире разработок на C++. И имеет ли оно большое значение в профессиональных сферах программирования? подробнее

Показать сообщение отдельно
dailydose
overmind
 Аватар для dailydose
41 / 41 / 9
Регистрация: 21.07.2016
Сообщений: 256
30.07.2016, 10:51  [ТС]     Динамическое приложение с использованием шаблонов/конфигов
Цитата Сообщение от 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.
 
Текущее время: 12:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru