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

faik003

Стажёры
  • Публикаций

    16
  • Зарегистрирован

  • Посещение

Репутация

0 Навыки не прокачены

Информация о faik003

  • Звание
    Пользователь
  1. Да, ваш способ замены смещения более изящный, чем мой. Только вод одно не понимаю - зачем было вставлять 6 байтом в массиве опкод 0x90 (NOP)? Он же перезапишет следующую инструкцию, которая следует за инструкцией call.
  2. Вы про эти CodeCave'ы? Если да, то зачем все так усложнять? Мне нужно просто перебросить вызов оригинальной функции на мою функцию из dll. И даже если каким-то образом ваш метод является более эффективным, то как я буду создавать CodeCave в Visual Studio?
  3. Да, но я не понимаю как применить данный пример к моей ситуации. Или это из разряда: кидаем тебе пример без контекста, а там уже сам додумывай.
  4. Блин, у меня складывается впечатление, что либо не читают мои посты перед тем, как ответить, либо я чего-то не понимаю. Я уже сказал, что в моей ситуации нужен именно call, а не jump. И пример кода на asm мне не о чем не говорит, кроме как ещё больше запутывает. Возможно я прошу слишком много, но можно ли привести пример asm в согласии с моим постом, где я описывал свою ситуацию?
  5. Что ещё за точный адрес вызова? Пример можете показать, как должен выглядеть naked метод?
  6. Я уже выше писал, что это не совсем хук. Представим такую ситуацию: есть функция в игре, пусть будет называться tempFunc. Я провожу ее реверсинг на С++ и выношу код в функцию HookFunc, которая будет находиться в dll. Затем я нахожу место, где вызывается tempFunc и просто заменяю адрес (точнее смещение) так, чтобы произошел вызов HookFunc через dll, которую мы инжектим к игре. Мне не нужно, чтобы игра повторно вызывала оригинальную функцию, то есть tempFunc, поэтому в данной ситуации использование jump для меня избыточно. В каком-то смысле я заменяю ф-ции игры своими из dll и таким образом потихоньку "декомпилирую" игру.
  7. Может я чего-то не понимаю, но зачем это?
  8. Наверное стоило упомянуть, что мне не нужен был хук в привычном понимании этого слова. Я делаю реверсинг на С++ нужной мне функции, сравниваю его дизассемблерный листинг с листингом из дизассемблера, затем просто перенаправляю цикл игры на свою функцию. Либо лыжи не едут, либо на ночь глядя не понимаю, как использовать ваши примеры в моей ситуации
  9. У автора видео каким-то образом получилось нормально заменить команду или это просто единичный случай и надеяться не стоит на будущее? Ладно, допустим, что я в правду извращаюсь. Тогда можно хоть пример того, как должен выглядеть asm код? Нет, не крашит. А с чего бы ему это делать?
  10. Решил проблему. Дело вот в чем: в видео автор заменяет команды шаблона 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. Мы заменяем все байты в этом массиве, кроме первого. После этого весь массив копируем по адресу, где мы хотим вызвать нашу функцию из либы. Можно часть кода вынести в отдельную функцию для удобства замены нескольких адресов. Надеюсь доступно объяснил.
  11. Аналогичная проблема, только код немного другой (взял из этого видеурока https://youtu.be/RwH0ThOrodg). Вместо относительного адреса выдает абсолютный, который ведет совсем в другое место.
  12. Что самое забавное, функция вызывается только один раз. В функцию передаются значения через переменные, кроме последнего аргумента - там ноль. Перед этой функцией с матрицей больше ничего не происходит, она изначально инициализируется в моей функции. После инициализации матрицы она копируется в другую матрицу и затем идет просто перемножение матриц и куча других манипуляций, которые я не совсем понял, что делают. Не спорю, но до этого я находил функции, которые явно работают с матрицами и кватернионами, так там все практически также, как в типичных формулах. в этом плане мне помогли исходники Quake 3 Arena, движок которой использовался при создании Treyarch NGL и , собственно, самой игры (Ultimate Spider-Man). Поэтому я надеялся, что разработчики не будут замарачиваться с созданием "нестандартных" функций.
  13. Всем привет. Занимаясь реверсингом, набрёл случайно на функцию, которая больно похожа на создание перспективной матрицы. Я перевел функцию в С++ (дизассемблерный листинг в 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?
  14. У меня в голову начали закрадываться похожие подозрения после того, как я скачал IDA 7.0, которая распознала некоторые из функций, которым Ida 6.8 присвоила подпись unknown_libname_X, как обычные функции приложения, а не библиотечные. Спасибо за ответ)
×

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

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