Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/47: Рейтинг темы: голосов - 47, средняя оценка - 4.87
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 169

Хук на C# (Hook on C#)

13.07.2014, 16:46. Показов 9951. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый день. знаю на форуме много тем про всякие хуки клавиатуры или мыши, но вирусные программы меня не интересуют, я хотел бы узнать как в на C# сделать хук на заданный адрес нужной программы(процесса). Возможно ли это сделать на данном зыке ? Спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.07.2014, 16:46
Ответы с готовыми решениями:

В чем преимущество trampoline hook над обычным hook?
Объясните пожалуйста в чем преимущество trampoline hook и hook? Никак не могу понять

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

Hook
Может кто проэкт кинуть кейлогера а то у мну че то проблема с DLL

14
Заблокирован
13.07.2014, 20:08
На данном языке можно сделать все что душе угодно!
2
83 / 78 / 14
Регистрация: 14.06.2012
Сообщений: 261
14.07.2014, 10:34
Цитата Сообщение от Butter Посмотреть сообщение
На данном языке можно сделать все что душе угодно!
ОС написать на нем сможешь?
2
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
14.07.2014, 10:43
Вот например 2 способа:
1) HW Breakpoint (Подключение отладчика и установка точек останова.)
Кликните здесь для просмотра всего текста

Кожд на С++, но легко портируется на C#
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
void SetBreakpoints(DWORD pid, DWORD hoockAddress, DWORD dr7 = 1)
{
    THREADENTRY32 te = { sizeof(THREADENTRY32) };
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, pid);
    int count = 0;
    CONTEXT thread_context = { CONTEXT_ALL };
 
    if (Thread32First(hSnapshot, &te))
    {
        do
        {
            if (te.th32OwnerProcessID == pid)
            {
                thread_context = { CONTEXT_ALL };
                HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, te.th32ThreadID);
 
                SuspendThread(hThread);
 
                GetThreadContext(hThread, &thread_context);
                
                // max 4 HW break
                thread_context.Dr0 = hoockAddress; // Dr0-Dr3 - HW breakpoint Address
                thread_context.Dr7 = dr7;          // L0-L3   - Flag activate Dr0-Dr3 (4 bit)
 
                if (!SetThreadContext(hThread, &thread_context))
                    printf("Error: %i\n", GetLastError());
 
                ResumeThread(hThread);
                CloseHandle(hThread);
            }
        } while (Thread32Next(hSnapshot, &te));
    }
}

2) Code cave injections
Тут все просто, но надо знать ассемблер.
По нужному адресу записываем байткод перехода, в том месте куда адресует переход обрабатываем ситуацию.
потом выполняем перезаписанный код, и переходим на место первоначального перехода.

На пальцах рассказать не сильно получается, на деле все проще.
Если хотите более подробно, погуглите.

ЗЫ. но еще раз повторяюсь, все эти методы требуют понимания, что такое регистры и флаги, а во втором случае надо знать что такое стек, да и вообще знание ассемблера желательно.

Удачи вам в начинаниях.

Добавлено через 46 секунд
ОС написать на нем сможешь?
а как же это: http://ru.wikipedia.org/wiki/C... ая_система)
1
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,821
15.07.2014, 00:46
Цитата Сообщение от Butter Посмотреть сообщение
На данном языке можно сделать все что душе угодно!
далеко не все , в основном задачи прикладного уровня , а вот с низкоуровневым
программированием уже проблемы.
Цитата Сообщение от Konctantin Посмотреть сообщение
Вот например 2 способа:
и оба не будут работать в c# без еще кучи вспомогательного функционала на С++.

Есть библиотечка http://easyhook.codeplex.com/ , которая облегчает жизнь в этом плане - т.е реализует хардкорную часть функционала на C++ , маршалит хукнутые функции в NET c# , а так же позволяет выполнять комманды через IPC канал.
2
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
15.07.2014, 11:27
и оба не будут работать в c# без еще кучи вспомогательного функционала на С++.
И что такого зазорного в pinvok'e? И какое отношение имеют WinApi функции к С++ функционалу?
а вот с низкоуровневым
а что с низкоуровневым?
вот пример вызова функции с параметрами из процесса:
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
public void Call(IntPtr address, params int[] funcArgs)
{
    var tHandle = OpenThread(ThreadAccess.All, false, this.Process.Threads[0].Id);
    if (SuspendThread(tHandle) == 0xFFFFFFFF)
        throw new Win32Exception();
 
    var context = new CONTEXT { ContextFlags = ContextFlags.Control };
    if (!GetThreadContext(tHandle, ref context))
        throw new Win32Exception();
 
    var retaddr = Write<uint>(0xDEAD);
 
    var bytes = new List<byte>();
 
    #region ASM
 
    // push eip (stored refernse to next inctruction)
    bytes.Add(0x68);
    bytes.AddRange(BitConverter.GetBytes(context.Eip));
 
    // pushad (stored general registers)
    bytes.Add(0x60);
    // pushfd (stored flags)
    bytes.Add(0x9C);
 
    // pushed to the stack function arguments
    for (int i = funcArgs.Length - 1; i >= 0; --i)
    {
        if (funcArgs[i] == 0)
        {
            // push 0
            bytes.Add(0x6A);
            bytes.Add(0x00);
        }
        else
        {
            // push address
            bytes.Add(0x68);
            bytes.AddRange(BitConverter.GetBytes(funcArgs[i]));
        }
    }
 
    // mov eax, address
    var addr = this.Process.MainModule.BaseAddress.ToInt32() + address.ToInt32();
    bytes.Add(0xB8);
    bytes.AddRange(BitConverter.GetBytes(addr));
 
    // call eax
    bytes.Add(0xFF);
    bytes.Add(0xD0);
 
    // add esp, arg_count * pointer_size (__cdecl correct stack)
    bytes.Add(0x83);
    bytes.Add(0xC4);
    bytes.Add((byte)(funcArgs.Length * IntPtr.Size));
 
    // mov [retaddr], eax
    bytes.Add(0xA3);
    bytes.AddRange(BitConverter.GetBytes(retaddr.ToInt32()));
 
    // popfd (restore flags)
    bytes.Add(0x9D);
    // popad (restore general registers)
    bytes.Add(0x61);
    // retn
    bytes.Add(0xC3);
 
    #endregion
 
    var injAddress = new IntPtr(this.Process.MainModule.BaseAddress.ToInt32() + Offsets.Default.InjectedAddress);
    var oldProtect = MemoryProtection.ReadOnly;
 
    // Save original code and disable protect
    var oldCode = this.ReadBytes(injAddress, bytes.Count);
    if (!VirtualProtectEx(this.Process.Handle, injAddress, bytes.Count, MemoryProtection.ExecuteReadWrite, out oldProtect))
        throw new Win32Exception();
 
    this.Write(injAddress, bytes.ToArray());
 
    context.Eip          = (uint)injAddress.ToInt32();
    context.ContextFlags = ContextFlags.Control;
 
    if (!SetThreadContext(tHandle, ref context) || ResumeThread(tHandle) == 0xFFFFFFFF)
        throw new Win32Exception();
 
    for (int i = 0; i < 0x100; ++i)
    {
        System.Threading.Thread.Sleep(15);
        if (this.Read<uint>(retaddr) != 0xDEAD)
            break;
    }
 
    // restore protection and original code
    this.Write(injAddress, oldCode);
    if (!VirtualProtectEx(this.Process.Handle, injAddress, bytes.Count, oldProtect, out oldProtect))
        throw new Win32Exception();
 
    this.Free(retaddr);
}
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,821
15.07.2014, 23:44
Вы бы не копипастом занимались , а сами проверили ).
Естественно что можно записать байты в адресное пространтсво другого процесса , но вопрос то про хуки - т.е требуется что бы чужой процесс мог вызвать функцию в вашем управляемом коде., и никакой вин.апи + pinvoke только лишь средствами NET тут не поможет.

а что с низкоуровневым?
ну подключите свою управляемую dll в чужой процесс и считайте значения регистров ? - совершенно разная архитектура и организация рабты с памятью. Напишите драйвер на NET ? , да глупо тут перечислять очевидные вещи. NET заточент под прикладные разработки в пользовательсоком режиме , все остальное С++/asm и иже с ним. или гибридные решения что бы как то обеспечить взаимодествие управляемого и неуправляемого кода.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.07.2014, 23:54
sau, полагаете, та же Cosmos, написанная чисто на шарпе, тоже дрова будет иметь на асме? Или это "Не имеет будущего, потому что не С++"?
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
15.07.2014, 23:56
Цитата Сообщение от sau Посмотреть сообщение
Естественно что можно записать байты в адресное пространтсво другой процесса , но вопрос то про хуки - т.е требуется что бы чужой процесс мог вызвать функцию в вашем управляемом коде., и никакой вин.апи + pinvoke тут не поможет.
Почему бы и нет, в принципе задача решаемая, ставил хук на D3DEndScene.

Вот скриншот


При желании на шарпе можно провернуть все что угодно, в пределах юзермода
1
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
16.07.2014, 00:35
Вы бы не копипапстом занимались , а сами проверили ).
это мой рабочий код.
вопрос то про хуки - т.е требуется что бы чужой процесс мог вызвать функцию в вашем управляемом коде.
Вы про эвенты слышали?

