Пытался выводить в лог значения некоторых переменных через SetTimer(...Update) в теле Update(). Похоже, что идет вызов из определенного места кода, так как переменные должны быть явно больше нуля (при выводе большое отрицательное число), так как из использования их в качестве аргумента в функции RW ясно, что это счетчики вершин.
Вопрос - нельзя ли как-то применить gta_log или вызвать свой Log в теле экзешника?
Я пробовал обрывать цикл в одной из функций обнулением счетчика в for{} - в игре при этом становились полупрозрачными некоторые стены и детали автомобилей (лонжероны, капот).
Такой вопрос. Правильно ли я начал менять код. Есть проверка переменной на нуль через
cmp. Я смотрю там 7 байт. В то время как
test eax, eax занимает всего 2 байта. При том эта переменная потом все равно заносится в eax. Что если заменить cmp на засылку переменной в eax с последующим test eax, eax,
jz short loc_5C2935 переписать на адрес сразу за test eax, eax. Останется 5 свободных байт, достаточных для вызова call или jump near. Вообщем, картинка для пояснения:
Можно ли на освободившиеся 5 байт прописать call для своей функции из dll?
Короче дома попробую.
Sector, я кстати нашел ответ на вопрос:
Я вот про инжект не понял, зачем записывается "function - (address + 5)", а не просто "function" и что означает "5"?
Источник:
http://habrahabr.ru/post/90377/Цитата из него:
Итак, теперь мы разобрались, как происходит вызов функции и готовы к ее перехвату. Осталась одна деталь – а как же собственно сделать перехват?
Для этого, все что нам нужно – это поставить в начало функции инструкцию jmp с адресом, который будет указывать на начало нашей функции. Однако, не все так просто. Дело в том, что инструкция jmp, которая бы принимала абсолютный адрес нашей функции, размером 5 байт просто не существует. Единственный jump, который работает с абсолютными адресами – это jump far, который занимает 6 байт.
Поэтому, мы будем использовать jump near, который принимает относительный адрес (то есть разность между адресом точки назначения и следующей за jump near инструкцией). По факту, для вычисления параметра операции jump near, надо из адреса точки назначения вычесть адрес исходной точки и прибавить 5 байт (именно столько эта инструкция занимает).
PS:
можно статью по замене функций как бы дополнить этим.