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

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

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

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

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

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

1 минуту назад, keng сказал:

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

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

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

1 minute ago, roma91212 said:

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

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

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

Только что, keng сказал:

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

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

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

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

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

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

20 минуты назад, keng сказал:

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

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

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

  • 2 недели спустя...
В 23.04.2017 в 12: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 в 08:39, roma91212 сказал:

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

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

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

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

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

16 минут назад, roma91212 сказал:

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

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

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

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

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

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

On 4/23/2017 at 11:14 AM, keng said:

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

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

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

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

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

On 5/9/2017 at 0:17 AM, Laziz said:

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

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

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

11 hours ago, Blackdots said:

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

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

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

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

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

22 hours ago, keng said:

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

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 в 03:40, Blackdots сказал:

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

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

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

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

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

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

33 minutes ago, uhx said:

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

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

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

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

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

9 минут назад, Blackdots сказал:

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

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

9 минут назад, Blackdots сказал:

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

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

9 минут назад, Blackdots сказал:

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

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

9 минут назад, Blackdots сказал:

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

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

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

7 minutes ago, uhx said:

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

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

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

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

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

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

 

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

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

4 минуты назад, Blackdots сказал:

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

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

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

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

22 hours ago, uhx said:

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

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

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

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

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

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

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

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

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

On 5/17/2017 at 5:19 PM, uhx said:

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

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

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

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

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

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