Вот вы много пытаетесь "чего-то доказать" но на самом деле все гараздо проче, чем вы описываете, и очень легко подключать саму managed сборку к процессу, и подписатся на событие.

ЗЫ. И не надо говорить что это невозможно:?
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
16.07.2014, 03:13
Цитата Сообщение от Butter Посмотреть сообщение
На данном языке можно сделать все что душе угодно!

Не по теме:

окей, сделай мне асм вставки, для получения значений регистров, а я посмотрю, как это у тебя выйдет :D

0
16.07.2014, 07:13

Не по теме:

Winhttp22, вызов принят

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[DllImport("kernel32.dll", SetLastError = true)]
static unsafe extern bool VirtualProtect(void* lpAddress, int dwSize, uint flNewProtect, uint* lpflOldProtect);
private delegate uint UnsafeFunction();
private static unsafe uint getEIP()
{
    uint result = 0;
    byte[] code = {
        0xE8, 0x00, 0x00, 0x00, 0x00, // call next
        // next:
        0x58,                         // pop eax
        0xC3                          // ret
    };
    fixed (void* codePtr = &code[0])
    {
        uint oldProtect;
        VirtualProtect(codePtr, code.Length, 0x40 /* ExecuteRW */, &oldProtect);
        var func = (UnsafeFunction)Marshal.GetDelegateForFunctionPointer(new IntPtr(codePtr), typeof(UnsafeFunction));
        result = func();
        VirtualProtect(codePtr, code.Length, oldProtect, &oldProtect);
    }
    return result;
}

0
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 169
17.07.2014, 11:37  [ТС]
извиняюсь, что отсутствовал 3 дня. Почитав посты, предлагали делать Бряки на адрес, но ведь он нужен для получения инфы со стека или регистров, а в плане хука подразумевалось, что при выполнении своей операции заданной программой, выполнялась не она, а то что задал я, ну и желательно без модификаций, то есть джампа в свободную область-выполнение-джамп обратно.
Натыкался на DLL`ку EasyHook , но не смог наковырять в ней такого действия
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
17.07.2014, 15:04
Цитата Сообщение от skew Посмотреть сообщение
предлагали делать Бряки на адрес, но ведь он нужен для получения инфы со стека или регистров
таким способом можно делать по 4 полноценных хука на поток, суть в том что бы поставить бряк на нужный адрес, и установить обработчик исключений через AddVectoredExceptionHandler, в этом обработчике ловить наши бряки и менять им EIP регистр(адрес возврата грубо говоря) на наш хук, а из хука уже делать джамп на оригинальную функцию.
В общем на шарпе сделать возможно, но проще сделать на нативном языке (С, D, Delphi), заодно и другой язык выучите
0
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 169
17.07.2014, 15:54  [ТС]
Yukikaze, ну я с делфи год-полтора занимался точно, но сейчас больше сам процесс написания подобного на шарпе интересует, чем результат. Вот добрел до этого и решил попробовать, пробовал делать обычные асемблерные вставки и выполнять их, тестил на самой банальной игре "Пасьянс Паук" , попытка повторить функцию добавления очков прошла на 50%, то есть заданное кол-во очков добавляет и через секунду краш, как исправить так и не сообразил. Вот так выглядит сама функция

PUSH -1 ;Кол-во добавляемых очков
MOV ECX,ESI
MOV DWORD PTR DS:[ESI+5C],EDI
CALL 01003596 ; Вызов самой функции добавления

Если делать просто через программу изменение памяти и перенос этого же действия, то все отлично, а если нужно удаленно вызвать, то уже никак, то есть через CreateRemoteThread, в конце концов краш приложения
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.07.2014, 15:54
Помогаю со студенческими работами здесь

hook
моя работа заключается в написании сервиса с функцией контроля действий пользователя в системе.Как с помощью hooka решить данную...

Hook в qt
Привет всем, делаю приложение в котором должно перехватываться нажатие клавиши, для этого сделал dll. #ifndef HOOKING_H #define...

Hook
Пытаюсь разобраться в Hook'ах, по статье на delphisources Мне нужно поставить глобальную ловушку на нажатия клавиш Page Up и Page Down...

Hook клавиатуры
Приветствую всех, подскажите мне, пожалуйста, как установить хук клавиатуры на кнопку F12? С хуками пытался разобраться... но не особо...

InternetReadFile hook
Доброго времени суток! #include &lt;Windows.h&gt; #include &lt;iostream&gt; #include &lt;MinHook.h&gt; #include &lt;wininet.h&gt; #pragma...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru