Форум программистов, компьютерный форум, киберфорум
Van111
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

отлов API функций ЧУЖОГО процесса шаг № 2

Запись от Van111 размещена 05.06.2012 в 20:14
Показов 12723 Комментарии 3

прочитав комментарии первой записи в блоге отлов API функций ЧУЖОГО процесса я понял что программисту который решит воспользоватся моим кодом будет довольно накладно писать обработчики для пяти функций (GetProcAddress и 4 разновидности LoadLibrary).
я решил дополнить свою инжектируемую dll , код программы инжекта остался прежним
для начала о новых переменных
C++
1
2
3
4
5
6
#define MAXMODULE 100
#define MaxModules 20
#define MaxModules_debug 2
HMODULE HModules[MaxModules];
char NameHmodules[MaxModules][MAXMODULE];
const char NameHmodules_debug[MaxModules_debug][MAXMODULE]={"KERNEL32.DLL","USER32.DLL"};
HModules это хэндлы которые будут заполнятся по мере вызова библиотек. NameHmodules - соответственно имена этих библиотек . NameHmodules_debug - имена "отлавливаемыхх" библиотек

функции ,алгоритм в кратце

HMODULE WINAPI myLoadLibrary(LPCTSTR lpFileName);
загрузили библиотеку, добавили расширение если надо, преобразовали в верхний региср

HMODULE WINAPI myLoadLibraryEx(LPCTSTR lpFileName,HANDLE hFile,DWORD dwFlags);
тоже самое что и функция выше только вызывается LoadLibraryEx

HMODULE WINAPI myLoadLibraryW(LPWSTR lpFileName);
пустышка преобразуют строку в askii формат и передаёт строку первой функции

HMODULE WINAPI myLoadLibraryExW(LPWSTR lpFileName,HANDLE hFile,DWORD dwFlags);
пустышка преобразуют строку в askii формат и передаёт строку и другие параметры второй функции

FARPROC myGetProcAddress(HMODULE hModule,LPCSTR lpProcName);
находит порядковое имя HMODULE вызываемой функции, находит порядковое имя модуля отладки(она сравнивается с первым найденным именем), после в tmp хранится номер нашего модуля, дальше можете организовать выбор хоть через switch, хоть через if
пример
if (tmp==1) / tmp =1 это номер имени модуля в данном случае user32, количество подобных инструкций может быть сколько угодно в данной функции
{
if( strcmp(lpProcName,"MessageBoxA")==0) //количество подобных строк может быть сколько угодно в данном блоке if , как видите всё просто
return (FARPROC)myMessageBox;
}
собственно вышеприведённый код - это и есть максимально упрощённый код установки отлова функций, кстати функции не обязательно могут быть API
вот код
dll_catch.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
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
222
223
224
225
226
227
#include "windows.h"
#include "Tlhelp32.h"
#include "Imagehlp.h"
#include "iostream.h"
#include "fstream.h"
#define MAXMODULE 100
#define MaxModules 20
#define MaxModules_debug 2
 
HMODULE HModules[MaxModules];
char NameHmodules[MaxModules][MAXMODULE];
const char NameHmodules_debug[MaxModules_debug][MAXMODULE]={"KERNEL32.DLL","USER32.DLL"};
 
void INIT ();
void GetCurrentProcessName(ULONG ID ,LPSTR szExeName);
int ReplaceIATEntryInOneMod(PCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller);
int WINAPI myMessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);
FARPROC myGetProcAddress(HMODULE hModule,LPCSTR lpProcName);
HMODULE WINAPI myLoadLibrary(LPCTSTR lpFileName);
HMODULE WINAPI myLoadLibraryW(LPWSTR lpFileName);
HMODULE WINAPI myLoadLibraryEx(LPCTSTR lpFileName,HANDLE hFile,DWORD dwFlags);
HMODULE WINAPI myLoadLibraryExW(LPWSTR lpFileName,HANDLE hFile,DWORD dwFlags);
char* hightReg(char* str);
 
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
    switch( fdwReason ){
        case DLL_PROCESS_ATTACH:
                        INIT();
            break;
        case DLL_THREAD_ATTACH:
 
            break;
        case DLL_THREAD_DETACH:
 
            break;
        case DLL_PROCESS_DETACH:
 
            break;    
    }
    return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////
