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

Какая необходима книга ? - C++

Восстановить пароль Регистрация
 
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
25.03.2013, 01:33     Какая необходима книга ? #1
Здравствуйте. Есть игра,в которую можно подключать свою библиотеку. Я бы хотел узнать,какую книгу можно почитать,где рассказывалось бы,как с помощью своего модуля отлавливать функции с других библиотек моей игры ? То есть я хочу с помощью своего модуля допустим заблокировать какую либо функции в движке игры,или вызвать её принудительно когда мне это надо и т.д. и т.п.

Я знаю,что допустим необходимы базовые знания ассамблера,дабы составить сигнатуру необходимой мне функции,но в большей степени С++,но я прочел уже 3 книги базы С++ и теперь мне бы хотелось занятся чем-то более серьезным и интересным,но я не знаю,что нужно после базы и темболее,что нужно мне в этой ситуации для прочтения.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
VaJI
 Аватар для VaJI
7 / 5 / 1
Регистрация: 24.03.2013
Сообщений: 40
25.03.2013, 03:53     Какая необходима книга ? #2
pEntity, здравствуй) вопрос состоит в том как подключать свою библиотеку к игре(наверно все таки идет речь о движке игры)? или же чем занятся серьезным? если любите игры займитесь opengl, а точнее попробуйте создать хотя бы простую сцену и постепенно её усложнять путем внесения управления, динамики камеры, напишите парочку шейдеров) поверьте это вроде бы уже не начальный этап, но и интересно)

Добавлено через 42 секунды
Цитата Сообщение от pEntity Посмотреть сообщение
необходимы базовые знания ассамблера
больше не матюгайтесь так))
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
25.03.2013, 08:16     Какая необходима книга ? #3
Цитата Сообщение от pEntity Посмотреть сообщение
но я прочел уже 3 книги базы С++
имхо, мало!
Цитата Сообщение от pEntity Посмотреть сообщение
теперь мне бы хотелось занятся чем-то более серьезным
Почитайте литературу из раздела Level Up
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
25.03.2013, 18:15  [ТС]     Какая необходима книга ? #4
Спасибо. VAJI,я вам почему-то спасибку тыкнуть не могу

Вот допустим код,который я компилирую в dll,подключаю к игре и ловлю функцию с движка игры:

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
#include <extdll.h>     
#include <meta_api.h>   
#include "sdk_util.h"   
#include <psapi.h>
 
#pragma comment(lib, "psapi.lib")
 
 
static META_FUNCTIONS gMetaFunctionTable = 
{
 
    NULL,           // pfnGetEntityAPI              HL SDK; called before game DLL
    NULL,           // pfnGetEntityAPI_Post         META; called after game DLL
    GetEntityAPI2,  // pfnGetEntityAPI2             HL SDK2; called before game DLL
    NULL,           // pfnGetEntityAPI2_Post        META; called after game DLL
    NULL,           // pfnGetNewDLLFunctions        HL SDK2; called before game DLL
    NULL,           // pfnGetNewDLLFunctions_Post   META; called after game DLL
    GetEngineFunctions, // pfnGetEngineFunctions    META; called before HL engine
    NULL,           // pfnGetEngineFunctions_Post   META; called after HL engine
 
};
 
 
plugin_info_t Plugin_info = 
{
    META_INTERFACE_VERSION, // ifvers
    "Anti Jos Exploit", // name
    "1.3"// version
    "2012/02/22",   // date
    "PomanoB"// author
    "http://www.klan-hub.ru/"// url
    "ANTIJOS"// logtag, all caps please
    PT_ANYTIME, // (when) loadable
    PT_ANYPAUSE,    // (when) unloadable
};
 
 
meta_globals_t *gpMetaGlobals;      // metamod globals
gamedll_funcs_t *gpGamedllFuncs;    // gameDLL function tables
mutil_funcs_t *gpMetaUtilFuncs;     // metamod utility functions
 
 
C_DLLEXPORT int Meta_Query(char * /*ifvers */, plugin_info_t **pPlugInfo,mutil_funcs_t *pMetaUtilFuncs) 
{
    *pPlugInfo=&Plugin_info;
    gpMetaUtilFuncs=pMetaUtilFuncs;
 
    return(TRUE);
}
 
 
bool createPatch();
void makePatch();
void undoPatch();
 
C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME , META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs) 
{
    if(!pMGlobals) 
    {
 
        LOG_ERROR(PLID, "Meta_Attach called with null pMGlobals");
 
        return(FALSE);
 
    }
 
    gpMetaGlobals=pMGlobals;
 
    if(!pFunctionTable) 
    {
 
        LOG_ERROR(PLID, "Meta_Attach called with null pFunctionTable");
 
        return(FALSE);
 
    }
 
    memcpy(pFunctionTable, &gMetaFunctionTable, sizeof(META_FUNCTIONS));
 
    gpGamedllFuncs=pGamedllFuncs;
    
    if(createPatch())
        makePatch();
    else
        SERVER_PRINT("ANTI JOS PATCH FAILED");
 
    return(TRUE);
 
}
 
 
C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME ,PL_UNLOAD_REASON /* reason */) 
{
//  undoPatch();
    return(TRUE);
 
}
 
