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

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

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

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

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

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


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

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

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


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


То есть сама проблема,нет кода и знаний как написать именно для участка кода,который в самой функции.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2013, 23:29     Отлов функции с другой библиотеки
Посмотрите здесь:
Вызов функции одной динамической библиотеки из другой динамической библиотеки C++
C++ Функции. Как после одного возвратного значения функции отталкиваться от возврата другой функции
C++ Вызов функции внутри другой функции с передачей локальной переменной по ссылке
Вычислить значение функции аргумент которой вычисляется из другой кусочно заданной функции C++
C++ Получить указатель из функции и использовать его в другой функции
Применение переменных одной функции в другой функции C++
Использование функции как параметра другой функции C++
стандартные функции библиотеки <string.h> C++
Подскажите библиотеки, функции по управлению потоками C++
Компилятор не видит функции из библиотеки AlgLib C++
Библиотеки для построения графика функции C++
использование массива из функции в другой функции C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,449
Записей в блоге: 17
14.02.2013, 23:50     Отлов функции с другой библиотеки #2
Цитата Сообщение от pEntity Посмотреть сообщение
отловить участок кода
Что значит ?
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 386
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");

И я хочу еще принудительно вызывать,когда мне это угодно.
Ответ Создать тему
Опции темы

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