С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
pEntity
13 / 8 / 1
Регистрация: 12.12.2012
Сообщений: 442
#1

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

14.02.2013, 23:29. Просмотров 357. Ответов 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 с помощью своей,получил её аргументы,все чудесно.

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


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

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

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


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


То есть сама проблема,нет кода и знаний как написать именно для участка кода,который в самой функции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2013, 23:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отлов функции с другой библиотеки (C++):

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

Функции. Как после одного возвратного значения функции отталкиваться от возврата другой функции - C++
Написал код, в котором 2 функции одна возвращает стринговое значение, вторая должна бы вернуть значение, отталкиваясь от первой. Возможно...

Вызов функции внутри другой функции с передачей локальной переменной по ссылке - C++
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include &lt;iostream&gt; using std::cout; void f(const int &amp;ref){...

Вычислить значение функции аргумент которой вычисляется из другой кусочно заданной функции - C++
Решите программу то я не знаю как:hysteric: Вычислить значение y в зависимости от выбранной функции \varphi (x), аргумент которой...

Получить указатель из функции и использовать его в другой функции - C++
Подскажите пожалуйста как из функции использовать в функции main указатель? пример void foo1() {u=sizeof(str1); int *l=&amp;u; } ...

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

2
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,172
Записей в блоге: 17
14.02.2013, 23:50 #2
Цитата Сообщение от pEntity Посмотреть сообщение
отловить участок кода
Что значит ?
0
pEntity
13 / 8 / 1
Регистрация: 12.12.2012
Сообщений: 442
15.02.2013, 00:01  [ТС] #3
Вот допустим:

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
//----- (10093C70) --------------------------------------------------------
int __cdecl sub_10093C70(int a1, int a2)
{
  signed int v2; // ebx@1
  int v3; // ebp@1
  int v4; // edi@1
  void *v5; // esi@1
  int v6; // ST18_4@1
  char v7; // ST1C_1@1
  char v8; // ST20_1@1
  char v9; // ST24_1@1
  int v10; // edx@2
  void *v11; // ecx@2
  signed int v13; // [sp-Ch] [bp-1Ch]@2
  int v14; // [sp-8h] [bp-18h]@2
  int v15; // [sp-4h] [bp-14h]@2
 
  v5 = dword_10162304;
  v4 = 0;
  v3 = a1 + 1;
  v2 = 1;
  sub_100CE400(4, a1, 0, 0, 0, 0, v6, v7, v8, v9);
  switch ( a2 )
  {
    case 1:
    case 3:
    case 4:
    case 9:
    case 13:
    case 15:
      v11 = dword_10128F7C;
      v15 = 0;
      v14 = 0;
      v4 = (int)"TERRORIST";
      v10 = *(_DWORD *)dword_10128F7C;
      v13 = 36;
      goto LABEL_5;
    case 2:
    case 5:
    case 6:
    case 7:
    case 8:
    case 11:
    case 12:
    case 14:
      v4 = (int)"CT";
      (*(void (__stdcall **)(signed int, _DWORD, _DWORD))(*(_DWORD *)dword_10128F7C + 36))(37, 0, 0);
      break;
    default:
      v11 = dword_10128F7C;
      v2 = 0;
      v15 = 0;
      v14 = 0;
      v10 = *(_DWORD *)dword_10128F7C;
      v13 = 38;
LABEL_5:
      (*(void (__thiscall **)(void *, signed int, int, int))(v10 + 36))(v11, v13, v14, v15);
      break;
  }
  if ( v5 )
  {
    if ( v2 == 1 )
    {
      sub_100CFCD0(
        "Team \"%s\" triggered \"%s\" (CT \"%i\") (T \"%i\")\n",
        v4,
        v3,
        *((_WORD *)v5 + 60),
        *((_WORD *)v5 + 61));
      return sub_100CFCD0("World triggered \"Round_End\"\n");
    }
    sub_100CFCD0("World triggered \"%s\" (CT \"%i\") (T \"%i\")\n", v3, *((_WORD *)v5 + 60), *((_WORD *)v5 + 61));
  }
  return sub_100CFCD0("World triggered \"Round_End\"\n");
}
Я хочу отловить вызов return sub_100CFCD0("World triggered \"Round_End\"\n");

И я хочу еще принудительно вызывать,когда мне это угодно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2013, 00:01
Привет! Вот еще темы с ответами:

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

стандартные функции библиотеки <string.h> - C++
Здравствуйте, товарищи порграммисты :gsmile: Помогите, пожалуйста, с написанием програмки на языке C . Дано: символьная строка...

Компилятор не видит функции из библиотеки AlgLib - C++
Здравствуйте. Добавил к проекту &quot;fasttransforms.h&quot;. Само имя библиотеки не вызывает ошибок, но не выполняется ни одна функция. Ошибка: ...

Подскажите библиотеки, функции по управлению потоками - C++
Прошу помогите! Подскажите библиотеки, функции по управлению потоками( созданию) либо какую литературу.Которые применяются в visual studio...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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