unsigned char originalBytes[5] = {0, 0, 0, 0, 0};
unsigned char pathedBytes[5] = {0, 0, 0, 0, 0};
 
void * pathAddr;
void (*p)(int * client_t);
 
void print_srvconsole(char *fmt, ...)
{
        va_list argptr;
        static char string[384];
        va_start(argptr, fmt);
        vsnprintf(string, sizeof(string) - 1, fmt, argptr);
        string[sizeof(string) - 1] = '\0';
        va_end(argptr);
       
        SERVER_PRINT(string); 
}
 
 
void checkExploit(int * client_t)
{
//  UTIL_LogPrintf("%d %d - %d - %d - %d - %d - %d\n", *(client_t + 21) , *(client_t + 22),  *(client_t + 23),  *(client_t + 24),  *(client_t + 25),  *(client_t + 26),  *(client_t + 26));
 
    print_srvconsole( "Signature HOOK!\n");
    if (*(client_t + 23) > *(client_t + 26))
    {
        UTIL_LogPrintf("[ANTI JOS] WARNING! JOS Detected from %hhu.%hhu.%hhu.%hhu!\n", *((unsigned char *)client_t + 40), *((unsigned char *)client_t + 41), *((unsigned char *)client_t + 42), *((unsigned char *)client_t + 43));
        *(client_t + 22) = 0;
        *(client_t + 23) = 0;
    }
    else
    {
        undoPatch();
        p(client_t);
        makePatch();
    }
}
 
bool comparePattern(short * pattern, unsigned char * addr, int count)
{
    for(int i = 0; i < count; i++)
    {
        if (pattern[i] == -1)
            continue;
        if ((pattern[i]&0xFF) != addr[i])
            return false;
    }
 
    return true;
}
 
bool createPatch()
{
    short pattern[] = {0x8B, 0x4C, -1, -1, 0x8D, 0x44, -1, -1, 0x50, 0x51, 0x68, -1, -1, -1, -1, 0xE8, -1, -1, -1, -1, 0x68, -1, -1, -1, -1, 0x68, -1, -1, -1, -1, 0x6A, 0x05, 0xFF, -1, -1, -1 , -1, -1, 0x83, 0xC4, -1};
 
    int pLength = sizeof(pattern)/sizeof(short);
 
    bool findet = false;
 
    HMODULE module;
    if(GetModuleHandleEx(0,(LPCSTR)"mp.dll",&module))
    {
        HANDLE process =  GetCurrentProcess();
        _MODULEINFO moduleInfo;
        
        if(GetModuleInformation(process,module,&moduleInfo,sizeof moduleInfo))
        {
            
            CloseHandle(process);
 
            unsigned char * baseAdress =  (unsigned char *) moduleInfo.lpBaseOfDll;
            DWORD length = moduleInfo.SizeOfImage;
 
            
            for(unsigned int i=0; i <= length - pLength ;i++)
            {
                if (comparePattern(pattern, baseAdress + i, pLength))
                {
                    findet = true;
 
                    pathAddr = baseAdress + i;
                }
                
            }
        }
 
    }
    else
    {
        SERVER_PRINT("[ANTI JOS] Error locate module swds.dll");
        return false;
    }
 
    if (!findet)
    {
        SERVER_PRINT("[ANTI JOS] Cant find patch!");
        return false;
    }
 
    p = (void (*)(int *))pathAddr;
 
    memcpy((void *)originalBytes, pathAddr, 5);
 
    pathedBytes[0] = 0xE9;
    *((long*)(&pathedBytes[1])) = (char*)checkExploit - (char*)pathAddr - 5;
 
    DWORD oldProtection;
 
    if(VirtualProtect(pathAddr, 5, PAGE_EXECUTE_READWRITE, &oldProtection))
        return true;
 
    return false;
}
 
void undoPatch()
{
    memcpy(pathAddr, (void*)originalBytes, 5);
}
 
void makePatch()
{
    memcpy(pathAddr, (void*)pathedBytes, 5);
}
swds.dll это библиотека игры.

Где

short pattern[] = {0x8B, 0x4C, -1, -1, 0x8D, 0x44, -1, -1, 0x50, 0x51, 0x68, -1, -1, -1, -1, 0xE8, -1, -1, -1, -1, 0x68, -1, -1, -1, -1, 0x68, -1, -1, -1, -1, 0x6A, 0x05, 0xFF, -1, -1, -1 , -1, -1, 0x83, 0xC4, -1};

Сигнатура её функции определенной,которую я нашел с помощью IDA и составил сигнатуру,для её хука.

Далее вызываю эту функцуию в void checkExploit(int * client_t)

Где я уже над ней работаю.


Могу вызвать когда мне вздумается эту функцию

undoPatch();
p(client_t);
makePatch();

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

Допустим с помощью этого кода,участок кода с движка (swds.dll) этот код уже не может отловить,он только для самих функций.
Yandex
Объявления
25.03.2013, 18:15     Какая необходима книга ?
Ответ Создать тему
Опции темы

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