-
Постов
351 -
Зарегистрирован
-
Посещение
-
Победитель дней
39
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные A1t0r
-
-
push ecx
mov ecx, [ebx+C] - берём максимальное значение
mov [ebx+04], ecx - и пишем в текущее
pop ecx
jmp exit
можно уточнить что мне такой расклад не совсем нравится.
А вот так не круче?
push [ebx+C]
pop [ebx+04]
На здоровье Сколько людей, столько и способов (ну, может чуть поменьше))
-
А зачем указатели? Нельзя код на прямую анализировать? То есть что обращается, что пишет? Много лишнего вы не считаете? Push и pop и все
то есть по смещению находим макс значиние жизней. Пушим макс значение и попим на инструкцию техущих хп. Вся работа...
Дело в том, что память под структуру выделяется игрой динамически. В структуре я привел только младший байт смещения и отбросил 3 старших, потому что они всегда будут разные.
Теперь про анализ кода. Найденная инструкция 6FDA8384 - 89 78 04 - mov [eax+04],edi отвечает не за 1 какой-то параметр. Попробовав занопить её игра не вылетает, но: опыт игроку не добавляется, скорость всех персонажей падает, зато здоровье и мана не тратятся, а враги дохнут. И при загрузке сохранённой игры у игрока остаётся 1 жизнь, 0 маны.
Попробовал найти место вызова нашей функции происходит это в 6FDA9962.
D2Common.Ordinal10815+332 - 55 - push ebp
D2Common.Ordinal10815+333 - 56 - push esi
D2Common.Ordinal10815+334 - 50 - push eax
D2Common.Ordinal10815+335 - 57 - push edi
D2Common.Ordinal10815+336 - E8 E5E9FFFF - call D2Common.Ordinal11140+100
В eax модификатор параметра. Заменил на push ecx(там был 0). Всё работает, но опять опыт не плюсуется и снаряжение сломалось сразу))) Всё равно надо фильтровать значения и где надо push'ить 0 на место eax.
И спасибо за идею перезаписи максимальным значением, я пошёл по длинному пути, а всё оказалось проще)
Вот как теперь выглядит скрипт. Кое-что убрал после тестов:
alloc(newmem,256)
label(returnhere)
label(originalcode)
label(changedcode)
label(notID4)
label(notID5)
label(exit)
newmem:
push ebx
mov ebx, [6FBCCA04]
mov ebx, [ebx+38]
mov ebx, [ebx+C8]
lea ebx, [ebx+20] - смещение на 8 байт здоровья
cmp [ebx], 00040000 - если есть очки параметров
jne notID4
lea ebx, [ebx+8] - добавляем смещение +8
notID4:
cmp [ebx], 00050000 - если есть очки навыков
jne notID5
lea ebx, [ebx+8] - добавляем смещение +8
notID5:
cmp eax, ebx - здоровье пишется
je changedcode
lea ebx, [ebx+10]
cmp eax, ebx - мана пишется
je changedcode
lea ebx, [ebx+10]
cmp eax, ebx - выносливость пишется
jne originalcode
changedcode:
push ecx
mov ecx, [ebx+C] - берём максимальное значение
mov [ebx+04], ecx - и пишем в текущее
pop ecx
jmp exit
originalcode:
mov [eax+04],edi
exit:
pop ebx
test edi,edi
jmp returnhere
6FDA8382:
jmp newmem
returnhere:
Отличия от предыдущих версий игры есть и значительные. Например, не нужны проверки на 0 в самом начале. Инструкция mov [eax+04],edi не пишет здоровье врагов, но пишет их скорость. В общем что ни версия, то сюрприз)
-
Прошло столько времени...... вобщем нужно попробовать найти идентификатор игрока ID. И написать скрипт по другому. Интересно чё там можно сравнивать, разве что исправление игры и новые добавки. Если чё та интересное найдёшь скажеш A1t0r.
Нашёл)
Найдём инструкцию, которая модифицирует значения параметров нашего персонажа(и не только)
6FDA837F - 8D 3C 29 - lea edi,[ecx+ebp]
6FDA8382 - 85 FF - test edi,edi
6FDA8384 - 89 78 04 - mov [eax+04],edi <<
6FDA8387 - 7E 12 - jle D2Common.Ordinal11140+14B
6FDA8389 - 8B 54 24 18 - mov edx,[esp+18]
EAX=06B54F20
EBX=05816300
ECX=00000100
EDX=00060000
ESI=05816348
EDI=00002500
ESP=0018F528
EBP=00002400
EIP=6FDA8387
Пройдя всю цепочку указателей получаем такую формулу
[6FBCCA04] => ... + 38
=> ... + C8
=> ...
+ 4 - сила
+ C - энергия
+ 14 - ловкость
+ 1C - живучесть
+ 24 - здоровье +2C - макс. здоровье
+ 34 - мана +3C - макс. мана
+ 44 - выносливость +4C - макс. выносливость
+ 5C - опыт +7С - опыт для след. уровня
Фактически текущие и максимальные значения здоровья, маны и выносливости смещены на +1 байт, т. е.
+ 25 - здоровье 2D - макс. здоровье
+ 35 - мана 3D - макс. мана
+ 45 - выносливость 4D - макс. выносливость
,а в 4 и C байтах текущих значений находятся счётчики, которые при переносе увеличивают текущее значение, если не достигнут максимум - это регенерация. Поэтому НЕ НАДО модифицировать эти значения самим. Либо морозим полное значение 4 байта при записи по этому адресу, либо извращаемся дальше)
Структура персонажа без наличия очков параметров(да, это Варвар))
=========================================================
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------------------------------------------------------
0000|00 00 00 00 1E 00 00 00 00 00 01 00 0A 00 00 00
0010|00 00 02 00 14 00 00 00 00 00 03 00 19 00 00 00
0020|00 00 06 00 00 37 00 00 00 00 07 00 00 37 00 00
0030|00 00 08 00 00 0A 00 00 00 00 09 00 00 0A 00 00
0040|00 00 0A 00 98 50 00 00 00 00 0B 00 00 5C 00 00
0050|00 00 0C 00 01 00 00 00 00 00 0D 00 78 00 00 00
0060|00 00 15 00 03 00 00 00 00 00 16 00 06 00 00 00
0070|00 00 1D 00 FF FF FF FF 00 00 1E 00 F4 01 00 00
0080|00 00 1F 00 05 00 00 00 00 00 43 00 96 00 00 00
0090|00 00 44 00 64 00 00 00 00 00 45 00 64 00 00 00
00A0|00 00 48 00 27 00 00 00 00 00 49 00 28 00 00 00
00B0|00 00 5F 00 0A 32 00 00 00 00 AC 00 02 00 00 00
00C0|00 00 48 01 09 00 00 00 00 00 00 00 00 00 00 00
00D0|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00E0|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00F0|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=========================================================
D2Common.Ordinal11140+103 (6FDA8353) - 8B 7C 24 10 - mov edi,[esp+10] - в [esp+10] ID параметра
например для модификации выносливости в edi будет 000A0000, ID размещены в первых 4 байтах каждых 8-ми байт. 40h - 43h для выносливости. 00070000 28h - 2Bh для макс. здоровья и т.д.
Всё бы хорошо, сравнивай адреса по которым пишутся значения и нужные нам, НО после повышения уровня, полученные 5 очков пишутся по адресам 20h - 27h с ID=4, таким образом все значения сдвигаются на 8 байт.
После распределения этих очков всё становится на место. В скрипте при каждой записи можно сравнивать значение по адресу +22h с 4, тогда делаем правку в +8.
Наброски скрипта: !!!пока есть небольшой глюк при получении очков параметров,
может кто исправит,буду рад!!!
alloc(newmem,256)
label(returnhere)
label(originalcode)
label(changedcode)
label(not8)
label(notMax)
label(exit)
newmem:
push ebx
mov ebx, [6FBCCA04]
cmp ebx, 0
je originalcode
mov ebx, [ebx+38]
mov ebx, [ebx+C8]
lea ebx, [ebx+22]
cmp [ebx], 4
jne not8
lea ebx, [ebx+8]
not8:
lea ebx, [ebx-2]
cmp eax, ebx
je changedcode
lea ebx, [ebx+10]
cmp eax, ebx
je changedcode
lea ebx, [ebx+10]
cmp eax, ebx
jne originalcode
changedcode:
push ecx
mov ecx, edi
and ecx, FFFFFF00
cmp ecx, [ebx+C]
jle notMax
pop ecx
jmp exit
notMax:
mov ebx, [ebx+4]
and ebx, FFFFFF00
cmp ecx, ebx
pop ecx
jle exit
originalcode:
mov [eax+04],edi
exit:
pop ebx
test edi,edi
jmp returnhere
6FDA8382:
jmp newmem
returnhere:
Структура персонажа при наличии очков параметров
=========================================================
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------------------------------------------------------
0000|00 00 00 00 1E 00 00 00 00 00 01 00 0A 00 00 00
0010|00 00 02 00 14 00 00 00 00 00 03 00 19 00 00 00
0020|00 00 04 00 05 00 00 00 00 00 06 00 00 39 00 00
0030|00 00 07 00 00 39 00 00 00 00 08 00 00 0B 00 00
0040|00 00 09 00 00 0B 00 00 00 00 0A 00 00 5D 00 00
0050|00 00 0B 00 00 5D 00 00 00 00 0C 00 02 00 00 00
0060|00 00 0D 00 F5 01 00 00 00 00 0E 00 09 00 00 00
0070|00 00 15 00 03 00 00 00 00 00 16 00 06 00 00 00
0080|00 00 1D 00 FF FF FF FF 00 00 1E 00 DC 05 00 00
0090|00 00 1F 00 05 00 00 00 00 00 43 00 64 00 00 00
00A0|00 00 44 00 64 00 00 00 00 00 45 00 64 00 00 00
00B0|00 00 48 00 25 00 00 00 00 00 49 00 28 00 00 00
00C0|00 00 5F 00 0A 32 00 00 00 00 AC 00 02 00 00 00
00D0|00 00 48 01 20 00 00 00 00 00 48 01 20 00 00 00
00E0|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00F0|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=========================================================
Пока всё. Дальше надо тестить на наличие других лазеек игры, чтобы навредить нам)
Всё оказалось немного сложнее, чем в версии 1.09
-
Народ, если тема ещё актуальна могу попробовать поломать. Мне интересно сравнить две версии 1.13 и 1.09. Для 1.09 я разбирал мод Zy-El, но и Гроздья гнева тоже нормально работали с теми же скриптами.
Не получается написать скрипт на добавление денег
in Вопросы по созданию читов в одиночных играх
Опубликовано
Если переменная _money выполняет роль переключателя(так оно по ходу и есть) нужно задать тип. Ты написал add 1, может всё же надо dd 1, а лучше db 1 - 1 байта достаточно) И кажется надо добавить строчку
label(_money)
registersymbol(_money)
newmem: