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

Отлов функции с другой библиотеки - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сортировка массива структур http://www.cyberforum.ru/cpp-beginners/thread786661.html
Разьясните пожалуйста в как можно поступить по другому. Не выделяя, как у меня дополнительный массив. #include<iostream> const int sizeName = 20; struct Patrons{ char name; double mane; };
C++ Нахождение самой длинной цепочки отрицательных элементов с использованием указателей В одномерном массиве из 100 элементов найти самую длинную цепочку отрицательных элементов. m = { 16, 78, 99, 6, -29, 19, -52, 65, -88, 51, -79, -22, 32, -25, -62, -69, -2, -59, -75, 89, -87, 95, -22, 85, -49, -75, 76, 73, -59, -52, 30, 49, -28, -48, 0, 57, -6, -85, 0, -18, http://www.cyberforum.ru/cpp-beginners/thread786649.html
C++ Как заставить объекты масштабироваться вместе с окном?
Итак, дорогие мастера кодинга на с++, совсем ламерский вопрос: Как заставить объекты, например sTabSheet масштабироваться вместе с масштабированием формы? Метод научного тыка не помог. :) Извиняйте за ламерство и благодарю заранее.
Однонаправленный список, где создать указатель на первый элемент? C++
struct listNode{ char data; listNode *next; }; class List{ public: void add(char); int delete (int); int search(int);
C++ Дано трехзначное число. Определить, есть ли среди его цифр пара одинаковых http://www.cyberforum.ru/cpp-beginners/thread786641.html
Дано трехзначное число. Определить, есть ли среди его цифр пара одинаковых
C++ Четность/нечетность Как определить четность/нечетность числа (использовать остаток от деления нацело (%) и другие бинарные функции нельзя)? подробнее

Показать сообщение отдельно
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 391

Отлов функции с другой библиотеки - C++

14.02.2013, 23:29. Просмотров 340. Ответов 2
Метки (Все метки)

Здравствуйте.

У меня есть своя библиотека,мне нужно с помощью неё отловить участок кода или функцию с другой библиотеки.

Сейчас я могу только отловить саму функцию:

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
#include <extdll.h>     
#include <meta_api.h>   
#include "sdk_util.h"   
#include <psapi.h>
 
#pragma comment(lib, "psapi.lib")
 
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(createPatch())
        makePatch();
    else
        SERVER_PRINT("PATCH FAILED");
 
    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 Hook_My_Function(int * client_t)
{
    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[] = {0x68, 0xEC, 0xF8, 0x11, 0x10, 0xE8, -1, -1, -1, -1, 0x83, 0xC4, 0x04, 0x5F, 0x5E, 0x5D, 0x5B, 0xC3};
 
    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("Error locate module mp.dll");
        return false;
    }
 
    if (!findet)
    {
        SERVER_PRINT("Cant find patch!");
        return false;
    }
 
    p = (void (*)(int *))pathAddr;
 
    memcpy((void *)originalBytes, pathAddr, 5);
 
    pathedBytes[0] = 0xE9;
    *((long*)(&pathedBytes[1])) = (char*)Hook_My_Function - (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);
}
Составляю сигнатуру функции с помощью IDA из mp.dll ,где я нуждаюсь в отлове необходимой функции:

C++
1
    short pattern[] = {0x68, 0xEC, 0xF8, 0x11, 0x10, 0xE8, -1, -1, -1, -1, 0x83, 0xC4, 0x04, 0x5F, 0x5E, 0x5D, 0x5B, 0xC3};
Трансфер функция,тобиш сам хук:

C++
1
2
3
4
5
6
void Hook_My_Function(int * client_t)
{
    undoPatch();
    p(client_t);
    makePatch();
}
Вызов этой самой оригинальной функции:

C++
1
2
3
    undoPatch();
    p(client_t);
    makePatch();
Чтоб она не заблокировалась.

Так-то работает. Я получил вызов функции из библиотеки mp.dll с помощью своей,получил её аргументы,все чудесно.

Но вот интересует вопрос,а как отловить именно участок кода ? Этот код не подходит для этого.


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

Если бы кто-то описал бы,был бы очень благодарен.

Я знаю,такое делается например для чит кодов,но исходники там тяжеловаты.


Мне в идеале нужен код,который будет ловить функцию,чтоб использовать аргументы её\менять аргументы\блокировать функцию\вызывать принудительно когда надо.


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