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

faik003

Стажёры
  • Постов

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

  • Посещение

Сообщения, опубликованные faik003

  1. 8 часов назад, gmz сказал:

    ну Lol

    Да, ваш способ замены смещения более изящный, чем мой. Только вод одно не понимаю - зачем было вставлять 6 байтом в массиве опкод 0x90 (NOP)? Он же перезапишет следующую инструкцию, которая следует за инструкцией call.

  2. 7 часов назад, Xipho сказал:

    Тебе нужно сделать CodeCave, и на него прыгнуть из какого-то оригинального кода, так?

    Вы про эти CodeCave'ы? Если да, то зачем все так усложнять? Мне нужно просто перебросить вызов оригинальной функции на мою функцию из dll. И даже если каким-то образом ваш метод является более эффективным, то как я буду создавать CodeCave в Visual Studio?

  3. 1 минуту назад, Xipho сказал:

    Ты попросил пример naked кода. В ссылке на сообщение partoftheworlD есть как раз naked функция с asm кодом. Разве это не то, что ты просил?

    Да, но я не понимаю как применить данный пример к моей ситуации.

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

  4. Блин, у меня складывается впечатление, что либо не читают мои посты перед тем, как ответить, либо я чего-то не понимаю. Я уже сказал, что в моей ситуации нужен именно call, а не jump. И пример кода на asm мне не о чем не говорит, кроме как ещё больше запутывает. Возможно я прошу слишком много, но можно ли привести пример asm в согласии с моим постом, где я описывал свою ситуацию? 

  5. 11 часов назад, roma91212 сказал:

    Что тогда мешает использовать точный адрес вызова? 

    Путем подмены обычного call на свой? Из длл через naked метод который как было сказано не комеилирует доп код

    Что ещё за точный адрес вызова?

    Пример можете показать, как должен выглядеть naked метод? 

  6. 42 минуты назад, temtriss сказал:

    я впервые вижу что бы хукали функцию не джампом, а коллом

    Я уже выше писал, что это не совсем хук. Представим такую ситуацию: есть функция в игре, пусть будет называться tempFunc. Я провожу ее реверсинг на С++ и выношу код в функцию HookFunc, которая будет находиться в dll. Затем я нахожу место, где вызывается tempFunc и просто заменяю адрес (точнее смещение) так, чтобы произошел вызов HookFunc через dll, которую мы инжектим к игре. Мне не нужно, чтобы игра повторно вызывала оригинальную функцию, то есть tempFunc, поэтому в данной ситуации использование jump для меня избыточно. В каком-то смысле я заменяю ф-ции игры своими из dll и таким образом потихоньку "декомпилирую" игру.

  7. 34 минуты назад, temtriss сказал:

    А в чем собственно разница?) Вы можете сохранить перезаписаные 5 байт(если 32х) перед выходом из Вашей функции просто востановить их и вызвать оригинал

    Может я чего-то не понимаю, но зачем это?

  8. 30 минут назад, partoftheworlD сказал:

    Ну хук вешают обычно опкодом E9(jmp), ведь E8 это call, который сохраняет в стек позицию для возврата

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

    38 минут назад, partoftheworlD сказал:

     

    
    __declspec(naked) void Ammo()
    {
    	__asm 
    	{
    
    	mov AmmoBase , esi
    	MOV [ESI + 0x1414], 0x63
    	jmp [OrigAmmo]
    
    	}
    
    }

    если единичная инструкция, то 

     

    
    __declspec(naked) void Ammo()
    {
    	_asm mov AmmoBase , esi
    }

    Либо лыжи не едут, либо на ночь глядя не понимаю, как использовать ваши примеры в моей ситуации

  9. 22 минуты назад, partoftheworlD сказал:

    Тут не правильно объявлена функция с асм вставкой, нужно использовать голую декларацию

    У автора видео каким-то образом получилось нормально заменить команду или это просто единичный случай и надеяться не стоит на будущее?

     

    22 минуты назад, partoftheworlD сказал:

    а использовать массив байт это изврат, когда есть асм вставки

    Ладно, допустим, что я в правду извращаюсь. Тогда можно хоть пример того, как должен выглядеть asm код?
     

    22 минуты назад, partoftheworlD сказал:

    И кстати, используя опкод E8 хук не крашит приложение?

    Нет, не крашит. А с чего бы ему это делать?

  10. Решил проблему. Дело вот в чем: в видео автор заменяет команды шаблона call dword ptr [указатель]. Эти команды составляют по размеру 6 байтов. А в моем случае нужно было заменить команды шаблона call offset, которые имеют размер 5 байт.

    Для примера я скопировал код из видео:
     

    Спойлер
    
    void CallHook()
    {
      _asm call dword ptr hooked_messagebox
    }
    
    DWORD WINAPI Hook_thread (LPVOID)
    {
      hooked_messagebox = (DWORD)HookedMessageBox;
      DWORD call_adress = 0x0120116A;
      DWORD old_prot = 0;
    
      VirtualProtect((void*)call_adress, 5, PAGE_EXECUTE_READWRITE, &old_prot);
      memcpy((void*)call_adress, (PBYTE)CallHook, 5);
      VirtualProtect((void*)call_adress, 5, old_prot, &old_prot);
      
      ::ExitThread(1337);
    }

     

    Теперь же он должен выглядеть вот так (часть кода взята с гитхаба https://github.com/khycan/API-Hooking/blob/master/API Hooking %2B DLL Injection/dll/DllMain.cpp):
     

    Спойлер
    
    DWORD WINAPI Hook_thread (LPVOID)
    {
      BYTE NewBytes[5]={0xE8,0,};
      DWORD call_adress = 0x0120116A;
      DWORD hooked_messagebox = ((DWORD)HookedMessageBox) - 0x0120116A - 5;
      memcpy(&NewBytes[1], &hooked_messagebox, 4);
      DWORD old_prot = 0;
    
      VirtualProtect((void*)call_adress, 5, PAGE_EXECUTE_READWRITE, &old_prot);
      memcpy((void*)call_adress, (PBYTE)NewBytes, 5);
      VirtualProtect((void*)call_adress, 5, old_prot, &old_prot);
      
      ::ExitThread(1337);
    }

     

    Как можно видеть, код с ассемблером я удалил за ненадобностью. Теперь же нам нужно найти смещение, которое находится по формуле:

    offset = HookFunc - DestFunc - 5, где HookFunc - это адрес нашей функции из dll, которую мы инжектим, DestFunc - адрес, по которому производится изменение кода (в случае с кодом из видео, 0x0120116A). Число 5 - это размер нашей команды, которую мы хотим заменить. Также создается массив байтов, в первый байт которого уже записан первый байт, кодирующий команду call. Мы заменяем все байты в этом массиве, кроме первого. После этого весь массив копируем по адресу, где мы хотим вызвать нашу функцию из либы. Можно часть кода вынести в отдельную функцию для удобства замены нескольких адресов.

    Надеюсь доступно объяснил.

  11. 2 часа назад, partoftheworlD сказал:

    Неизвестно, надо восстановить откуда инициализируется и где используется эта функция

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

     

    2 часа назад, partoftheworlD сказал:

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

    Не спорю, но до этого я находил функции, которые явно работают с матрицами и кватернионами, так там все практически также, как в типичных формулах. в этом плане мне помогли исходники Quake 3 Arena, движок которой использовался при создании Treyarch NGL и , собственно, самой игры (Ultimate Spider-Man). Поэтому я надеялся, что разработчики не будут замарачиваться с созданием "нестандартных" функций.

  12. Всем привет. Занимаясь реверсингом, набрёл случайно на функцию, которая больно похожа на создание перспективной матрицы. Я перевел функцию в С++ (дизассемблерный листинг в IDA Pro и листинг, который вывел Visual Studio, полностью соответствуют друг другу), переименовал для удобства переменные и собственно сама функция выглядит так:
     

    Спойлер
    
    void Matrix4::sub_587DA0(float fov, float aspectRatio, float nearPlane, float farPlane, float a7)
    {
        double v7;
    
        this->mat[1][3] = this->mat[2][0] = this->mat[2][1] = this->mat[3][0] = this->mat[3][1] = 0;
        this->mat[0][1] = this->mat[0][2] = this->mat[0][3] = this->mat[1][0] = this->mat[1][2] = 0;
        this->mat[2][3] = 1.0f;
        this->mat[3][3] = 0;
        this->mat[0][0] = 1.0f / tan(0.5f * fov);
        this->mat[1][1] = this->mat[0][0] / aspectRatio;
        v7 = farPlane / (farPlane - nearPlane);
        this->mat[2][2] = v7;
        this->mat[3][2] = (a7 - nearPlane) * v7;
    }

     

    Matrix4 - класс, описывающий матрицу 4x4.

    Сразу скажу, что в линейной алгебре я не силен, но прошерстив интернет, вывел:

    fov - предположительно вертикальный угол обзора.

    aspectRatio - соотношение сторон.

    farPlane - ближний план отсечения.

    nearPlane - дальний план отсечения.

    Собственно, сами вопросы:

    1) Действительно ли это матрица перспективной проекции? Если нет, то просьба обосновать свои мысли. Если да, то следующие вопросы являются дополнительными.

    2) Почему в разных формулах элементы матрицы по индексам [0][0] и [1][1], которые собственно отвечают за скалирование по оси X и Y соответственно, инициализируются по-разному? Чтобы вы поняли, посмотрите на картинку с матрицей и сравните ее с моей функцией
     

    Спойлер

    41e032082b374f319b00a880772a3395.PNG

    3) Почему элемент матрицы по индексу [2][3] иницализируются в одних формулах 1.0f, а в других -1.0f?

  13. У меня в голову начали закрадываться похожие подозрения после того, как я скачал IDA 7.0, которая распознала некоторые из функций, которым Ida 6.8 присвоила подпись unknown_libname_X, как обычные функции приложения, а не библиотечные. Спасибо за ответ)

  14. Всем привет. Кто-нибудь с подобным сталкивался? При дизассемблировании .exe файла IDA не может до конца распознать все функции и приписывает им название по такому шаблону unknown_libname_число. В интернете про это мало упоминаний, кроме как темы на stackoverflow.com, где указывают на якобы неправильную сигнатуру.

    P.S. Сильно не бить, я в этом еще новичок)

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

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

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