void INIT ()
{
 
       char s[50];
       PROC func_debuG;
 
       GetCurrentProcessName(GetCurrentProcessId(),s);
       HMODULE hmodCaller = GetModuleHandle(s);
       HMODULE myHMODULE_proc=LoadLibrary("KERNEL32.DLL");
 
       func_debuG=(PROC)GetProcAddress(LoadLibrary("USER32"),"MessageBoxA");
       ReplaceIATEntryInOneMod("USER32.DLL", func_debuG,(PROC)myMessageBox,hmodCaller);
       
       //сначала получаем адрес ,потом заменяем этот адрес в таблице ипорта на свой 
       func_debuG=(PROC)GetProcAddress(myHMODULE_proc,"GetProcAddress");
       ReplaceIATEntryInOneMod("KERNEL32.DLL", func_debuG,(PROC)myGetProcAddress,hmodCaller);
       func_debuG=(PROC)GetProcAddress(myHMODULE_proc,"LoadLibraryA");
       ReplaceIATEntryInOneMod("KERNEL32.DLL", func_debuG,(PROC)myLoadLibrary,hmodCaller);
       func_debuG=(PROC)GetProcAddress(myHMODULE_proc,"LoadLibraryExA");
       ReplaceIATEntryInOneMod("KERNEL32.DLL", func_debuG,(PROC)myLoadLibraryEx,hmodCaller);
       func_debuG=(PROC)GetProcAddress(myHMODULE_proc,"LoadLibraryW");
       ReplaceIATEntryInOneMod("KERNEL32.DLL", func_debuG,(PROC)myLoadLibraryW,hmodCaller);
       func_debuG=(PROC)GetProcAddress(myHMODULE_proc,"LoadLibraryExW");
       ReplaceIATEntryInOneMod("KERNEL32.DLL", func_debuG,(PROC)myLoadLibraryExW,hmodCaller);
 
 
       return;
 
}
////////////////////////////////////////////////////////////////////////////////////////////
void GetCurrentProcessName(ULONG ID ,LPSTR szExeName)
{
        PROCESSENTRY32 Pc = { sizeof(PROCESSENTRY32) };
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
        if(Process32First(hSnapshot, &Pc))
        {
                do
                {
                        if(Pc.th32ProcessID==ID)
                        {
                                strcpy(szExeName,Pc.szExeFile);
                                return ;
                        }
                }
                while(Process32Next(hSnapshot, &Pc));
        }
}
////////////////////////////////////////////////////////////////////////////////////////////
 int ReplaceIATEntryInOneMod(PCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller)
{
        ULONG ulSize;
        ULONG tmp=0;
        PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(hmodCaller, TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);
        if (pImportDesc == NULL)
                return -1;
        for (; pImportDesc->Name; pImportDesc++)
        {
                PSTR pszModName =  (PSTR)((PBYTE) hmodCaller + pImportDesc->Name);
                if (lstrcmpiA(pszModName, pszCalleeModName) == 0)
                        break;
        }
        if (pImportDesc->Name == 0)
                return -2;
        PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA) ((PBYTE) hmodCaller + pImportDesc->FirstThunk);
        for (; pThunk->u1.Function; pThunk++)
        {
 
                PROC* ppfn = (PROC*) &pThunk->u1.Function;
                BOOL fFound = (*ppfn == pfnCurrent);
                if (fFound)
                {
                        VirtualProtect(hmodCaller,0x16000,PAGE_READWRITE,&tmp);//на всякий случай явно разрешим запись
                        WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, 4, 0 );
                        VirtualProtect(hmodCaller,0x16000,tmp,&tmp);//восстановим защиту
                        return 1;
                }
        }
        return -3;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int WINAPI myMessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)
{
        MessageBoxW(0,L"Ïåðåõâàò ñîâåðø¸í",L"Dll Monitoring",0);
        return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////
FARPROC myGetProcAddress(HMODULE hModule,LPCSTR lpProcName)
{
int i1,i2,tmp=-1;
FARPROC Farproc=GetProcAddress(hModule,lpProcName);
for(i1=0;i1<MaxModules;i1++)             
        {
                if( HModules[i1]==hModule)
                {
                        tmp=i1;
                        break;
                }
        }// в tmp лежит номер строки в которой содержится имя загруженной библиотеки 
for(i1=0;i1 <MaxModules_debug;i1++)   
{
        if(strcmp(NameHmodules[tmp],NameHmodules_debug[i1])==0)
        {
                tmp=i1;
                break;
        }
} в tmp содержится номер строки отладочных библиотек, которая совпало с номером строки находящимся в  прошлой tmp(то есть в tmp которую мы получили с прошлого цикла)
 
        if (tmp==0) //номер строки 1 -это библиотека kernel
        {
        }
         if (tmp==1)//номер строки 2 -это библиотека гыук   
        {
               if( strcmp(lpProcName,"MessageBoxA")==0) //тут вы сравниваете любые функции входящие в текущую библиотеку, и если это перехватываемая функция ,то подсовываете ей функцию отладчик
                        return (FARPROC)myMessageBox;
        }
return Farproc;
}
//////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////
HMODULE WINAPI myLoadLibrary(LPCTSTR lpFileName)
{
int i;
HMODULE Hmodule=LoadLibrary(lpFileName);
for(i=0;HModules[i] !=0;i++){}
HModules[i]=Hmodule;
//блок if  нужен для добавки dll ,также строка приводится к верхнему регистру, это нужно чтобы названия совпала с нашими dll  
if (   ((const char*)strstr(lpFileName,(const char*)".dll")) == ((const char*) strstr(lpFileName,(const char*)".DLL"))   )
        {
        strcpy(NameHmodules[i],lpFileName);
        strcpy((NameHmodules[i] + strlen(NameHmodules[i])),".DLL");
        strupr(NameHmodules[i]);
        }
else
        {
        strcpy(NameHmodules[i],lpFileName);
        strupr(NameHmodules[i]);
        }
return Hmodule;
}
//////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////
HMODULE WINAPI myLoadLibraryEx(LPCTSTR lpFileName,HANDLE hFile,DWORD dwFlags)
{
int i;
HMODULE Hmodule=LoadLibraryEx(lpFileName,hFile,dwFlags);
for(i=0;HModules[i] !=0;i++){}
HModules[i]=Hmodule;
//блок if  нужен для добавки dll ,также строка приводится к верхнему регистру, это нужно чтобы названия совпала с нашими dll  
if (   ((const char*)strstr(lpFileName,(const char*)".dll")) == ((const char*) strstr(lpFileName,(const char*)".DLL"))   )
        {
        strcpy(NameHmodules[i],lpFileName);
        strcpy((NameHmodules[i] + strlen(NameHmodules[i])),".DLL");
        strupr(NameHmodules[i]);
        }
else
        {
        strcpy(NameHmodules[i],lpFileName);
        strupr(NameHmodules[i]);
        }
return Hmodule;
}
//////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////
HMODULE WINAPI myLoadLibraryW(LPWSTR lpFileName)
{
char s[MAXMODULE];
WideCharToMultiByte(CP_THREAD_ACP,0,lpFileName,MAXMODULE/2,s,MAXMODULE,0,0);
return myLoadLibrary(s);
}
//////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////
HMODULE WINAPI myLoadLibraryExW(LPWSTR lpFileName,HANDLE hFile,DWORD dwFlags)
{
char s[MAXMODULE];
WideCharToMultiByte(CP_THREAD_ACP,0,lpFileName,MAXMODULE/2,s,MAXMODULE,0,0);
return myLoadLibraryEx(s,hFile,dwFlags);
}
//////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////
char* hightReg(char* str)
{
    int i;
    int len=strlen(str);
    for(i=0;i<len;i++)
    {
        if(str[i]>='a'&& str[i]<='z') str[i]-=str[i]-32;
    }
  return str;
}
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 3
Комментарии
  1. Старый комментарий
    Аватар для Pure
    напиши плиз комменты к своему коду. например интересно почему
    PROC MessageBOX = GetProcAddress(GetModuleHandle("User32"), "MessageBoxA");
    ты решил заменить на
    func_debuG=(PROC)GetProcAddress(LoadLibrary("USER32"),"MessageBoxA");
    т.е. ты подразумевал что user32 не загружен и ты его подгружаешь самостоятельно?

    это вот - для чего?
    VirtualProtect(hmodCaller,0x16000,PAGE_R EADWRITE,&tmp);
    Запись от Pure размещена 13.06.2012 в 17:16 Pure вне форума
  2. Старый комментарий
    насчёт GetModuleHandle я просто не заметил, а так можно конечно оставить его вместо LoadLibrary
    Запись от Van111 размещена 15.06.2012 в 12:17 Van111 вне форума
  3. Старый комментарий
    Аватар для Pure
    да не нужно оно - менять атрибуты защиты. они в порядке будут. Я как бы к этому вел.

    Я видел, что ты изучаешь ассемблер. Хотелось бы увидеть от тебя объединение твоей длл и знаний ассемблера в использовании классической уязвимости

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(int argc, char* argv[])
    {
        char buf [10] = {0};
        if(argc==1)
        {   
            printf("no data\n");
            system("Pause");
        }
        else if(argc==2)
        {
     
            strcpy(buf,argv[1]);
            printf("%s\n",buf); 
            system("Pause");
        }
        return 0;
    }
    т.е. после запуска этой программы и подачи ей на вход нужной информации, например у запущенного калькулятора меняется какая либо функция, например установки текста в окошко, на твою. Это будет реально классно и полезно. Никакого вреда тут нет, это просто эксперименты с системой.
    Запись от Pure размещена 16.06.2012 в 15:18 Pure вне форума
 
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru