Автор: _призрак_
edited by: RayTwitty aka Shadows
Для редактирования нам понадобится программа
IDA Pro.
1. Запускаем
IDA Pro.
2. Загружаем бинарник рендера
xrRender_R1.dll или
xrRender_R2.dll.
3. Теперь необходимо найти, где регистрируется консольная команда. Жмем
Ctrl+T и вводим
r__detail_density.
4. Находим функцию и тщательно ее разбираем (я ее полностью разбирать не буду, только укажу, где задаются параметры:
Код регистрации консольной команды
Код
fld ds:flt_10064400 -- нижнее ограничение равное 0.6
or dword_1007CACC, 8
sub esp, 8
fstp [esp+30h+var_2C]
mov ecx, offset unk_1007CA9C
fld ds:flt_10064380 -- верхнее ограничение равное 0.2
fstp [esp+30h+var_30]
push offset aSs; "ЪЩЩ>"
push offset aR__detail_dens; "r__detail_density"
call ds:??0CCC_Float@@QAE@PBDPAMMM@Z; CCC_Float::CCC_Float(char const *,float *,float,float)
push offset sub_1005E080; void (__cdecl *)()
call _atexit
add esp, 4
Если вы заметили, чтобы трава стала плотней нужно уменьшить параметр, а чтобы травы стало меньше, нужно параметр увеличить
5. Нам нужно увеличить плотность травы: следовательно нужно изменить верхнее ограничение. Как это сделать? Есть три варианта:
Первый и самый логичный вариант: изменить переменную. Но тут есть небольшой подвох на котором я попался - этой переменной может пользоваться не одна функция, а несколько. И не ясно, что вы можете сломать, поменяв одну циферку на другую.
Второй: взять другую, уже существующую переменную с подходящим значением. Хороший вариант которым я и воспользовался. Но и тут есть недостаток - переменных в бинарнике не так уж и много и можно просто не найти нужную.
Третий: создать переменную. Отличный вариант. Единственный минус - я не знаю как это сделать
Я пошел по второму пути. Два раза щелкнув на
ds:flt_10064380, IDA отправила меня в дебри под названием
.rdata. Там я нашел переменную, которая называлась -
flt_1006452C и которая имела значение
0.0720999.
Насколько я понял,
flt_1006452C - не является названием переменной, это сборка из двух показателей -
(тип числа)_(смещение). В нашем случае это число типа
float, которое находится по адресу
1006452C. Ну что же, приступим к редактированию!
6. Отправляемся в самое начало файла. Как? Сверху есть что-то типа статус-бара - строка состоящая из синего, серого, черного цвета. Нажимаем там в любом месте мышкой и ведем влево до конца.
7. Опять ищем
r__detail_density. Находим в этой функции строку
fld ds:flt_10064338. Дальше самое интересное - жмем на вкладку
Hex View и там у нас выделяются какие-то цифры. Это наша переменная
10064338, только написано наоборот. Сравните:
Код
38 43 06 10
10 06 43 38
Похоже, не правда ли?
8. Начинаем редактировать. Нам нужно поменять
4338 на
452C (т.е. заменить ссылку с одной переменной на другую). Жмем правой кнопкой мыши на этих цифрах и выбираем пункт
Edit. Меняем
38 43 на
2С 45. Дальше жмем где-нибудь в коде (
это нужно сделать обязательно!).
9. После этого жмем правой кнопкой мыши и выбираем
commit changes. Таким образом, мы поменяли ссылку на переменную и теперь верхнее ограничение будет равно значению из другой переменной.
Но IDA не меняет исходный файл. В нашем случае мы можем только создать файл изменений. Делается это так:
File -> Produce file -> Create DIF file. Назовем его
test. Этот файл можно открыть при помощи блокнота и посмотреть, что получилось.
10. Теперь необходимо внести изменения из этого файла в движок. Это можно сделать при помощи патчера
bpatch. Качаем, смотрим и запускаем
bpatch.cmd. Я думаю, что батник вы сможете изменить самостоятельно (настроить пути файлов и т.п.) - там все элементарно.
11. Все! Изменения внесены в движок, можно тестировать
Огромное спасибо
Kolmogor'у и
malandrinus'у. Если бы не они, я бы ничего не сделал. Спасибо вам еще раз.
Спасибо и
Rolan'у, с которым я очень много беседовал и тоже узнал много чего