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

A1t0r

Ветераны
  • Постов

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

  • Посещение

  • Победитель дней

    39

Весь контент A1t0r

  1. Когда победил первую инструкция по отниманию здоровья, то вылезла другая: 004C6B17 - D9 5C 24 1C - fstp dword ptr [esp+1C] 004C6B1B - D9 44 24 1C - fld dword ptr [esp+1C] 004C6B1F - D9 53 70 - fst dword ptr [ebx+70] <---
  2. Вот что нашлось: стоит обратить внимание на 002C А вот примерный скрипт: [ENABLE] alloc(newmem,2048) label(returnhere) label(originalcode) label(exit) newmem: cmp [ebp+2C],#15 jne exit originalcode: fstp dword ptr [ebp+70] exit: call 0040E350 jmp returnhere 004C53A9: jmp newmem nop nop nop returnhere: [DISABLE] dealloc(newmem) 004C53A9: fstp dword ptr [ebp+70] call 0040E350 Но не всё так радужно. После смерти, например от падения, эти цифры меняются, но для врагов равны между собой. Не вижу другого варианта кроме как проходить по цепочке указателей и сравнивать с ebp. С указателями ошибочка вышла. Хоть они и статичные, но после выхода в главное меню и продолжения игры, ни один не указывает туда куда надо. Выходит они одноразовые? Работают каждый новый запуск игры.
  3. Фу, блин нашёл! Вот: 0076584C=>[...+9A4]=>[...+64]=>начало_структуры_игрока+70=здоровье или 630B5023=>[...+9A4]=>[...+64]=>начало_структуры_игрока+70=здоровье Заморозил - бессмертен, враги дохнут) Скрипт, уж извините, писать лень)
  4. Если переменная _money выполняет роль переключателя(так оно по ходу и есть) нужно задать тип. Ты написал add 1, может всё же надо dd 1, а лучше db 1 - 1 байта достаточно) И кажется надо добавить строчку label(_money) registersymbol(_money) newmem:
  5. На здоровье Сколько людей, столько и способов (ну, может чуть поменьше))
  6. Дело в том, что память под структуру выделяется игрой динамически. В структуре я привел только младший байт смещения и отбросил 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 не пишет здоровье врагов, но пишет их скорость. В общем что ни версия, то сюрприз)
  7. Нашёл) Найдём инструкцию, которая модифицирует значения параметров нашего персонажа(и не только) 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
  8. Народ, если тема ещё актуальна могу попробовать поломать. Мне интересно сравнить две версии 1.13 и 1.09. Для 1.09 я разбирал мод Zy-El, но и Гроздья гнева тоже нормально работали с теми же скриптами.
×
×
  • Создать...

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

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