Как заменить вызов call на nop, чтобы определенная функция не вызывалась?
Как правильно поменять передаваемое в push целочисленное значение аргумента?
Приведите конкретный пример, какую бы вы хотели функцию затереть.Например, в функции "Render" хочу попробовать затереть вызов функции "sub_5C1710".
Уроки были про DLL_PROCESS_ATTACHДа, с написанием asi-плагина я освоился, благодаря твоим статьям. Я просто переименовываю расширение релизной библиотеки с "dll" на "asi" и копирую этот asi-плагин в папку "mss".
Отлично, спасибо. Надо будет попробовать. А я задавал смещения *(patch+1), *(patch+2)...Можно и так. Так как значения одинаковые 0x90, то можно вообще распределить таким образом
Да, с написанием asi-плагина я освоился, благодаря твоим статьям. Я просто переименовываю расширение релизной библиотеки с "dll" на "asi" и копирую этот asi-плагин в папку "mss".
"mov eax, dword_xxx" на "mov eax, int"Типы на уровне ассемблерных команд, особой роли не играют , за исключением float. Если говорить о разных размерах, то обычными правками не обойтись. Для этого уже нужно переписывать саму функцию и затем заменять, путем как инжектом. Приводите конкретный пример, что и где именно вы хотите заменить с адресами. Мне так лучше будет видно.
Если говорить о разных размерах, то обычными правками не обойтись. Для этого уже нужно переписывать саму функцию и затем заменять, путем как инжектом.Я вот про инжект не понял, зачем записывается "function - (address + 5)", а не просто "function" и что означает "5"?
На данный момент я приболелВыздоравливай.
Я вот про инжект не понял, зачем записывается "function - (address + 5)", а не просто "function" и что означает "5"?Об, этом я расскажу как освобожусь, более в деталях и подробно.
Я вот про инжект не понял, зачем записывается "function - (address + 5)", а не просто "function" и что означает "5"?
Итак, теперь мы разобрались, как происходит вызов функции и готовы к ее перехвату. Осталась одна деталь – а как же собственно сделать перехват?
Для этого, все что нам нужно – это поставить в начало функции инструкцию jmp с адресом, который будет указывать на начало нашей функции. Однако, не все так просто. Дело в том, что инструкция jmp, которая бы принимала абсолютный адрес нашей функции, размером 5 байт просто не существует. Единственный jump, который работает с абсолютными адресами – это jump far, который занимает 6 байт.
Поэтому, мы будем использовать jump near, который принимает относительный адрес (то есть разность между адресом точки назначения и следующей за jump near инструкцией). По факту, для вычисления параметра операции jump near, надо из адреса точки назначения вычесть адрес исходной точки и прибавить 5 байт (именно столько эта инструкция занимает).
Такой вопрос. Правильно ли я начал менять код.
Можно ли на освободившиеся 5 байт прописать call для своей функции из dll?
Я это делаю для изучения переменных и не найденных еще функций. Не для мода. Та переменная засветилась во многих функциях рендера и связана с количеством каких-то вершин.
508 - это немного, походу общий буфер для каких-то мелких объектов. На выходных надо разобраться с "immediate mode" RW, чтобы лучше понять.Код: ASM
.text:005BD7AC 0E0 81 3D 74 5F 9B 00 FC 01 00 00 cmp ds:dword_9B5F74, 1FCh .text:005BD7B6 0E0 7C 57 jl short loc_5BD80F
Вот тут идет процесс сравнения этой переменной с не маленьким значением.
Не получилось, игра вылетает.С какой ошибкой вылетела? Там кажись адрес должен быть показан в MessageBox.
С какой ошибкой вылетела? Там кажись адрес должен быть показан в MessageBox.Я разные варианты пробовал, разные адреса были, в том числе и адреса возврата. Вообщем, я считаю этот метод слишком трудоемким. Проще всю функцию перенести в плагин, а в экзешнике поставить джамп на нее, а в коде плагина уже править ее как надо.
Вообщем, я считаю этот метод слишком трудоемким.Я ранее говорил, что этот метод не эффективный. Обычно этот метод используют, для не больших правок и то в нашем случае, оно не нужно. В дальнейшем к моддингу не подлежит, все это дело. Дело в том что когда есть переписанные функции, мы быстро можем в них что-то добавить свое, изменить да что угодно сделать на C++. При этом не упереться на ассемблерные инструкции, а разрабатывать плагины на языке высокого уровня. Кода естественно будет не мало, вот по этому все нужно переписывать так, что-бы оно было в соответствующих модулях. Это 10-тками статьями не рассказать, нужно гораздо больше написать и также я планировал сделать как практические статьи, где какой-то мод на плагине мы будем делать своими руками, пошагово.
Sector, не знаешь, как найти смещение метода класса в классе?
Начал разбирать эту функцию. Это
RwV3d field_8B8;
RwV3d field_8C4;
RwV3d field_8D0;
RwV3d field_8DC;
.text:00601A57 68 F8 3E 78 00 push userdir_path
это делается асм-вставкой.Ты имеешь введу ему, голый код юзать? Т.е __declspec(naked) ?
Пытался поменять инструкцию ассемблера и даже просто заменить функцию. Обычно был вылет...У меня пока все инструкции получилось поменять, но при условии, что длина байт в строке остается такой же (я этот вопрос так и не прояснил, иначе у меня вылет)
Стал проверять значения ячеек, которые заменяю. Обнаружил, что вместо тех значений, которые должны быть судя по базе Alien'а, там смещенные на 0x20
Инструкция call принимает разность между адресом функции, которая вызывается и адресом следующей за call инструкцией...Именно так, если функция впереди, но она может быть и до, тогда там обратное смещение.