Перейти к содержанию

Рекомендуемые сообщения

Итак,хотелось бы затронуть такую тему как Хук функций на c#. Соответсвенно со сканером сигнатур.

Но главный вопрос каким образом можно найти code cave, и сделать переадресацию на свою кастомную функцию?

Только c#, без плюсов)))

Ссылка на комментарий
Поделиться на другие сайты

  В 23.04.2017 в 08:58, keng сказал:

Привет! Pinvoke и вперед, все то же самое. Правда, inline-ассемблера в шарпе нет, так что придется возиться с сырыми опкодами команд.

Показать  

Чем мне поможет pinvoke. Нажо ведь хукнуть endscene из приложения, но пока что не особо понимаю что к чему

Ссылка на комментарий
Поделиться на другие сайты

  В 23.04.2017 в 09:00, roma91212 сказал:

Чем мне поможет pinvoke. Нажо ведь хукнуть endscene из приложения, но пока что не особо понимаю что к чему

Показать  

Так банально ReadProcessMemory для поиска функции и WriteProcessMemory для записи хука, например. Или как ты себе представляешь процесс? В шарпе прямого доступа к winapi нет, так что pinvoke и unmanaged-код - чуть ли не единственный вариант.

Ссылка на комментарий
Поделиться на другие сайты

  В 23.04.2017 в 09:03, keng сказал:

Так банально ReadProcessMemory для поиска функции и WriteProcessMemory для записи хука, например. Или как ты себе представляешь процесс? В шарпе прямого доступа к winapi нет, так что pinvoke и unmanaged-код - чуть ли не единственный вариант.

Показать  

Насчет чтения, записи - у меня есть уже одна библиотека.

День назад делал свой чит для кс, но само рисование было поверх окна, пусть без мерцаний, но такой результат мне все равно не нравится. Поэтому я и хочу сделать хук endscene 

Ссылка на комментарий
Поделиться на другие сайты

Я предположу, что даже у unsafe функции будет пролог, так что не совсем понятно, куда пихать начало старой EndScene после записи вместо него перехода на хук. Можно, конечно, психануть и все руками написать - выделить место, записать туда код побайтово, а затем использовать это как функцию. Проблема, в общем, в том, что нельзя сделать declspec naked в шарпе.

Ссылка на комментарий
Поделиться на другие сайты

  В 23.04.2017 в 09:14, keng сказал:

Я предположу, что даже у unsafe функции будет пролог, так что не совсем понятно, куда пихать начало старой EndScene после записи вместо него перехода на хук. Можно, конечно, психануть и все руками написать - выделить место, записать туда код побайтово, а затем использовать это как функцию. Проблема, в общем, в том, что нельзя сделать declspec naked в шарпе.

Показать  

А почему нельзя найти просто endscene, codecave. И поьои при каждом вызове оригинальной endscene, прыгать на свою в code cave перед этим рисуя что мне нужно

Изменено пользователем roma91212
Этот интерфейс с телефона неадекватен. Нельзя стирать введенное сообщение....
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
  В 23.04.2017 в 09:34, roma91212 сказал:

А почему нельзя найти просто endscene, codecave. И поьои при каждом вызове оригинальной endscene, прыгать на свою в code cave перед этим рисуя что мне нужно

Показать  

1) найти начало виртуальной таблицы
2) посчитать смещение до нужной функции 

int dwVTable = 0x0;//условный указатель на виртуальную таблицу.
int EndSceneAddress = dwVTable + 168;//EndScene=42, 42*4=168

3) взять от туда адресс оригинальной EndScene
4) написать свою EndScene на С++, посмотреть как она выглядит, снять сигнатуру, или же прочитать сигнатуру оригинальной функции и просто скомуниздить. 

typedef HRESULT	(WINAPI* oEndScene)(LPDIRECT3DDEVICE9 pDevice);
oEndScene pEndScene = NULL;

HRESULT APIENTRY myEndScene( LPDIRECT3DDEVICE9 pDevice )
{
	return pEndScene( pDevice );
}

5) хукнуть оригинальную endScene по примеру с ютуба. (основная задача выцепить виртуальную таблицу, можно FindPattern юзать)

Хукнуть то выйдет, а вот сколько гемороя будет с инициализацией и обработкой шрифта, линий... Дешевле на С++ Dll писать и инжектить.

Все вышеизложенное крайне кратко, стоит понимать что придется потеть.
 

Изменено пользователем iDReeM
P.S
Ссылка на комментарий
Поделиться на другие сайты

  В 23.04.2017 в 05:39, roma91212 сказал:

Итак,хотелось бы затронуть такую тему как Хук функций на c#. Соответсвенно со сканером сигнатур.

Но главный вопрос каким образом можно найти code cave, и сделать переадресацию на свою кастомную функцию?

Только c#, без плюсов)))

Показать  

А готовый библиотекой пользоваться приветствуется?

Ссылка на комментарий
Поделиться на другие сайты

  В 08.05.2017 в 21:48, roma91212 сказал:

Чистый с# приветствуется))

Показать  

Ну, не совсем чистый C#, в прочем почитай про них сам. Называется

1. "EasyHook". (для инъекции библиотеки написанный на C# в любую программу)

2. "SharpDX" (типо аналог DirectXа на C#)

Я делал хук на примере Chameleon Wallhack по видео Keng`a только на C# с помощью этих библиотек, получилось довольно не плохо.

Ссылка на комментарий
Поделиться на другие сайты

  В 23.04.2017 в 09:14, keng сказал:

Я предположу, что даже у unsafe функции будет пролог, так что не совсем понятно, куда пихать начало старой EndScene после записи вместо него перехода на хук. Можно, конечно, психануть и все руками написать - выделить место, записать туда код побайтово, а затем использовать это как функцию. Проблема, в общем, в том, что нельзя сделать declspec naked в шарпе.

Показать  

Ошибаешься, базоыве знания C#.

А "старый EndScene" никуда пихать не надо

Делаешь jmp на свой EndScene, рисуешь, убираешь прыжок, вызываешь старый EndScene, ставишь прыжок обратно.

Изменено пользователем Blackdots
Ссылка на комментарий
Поделиться на другие сайты

  В 08.05.2017 в 22:17, Laziz сказал:

"EasyHook". (для инъекции библиотеки написанный на C# в любую программу)

Показать  

Зачем? Это тоже самое, что скачать библиотеку которая умеет выводить MessageBox, изихук - лишнее

Ссылка на комментарий
Поделиться на другие сайты

  В 16.05.2017 в 00:40, Blackdots сказал:

Ошибаешься, базоыве знания C#.

А "старый EndScene" никуда пихать не надо

Делаешь jmp на свой EndScene, рисуешь, убираешь прыжок, вызываешь старый EndScene, ставишь прыжок обратно.

Показать  

Тогда я бы посмотрел на пример кода.

Ссылка на комментарий
Поделиться на другие сайты

  В 16.05.2017 в 12:29, keng сказал:

Тогда я бы посмотрел на пример кода.

Показать  
  Quote

        public static int HookedEndScene(IntPtr pointer)
        {
            using(var device = Device.FromPointer(pointer))
            {

                // Risuem))))

                hook.UnsetJump();
                int toret = device.EndScene().Code;
                hook.SetJump();

                return toret;
            }
        }

Показать  

 

Ссылка на комментарий
Поделиться на другие сайты

  В 16.05.2017 в 00:40, Blackdots сказал:

Делаешь jmp на свой EndScene, рисуешь, убираешь прыжок, вызываешь старый EndScene, ставишь прыжок обратно.

Показать  

Такой способ не очень хорош. Постоянно перезаписывать функцию - очень и очень фигово. В случае с EndScene может и нормально, потому что в принципе только один поток вызывает эту функцию, но если это какая-нибудь APIшка которую могут использовать разные потоки - то тебе хана. Лучше сделать как сказал keng:

  В 23.04.2017 в 09:14, keng сказал:

Можно, конечно, психануть и все руками написать - выделить место, записать туда код побайтово, а затем использовать это как функцию

Показать  

И ты так говоришь, keng, как будто это офигеть как тяжело ("психануть", "все руками"..), но на самом деле это самый трушный способ что есть. По моему так же делает detours, когда он переносит эти самые 5 байт (в идеале) в выделенное место и добавлят после них jmp EndScene+5. И это можно реализовать на любом языке, который может хоть как-то работать с памятью напрямую.

Ссылка на комментарий
Поделиться на другие сайты

  В 17.05.2017 в 14:19, uhx сказал:

Такой способ не очень хорош. Постоянно перезаписывать функцию - очень и очень фигово. В случае с EndScene может и нормально, потому что в принципе только один поток вызывает эту функцию, но если это какая-нибудь APIшка которую могут использовать разные потоки - то тебе хана. Лучше сделать как сказал keng

Показать  

Не могу себе представить, что endscene будут вызывать разные потоки

Можно найти call EndScene в самой игре и заменить её на call HookedEndScene и уже самому вызывать оригинал без перезаписей и тд, но в игре могут быть проверки девственности кода.

Кстати, побайтово в игру ничего записывать не нужно, это полный бред, достаточно записать указатель на свою функцию

Ссылка на комментарий
Поделиться на другие сайты

  В 17.05.2017 в 14:58, Blackdots сказал:

Кстати, побайтово в игру ничего записывать не нужно, это полный бред, достаточно записать указатель на свою функцию

Показать  

лол. ну а это не является записью, что ли:

  В 17.05.2017 в 14:58, Blackdots сказал:

Можно найти call EndScene в самой игре и заменить её на call HookedEndScene

Показать  

и тогда уж проще найти девайс и поставить хук в его виртуальной таблице, не?

  В 17.05.2017 в 14:58, Blackdots сказал:

Не могу себе представить, что endscene будут вызывать разные потоки

Показать  

Я же сказал, что с EndScene это еще нормально, но такой хук сам по себе очень плохой.

  В 17.05.2017 в 14:58, Blackdots сказал:

но в игре могут быть проверки девственности кода.

Показать  

Первое - их можно обойти. Второе - никто и никогда не проверяет EndScene на "целостность", потому что любая записывающая видеоролики программа способна поставить хук на эту функцию.

Изменено пользователем uhx
Ссылка на комментарий
Поделиться на другие сайты

  В 17.05.2017 в 15:07, uhx сказал:

лол. ну а это не является записью, что ли:

и тогда уж проще найти девайс и поставить хук в его виртуальной таблице, не?

Я же сказал, что с EndScene это еще нормально, но такой хук сам по себе очень плохой.

Первое - их можно обойти. Второе - никто и никогда не проверяет EndScene на "целостность", потому что любая записывающая видеоролики программа способна поставить хук на эту функцию.

Показать  

Я имею ввиду, что "психануть и побайтово записывать функцию" - лишнее.

Четвёртое, я об этом и говорю, что если изменить вызов игры на EndScene - проверка кода сработает, а если заменить сам EndScene (как я описал) то проверка не сработает

 

P.S. в смысле хук в виртуальной таблице? Она хранит только адреса

Изменено пользователем Blackdots
Ссылка на комментарий
Поделиться на другие сайты

  В 17.05.2017 в 15:15, Blackdots сказал:

Я имею ввиду, что "психануть и побайтово записывать функцию" - лишнее

Показать  

Так хуки обычно и делаются, если что.

Я уже кидал скриншоты где-то какой хук ставит стимовский оверлей - там то же самое. Он эти байты переносит в отдельное место и дополняет их прыжком на hooked_func+5. С таким хуком не надо делать ничего.

Изменено пользователем uhx
Ссылка на комментарий
Поделиться на другие сайты

  В 17.05.2017 в 15:19, uhx сказал:

Так хуки обычно и делаются, если что.

Я уже кидал скриншоты где-то какой хук ставит стимовский оверлей - там то же самое. Он эти байты переносит в отдельное место и дополняет их прыжком на hooked_func+5. С таким хуком не надо делать ничего.

Показать  

Смысл переносить все байты, если можно просто записать прыжок\вызов на свою функцию?

Ссылка на комментарий
Поделиться на другие сайты

  В 16.05.2017 в 00:41, Blackdots сказал:

Зачем? Это тоже самое, что скачать библиотеку которая умеет выводить MessageBox, изихук - лишнее

Показать  

Да, он умеет выводит MessageBox но, он в целом внедряет .NET в программу а эта не только MessageBox.

Больше дело меньше разговора как говорится, кто та хукнул уже DX9, DX10, DX11 или DX12?

Ссылка на комментарий
Поделиться на другие сайты

  В 17.05.2017 в 14:19, uhx сказал:

И это можно реализовать на любом языке, который может хоть как-то работать с памятью напрямую.

Показать  

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

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.