Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Студент
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
1

Перехват API

01.11.2013, 12:38. Показов 1123. Ответов 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
DWORD dwProtect = PAGE_READWRITE;
 
BYTE old[5];
 
BYTE * fPtr;
 
#pragma pack(push, 1)
struct jump_near
{
    BYTE opcode;
    DWORD relativeAddress;
};
#pragma pack(pop)
 
 
#pragma pack(push, 1)
struct org
{
    char old[5];
    struct jump_near jump;
};
#pragma pack(pop)
 
 
struct org oPtr;
 
size_t _CalculateDispacement(void* lpFirst, void* lpSecond)
{
    return reinterpret_cast<char*>(lpSecond) - (reinterpret_cast<char*>(lpFirst) + 5);
}
 
void splice()
{
    MessageBox(0, "Hello from splice", "OK", MB_OK);
 
    VirtualProtect(&oPtr, sizeof(oPtr), dwProtect, &dwProtect);
 
    BYTE * go = (BYTE*)&oPtr;
 
    __asm
    {
        jmp go
    }
}
 
 
 
void WINAPI start()
{
    
    MessageBox(0, "Ready!?", "", MB_OK);
    
    struct jump_near jump;
 
    fPtr = (BYTE * )GetProcAddress(GetModuleHandle(TEXT("*******")), "*******");
 
    jump.relativeAddress = _CalculateDispacement(fPtr, splice);
 
    jump.opcode = 0xE9;
 
    memcpy(old, fPtr, 5);
    
    VirtualProtect(fPtr, sizeof(jump_near), dwProtect, &dwProtect);
    
    WriteProcessMemory(GetCurrentProcess(), (void*)fPtr, (void*)&jump, 5, 0);
    
    memcpy(oPtr.old, old, 5);
 
    oPtr.jump.opcode = 0x9E;
    oPtr.jump.relativeAddress = (unsigned long)(fPtr + 6);
    
    MessageBox(0, "Finish", "OK", MB_OK);
}
 
 
 
 
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
 
 
switch (ul_reason_for_call) 
{ 
    case DLL_PROCESS_ATTACH: 
    {
        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start, NULL, NULL, NULL); 
    }
    break; 
 
    case DLL_THREAD_ATTACH: break; 
    case DLL_THREAD_DETACH: break;
    case DLL_PROCESS_DETACH: break; 
} 
 
    return TRUE;
}
Перехват выполняется, срабатывает.
C++
1
MessageBox(0, "Hello from splice", "OK", MB_OK);
А дальше вылетает программа, просьба если кто может подсказать правильно ли реализован трамплин. Буду признателен за любые подсказки.

Добавлено через 28 минут
Поменял это:
C++
1
oPtr.jump.opcode = 0x9E;
На это:
C++
1
oPtr.jump.opcode = 0xEA;
Тоже самое
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2013, 12:38
Ответы с готовыми решениями:

Перехват API функции
Доброго времени суток всем! Уважаемые форумчене помогите решить задачу, я взял функцию MessageBox и...

Перехват API вызовов
Здравствуйте! Пытаюсь перехватить вызов функции CreateFileW и заменить на свою MyCreateFileW. Для...

Перехват API, Рихтер
Всем доброго времени суток! Собственно такой вопросик... я вот читаю сейчас Рихтера и мне интересен...

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

2
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
01.11.2013, 12:44 2
Следует подождать завершения потока (WaitForSingleObject).
ThreadProc не соответствует прототипу.
1
Студент
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
01.11.2013, 13:00  [ТС] 3
Ну я не нажимаю на Finish, пока не сработает перехват. Вся проблема в том что не получается после перехвата перейти на орыгинальные 5 байт, а затем jmp на остальную часть ptr + 6.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.11.2013, 13:00

Перехват API с возвратом значения
Я тут решил разобраться в перехвате API с помощью инжектированной dll. Спустя 2 дня написал...

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

Перехват api-вызова. Ошибка при выполнении
Здравствуйте, есть dll-ка, которая успешно внедряется во все(или почти все) оконные приложения с...

Перехват API вызовов через таблицу импорта
Доброго времени суток. Есть следующая задача. Нужно перехватить вызов некоторых определённых...


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

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

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