1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
1

Перехват Winapi функций

29.05.2013, 21:42. Показов 1780. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Целый день пытаюсь побороть перехват с помощью dll, как-то ничего не получается, а google выдаёт только код Рихтера, но он не работает. Помогите найти ошибку.

замена адреса, вроде бы работает.
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
#include "stdafx.h"
#include "Win32Project1.h"
 
HANDLE logFile;
 
void ReplaceIATEntryInOneMod(PCSTR pszCallerModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller) { 
    ULONG ulSize;
    PIMAGE_IMPORT_DESCRIPTOR pImportDesc =
        (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(hmodCaller, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize); 
    if (pImportDesc == NULL) 
        return; // в этом модуле нет раздела импорта 
    // находим дескриптор раздела импорм со ссылками 
    // на функции DLL (вызываемого модуля) 
    for (; pImportDesc->Name; pImportDesc++) {
        PSTR pszModName = (PSTR) ((PBYTE) hmodCaller + pImportDesc->Name);      
        if (lstrcmpiA(pszModName, pszCallerModName) == 0) break; 
    } 
    if (pImportDesc->Name == 0) // этот модуль не импортирует никаких функций из данной DLL
        return;
    // получаем таблицу адресов импорта (IAT) для функций DLL
    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);
        // см. текст программы-примера, в котором 
        // содержится трюковый код для Windows 98 
        if (fFound) {           // адреса сходятся, изменяем адрес в разделе импорта 
            WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, sizeof(pfnNew), NULL );      
            return; // получилось, выходим 
        } 
    } 
    // если мы попали сюда, значит, в разделе импорта 
    // нет ссылки на нужную функцию 
}
 
BOOL __stdcall DllMain(_In_  HMODULE hModuleDLL,_In_  DWORD fdwReason,_In_  LPVOID lpvReserved){
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        logFile = CreateFileW(L"d:\\results.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, NULL, NULL);
        Initialize(L"d:\\results.txt");
        ReplaceIATEntryInOneMod("Kernel32.dll", GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "CreateFileW"),
             GetProcAddress(GetModuleHandle(NULL), "CreateFileWNew"), GetModuleHandle(NULL));
        break;
    case DLL_PROCESS_DETACH:
        CloseHandle(logFile);
        Finalize();
        break;
    }
}
Функция перехватчик:
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
#include "stdafx.h"
#include "NewFunctions.h"
 
typedef HANDLE (WINAPI *CreateFileWProc)(LPCWSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
CreateFileWProc CreateFileWOriginal;
 
HANDLE log;
 
BOOL Initialize(const wchar_t* logPath) {
    log = CreateFileW(logPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, NULL, NULL);
    CreateFileWOriginal = (CreateFileWProc)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "CreateFileW");
    return true;
}
 
BOOL Finalize(){
    CloseHandle(log);
    return true;
}
 
HANDLE WINAPI CreateFileWNew(_In_ LPCTSTR lpFileName, _In_ DWORD dwDesiredAccess,_In_ DWORD dwShareMode,
        _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,_In_ DWORD dwCreationDisposition,
        _In_ DWORD dwFlagsAndAttributes,_In_opt_ HANDLE hTemplateFile){
    CreateFileWOriginal(L"d:\\yes.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, NULL, NULL);
    HANDLE result = CreateFileWOriginal(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition,
        dwFlagsAndAttributes, hTemplateFile);
    return result;
}
Тестирующая программа
C++
1
2
3
4
5
6
int _tmain(int argc, _TCHAR* argv[])
{
    Sleep(1000); // со слипом вылетает, без него никакого эффекта
    CloseHandle(CreateFileW(L"d:\\1.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, NULL, NULL));
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2013, 21:42
Ответы с готовыми решениями:

Перехват WinAPI функций
Приветвую всех. Недавно заинтересовался перехватом функций. Слышал различные методы, касающиеся...

Предотвратить перехват WINAPI
Приветствую. Есть одна игра. У неё стоит защита в виде длл - fire.dll с помощью неё происходит...

Перехват системных сообщений в приложении WinApi
Имеется соответствующее приложение, которое не имеет своего окна и работает в фоне в бесконечном...

Перехват нажатия клавиш в Edit Control WinApi
Добрый вечер! Помогите пожалуйста решить проблему! У меня есть диалоговое окно на нем Edit...

2
390 / 178 / 2
Регистрация: 14.03.2012
Сообщений: 443
30.05.2013, 16:23 2
Цитата Сообщение от VaeVictis Посмотреть сообщение
Sleep(1000); // со слипом вылетает, без него никакого эффекта
Если вы данным способом инжектите, то конечно работать не будет. Dll просто не успеет заинжектится, CreateFileW выполнится быстрее. Потому и при слипе падение, т.к. при слипе успевает. Т.е. у вас в самом хуке косяки. )) Вообще, вы хотя бы засуспендженым процесс запускали, а уж потом инжектили, переключали контекст и размораживали (подробней #6), и то это не надёжно, т.к. процесс ещё окончательно не инициализирован. Вообще правельней было бы запускать процесс засуспендженым и патчить EP (EP можно через PEB урвать). Так же не забывайте про многопоточность. При инжекте в уже активный процесс больше сложностей.
0
1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
30.05.2013, 20:49  [ТС] 3
Спасибо конечно, но это я и так знал. Мне нужно, что бы меня тыкнули носом в ошибку в перехвате.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2013, 20:49
Помогаю со студенческими работами здесь

Перехват API функций
Разработать программу, которая запускает приложение, переданное программе на вход. После запуска...

Перехват функций. Не работает вариант с юникодом
Здравствуйте, столкнулся со следующей проблемой: при инъекции dll в чужой процесс не работает...

Перехват API функций. Таблица импорта
Необходимо лoггиpoвaть вызовы некоторых API-шных функций (для примера CloseHandle) в заданном...

Рисование графиков функций в WinApi
Доброе время суток. Я начинающий программист хочу попросить помощи у вас собратьев. Написал код ,а...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru