

faik003
Стажёры-
Постов
16 -
Зарегистрирован
-
Посещение
Репутация
0 Навыки не прокачены-
хотя нет, глупость сказал.
-
Да, ваш способ замены смещения более изящный, чем мой. Только вод одно не понимаю - зачем было вставлять 6 байтом в массиве опкод 0x90 (NOP)? Он же перезапишет следующую инструкцию, которая следует за инструкцией call.
-
Вы про эти CodeCave'ы? Если да, то зачем все так усложнять? Мне нужно просто перебросить вызов оригинальной функции на мою функцию из dll. И даже если каким-то образом ваш метод является более эффективным, то как я буду создавать CodeCave в Visual Studio?
-
Да, но я не понимаю как применить данный пример к моей ситуации. Или это из разряда: кидаем тебе пример без контекста, а там уже сам додумывай.
-
Блин, у меня складывается впечатление, что либо не читают мои посты перед тем, как ответить, либо я чего-то не понимаю. Я уже сказал, что в моей ситуации нужен именно call, а не jump. И пример кода на asm мне не о чем не говорит, кроме как ещё больше запутывает. Возможно я прошу слишком много, но можно ли привести пример asm в согласии с моим постом, где я описывал свою ситуацию?
-
Что ещё за точный адрес вызова? Пример можете показать, как должен выглядеть naked метод?
-
Я уже выше писал, что это не совсем хук. Представим такую ситуацию: есть функция в игре, пусть будет называться tempFunc. Я провожу ее реверсинг на С++ и выношу код в функцию HookFunc, которая будет находиться в dll. Затем я нахожу место, где вызывается tempFunc и просто заменяю адрес (точнее смещение) так, чтобы произошел вызов HookFunc через dll, которую мы инжектим к игре. Мне не нужно, чтобы игра повторно вызывала оригинальную функцию, то есть tempFunc, поэтому в данной ситуации использование jump для меня избыточно. В каком-то смысле я заменяю ф-ции игры своими из dll и таким образом потихоньку "декомпилирую" игру.
-
Может я чего-то не понимаю, но зачем это?
-
Наверное стоило упомянуть, что мне не нужен был хук в привычном понимании этого слова. Я делаю реверсинг на С++ нужной мне функции, сравниваю его дизассемблерный листинг с листингом из дизассемблера, затем просто перенаправляю цикл игры на свою функцию. Либо лыжи не едут, либо на ночь глядя не понимаю, как использовать ваши примеры в моей ситуации
-
У автора видео каким-то образом получилось нормально заменить команду или это просто единичный случай и надеяться не стоит на будущее? Ладно, допустим, что я в правду извращаюсь. Тогда можно хоть пример того, как должен выглядеть asm код? Нет, не крашит. А с чего бы ему это делать?
-
Решил проблему. Дело вот в чем: в видео автор заменяет команды шаблона call dword ptr [указатель]. Эти команды составляют по размеру 6 байтов. А в моем случае нужно было заменить команды шаблона call offset, которые имеют размер 5 байт. Для примера я скопировал код из видео: Теперь же он должен выглядеть вот так (часть кода взята с гитхаба https://github.com/khycan/API-Hooking/blob/master/API Hooking %2B DLL Injection/dll/DllMain.cpp): Как можно видеть, код с ассемблером я удалил за ненадобностью. Теперь же нам нужно найти смещение, которое находится по формуле: offset = HookFunc - DestFunc - 5, где HookFunc - это адрес нашей функции из dll, которую мы инжектим, DestFunc - адрес, по которому производится изменение кода (в случае с кодом из видео, 0x0120116A). Число 5 - это размер нашей команды, которую мы хотим заменить. Также создается массив байтов, в первый байт которого уже записан первый байт, кодирующий команду call. Мы заменяем все байты в этом массиве, кроме первого. После этого весь массив копируем по адресу, где мы хотим вызвать нашу функцию из либы. Можно часть кода вынести в отдельную функцию для удобства замены нескольких адресов. Надеюсь доступно объяснил.
-
Аналогичная проблема, только код немного другой (взял из этого видеурока https://youtu.be/RwH0ThOrodg). Вместо относительного адреса выдает абсолютный, который ведет совсем в другое место.
-
Что самое забавное, функция вызывается только один раз. В функцию передаются значения через переменные, кроме последнего аргумента - там ноль. Перед этой функцией с матрицей больше ничего не происходит, она изначально инициализируется в моей функции. После инициализации матрицы она копируется в другую матрицу и затем идет просто перемножение матриц и куча других манипуляций, которые я не совсем понял, что делают. Не спорю, но до этого я находил функции, которые явно работают с матрицами и кватернионами, так там все практически также, как в типичных формулах. в этом плане мне помогли исходники Quake 3 Arena, движок которой использовался при создании Treyarch NGL и , собственно, самой игры (Ultimate Spider-Man). Поэтому я надеялся, что разработчики не будут замарачиваться с созданием "нестандартных" функций.
-
Всем привет. Занимаясь реверсингом, набрёл случайно на функцию, которая больно похожа на создание перспективной матрицы. Я перевел функцию в С++ (дизассемблерный листинг в IDA Pro и листинг, который вывел Visual Studio, полностью соответствуют друг другу), переименовал для удобства переменные и собственно сама функция выглядит так: Matrix4 - класс, описывающий матрицу 4x4. Сразу скажу, что в линейной алгебре я не силен, но прошерстив интернет, вывел: fov - предположительно вертикальный угол обзора. aspectRatio - соотношение сторон. farPlane - ближний план отсечения. nearPlane - дальний план отсечения. Собственно, сами вопросы: 1) Действительно ли это матрица перспективной проекции? Если нет, то просьба обосновать свои мысли. Если да, то следующие вопросы являются дополнительными. 2) Почему в разных формулах элементы матрицы по индексам [0][0] и [1][1], которые собственно отвечают за скалирование по оси X и Y соответственно, инициализируются по-разному? Чтобы вы поняли, посмотрите на картинку с матрицей и сравните ее с моей функцией 3) Почему элемент матрицы по индексу [2][3] иницализируются в одних формулах 1.0f, а в других -1.0f?