SergBrNord Опубликовано 12 марта, 2016 Поделиться Опубликовано 12 марта, 2016 Здравствуйте! Я обучаюсь по видеокурсу Xipho и малость застрял на фильтрах "свой/чужой". Делал всё по ГОСТу - нашёл инструкцию, покопался в структурах игрока и противника, написал скрипт, который не работает, как мне кажется, из-за неверного определения местонахожения структуры игрока Помогите разобраться, где я ошибся. Насколько я понял, идёт сравнение значений, в начале структуры(?), указатель на который находится в ECX, и значения в EAX; если не совпадает - идёт запись нового значения в начало структуры. Скрины с редактором памяти и окном прерывания на доступ. Скрытый текст Позже я при помощи врагов нашёл ещё парочку адресов, которые работали с этой инструкцией и посмотрел, что там находится. Окно разбора структур. Игрок; враг_1; враг_2; враг_3 соответственно. Скрытый текст По смещению А0 там находилось неизменяемое значение - у игрока оно всегда было равно 2. Соответственно, я написал следующий скрипт, который не работает: Скрытый текст newmem: cmp dword ptr [ecx+A0], 2 jne code mov dword ptr [ecx], #99 code: mov [ecx],eax mov edx,[edx] mov edx,[edx] jmp return SAM_HP: jmp newmem nop return: registersymbol(SAM_HP) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 13 марта, 2016 Поделиться Опубликовано 13 марта, 2016 (изменено) 15 час назад, SergBrNord сказал: Соответственно, я написал следующий скрипт, который не работает: Стандартная ошибка всех, кто начинает (не беспокойся все эту ошибку делают ). Посмотри участок твоего кода: mov dword ptr [ecx], #99 // записываем 99 НР code: mov [ecx],eax // и сразу же затираем их значением в eax/ Если твой фильтр верен. Исправить скрипт можно двумя вариантами: 1. Скрытый текст newmem: cmp dword ptr [ecx+A0], 2 jne code mov eax, #99 code: mov [ecx],eax mov edx,[edx] mov edx,[edx] jmp return SAM_HP: jmp newmem nop return: registersymbol(SAM_HP) 2. Скрытый текст newmem: mov [ecx],eax cmp dword ptr [ecx+A0], 2 jne code mov dword ptr [ecx], #99 code: mov edx,[edx] mov edx,[edx] jmp return SAM_HP: jmp newmem nop return: registersymbol(SAM_HP) Изменено 13 марта, 2016 пользователем Garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 13 марта, 2016 Поделиться Опубликовано 13 марта, 2016 (изменено) PS: 1. вариант выглядит более надёжно, потому что, обрати внимание на строчку у тебя по коду игры: xor eax,ecx // значение НР XORируется. и уже шифрованное значение загружается в по смещению +04: mov [ecx+04],eax // шифрованное значение загружается во второй элемент от начала структуры. Так что возможна далее по коду проверка, поэтому вариант 2. может не работать. Какая возможна проверка: Недавно LIRW ломал игру "unepic" и попросил помочь с шифрованными значениями (правда так и не воспользовался моим скриптом). Так вот, в этой игре код примерно такой же. Что сделали разработчики: Записывают XORированные значения (XORирование через две константы) в два соседних адреса, а потом дальше по коду сверяют их друг с другом и, если значения в этих адресах не совпадают, то Ваш ГГ лопается - смотрится очень прикольно кстати - мне понравилось . Изменено 13 марта, 2016 пользователем Garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 13 марта, 2016 Поделиться Опубликовано 13 марта, 2016 По нормальному на таких инструкциях, не кто не чего не делает. Вот тут тема есть как сделать на подобных инструкциях скрипт Чпок Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 13 марта, 2016 Поделиться Опубликовано 13 марта, 2016 SergBrNord, PS1: Да, и ещё заметил у тебя на скрине Анализа Структур, что есть предыдущее значение НР (где-то я уже использовал такое у себя в скрипте вместо максимального) , так что 1 вариант скрипта можно записать ещё и так, чтобы записывать не #99, а игровое значение. Скрытый текст newmem: cmp dword ptr [ecx+A0], 2 jne code push [ecx+10] // Если это наш ГГ, то выгружаем в стек предыдущее значение НР (стек сдвигается). pop eax // И загружаем его в eax (при этом стек восстанавливается). code: mov [ecx],eax mov edx,[edx] mov edx,[edx] jmp return SAM_HP: jmp newmem nop return: registersymbol(SAM_HP) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 13 марта, 2016 Поделиться Опубликовано 13 марта, 2016 (изменено) 54 минуты назад, LIRW сказал: По нормальному на таких инструкциях, не кто не чего не делает. Вот тут тема есть как сделать на подобных инструкциях скрипт Чпок Жень, а что за ссылку ты дал? (может ошибся и хотел дать другую ссылку?) Потому что по твоей ссылке Geri рассказывает про прохождение "Туториала СЕ". Изменено 13 марта, 2016 пользователем Garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 13 марта, 2016 Поделиться Опубликовано 13 марта, 2016 1 час назад, Garik66 сказал: Жень, а что за ссылку ты дал? Не то дал Щас найду по новой. Теперь найти не могу... Там Гери как раз о подобной игре пишет - как сделать бессмертие. Щас историю ещо гляну. Хотя Игорь всё вроде правильно. Вот перевел и вот перевод моненько чудной правда Как раз как искать в подобной игре. Думаю тут написано всё подробно даже с таким то кривым переводом. Инструкция в игре такая же какая и описывается в тотуреале. И как на правельное смещение выйти, а не на mov [eax],ecx с 55_тью фильтрами. Скрытый текст У него даже скрипт выложен на это бессмертие. Взято с СЕ форума... Хотя если поставить бряк на жизнь - выпадет там mov [eax],ecx - а не то что указано в Гери скрипте... Вот он как раз и советывает этот урок, тому же кто задал вопрос по этой же игре на СЕ форуме. Вот его скрипт даже - как и писал взят с СЕ форума... Автор Гери. Скрытый текст //Made by Geri with Cheat Engine 6.0 //15th January, 2011 //All rights reserved. You are not allowed to use these scripts to create Your own trainer without my permission. //Contact e-mail: trainers4free@gmail.com [ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat alloc(newmem,2048) //2kb should be enough label(returnhere) label(originalcode) label(exit) newmem: //this is allocated memory, you have read,write,execute access pushfd pushad mov ecx,[esi+58] //save pointer cmp [ecx],79616C50 //check of a string "Play" jne originalcode //jump if not equal mov [esi+00000488],270F //change health to 9999 originalcode: popad popfd cmp [esi+00000498],eax exit: jmp returnhere SamHD_TSE.exe+6BBA6: jmp newmem nop returnhere: [DISABLE] //code from here till the end of the code will be used to disable the cheat dealloc(newmem) SamHD_TSE.exe+6BBA6: cmp [esi+00000498],eax //Alt: db 39 86 98 04 00 00 И всё равно - что то я не то мне кажется дал... Там на СЕ форуме есть тема как раз про эту игру. И там всё описано понятно. Там просто слишком много переходов по ссылкам - по этому и запутался я. В общем что бы не путаться - вот она Тема Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 13 марта, 2016 Автор Поделиться Опубликовано 13 марта, 2016 (изменено) 4 часа назад, Garik66 сказал: Стандартная ошибка всех, кто начинает (не беспокойся все эту ошибку делают ). Посмотри участок твоего кода: mov dword ptr [ecx], #99 // записываем 99 НР code: mov [ecx],eax // и сразу же затираем их значением в eax/ Действительно, глупая ошибка; от постоянной возни с C# у меня как-то в голове перепуталось, что ассемблерный код не является функциями и выполняется последовательно (а возился я с asm года этак с 4 назад). 4 часа назад, Garik66 сказал: Записывают XORированные значения (XORирование через две константы) в два соседних адреса, а потом дальше по коду сверяют их друг с другом и, если значения в этих адресах не совпадают, то Ваш ГГ лопается - смотрится очень прикольно кстати - мне понравилось . Т.к. игра на SeriousEngine3, тут возможна следующая подлянка - за игроком по уровням будет быстро-быстро носится неубиваемая зверюшка и сильно мешаться (это происходило в пиратских SS3) 2 часа назад, LIRW сказал: И всё равно - что то я не то мне кажется дал... Там на СЕ форуме есть тема как раз про эту игру. И там всё описано понятно. Там просто слишком много переходов по ссылкам - по этому и запутался я. В общем что бы не путаться - вот она Тема Спасибо, почитаю. Собственно, мне интересно, как работают все вышеуказанные примеры, так что я их обязательно попробую! Кстати, те первые две инструкции (которые в окне прерывания на доступ) работают с количеством убитых монстров и набранных очков; чит-режимом. P.S. Собственно, как задумывался скрипт - в SS HD: TSE есть очки; очки даются как за убийство монстров, так и за сбор предметов на уровне (патронов, аптечек). Соответственно, необходимо установить параметр здоровья в такую максимальную величину, чтобы можно было всегда собирать предметы. Так что меня ещё ждёт броня и оружие. Заодно попробую сделать телепорт по мотивам уроков Xipho и неуязвимость от зон смерти (шипов & etc.) Изменено 13 марта, 2016 пользователем SergBrNord дополнено Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 14 марта, 2016 Автор Поделиться Опубликовано 14 марта, 2016 (изменено) По мотивам беседы с Гартком в ПМ, пытаюсь совладать с броней и получился такой казус - если пытаться писать скрипт под броню отдельно от здоровья, то получается, что он морозит и здоровье противников тоже... Как я понял, это связано с особенностью пересчёта здоровья и брони игрока. Собственно, у меня сейчас такой вариант скрипта: Скрытый текст newmem: mov [ecx],eax cmp dword ptr [ecx+A0], 2 jne code mov dword ptr [ecx], 63 mov dword ptr [ecx+14], 62 code: mov edx,[edx] mov edx,[edx] jmp return В данном случае запись идёт уже после получения урона, что отображается в игре другом значение нежели 98. А существует вообще в данном случае вариант записать значение брони так, чтобы получаемый урон на него не влиял? Изменено 14 марта, 2016 пользователем SergBrNord обновлено Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 14 марта, 2016 Поделиться Опубликовано 14 марта, 2016 (изменено) SergBrNord, Я же тебе писал в ЛС, возьми адрес броньке и поставь на неё отдельно бряк. найди инструкцию работающую с бронёй и из неё напиши скрипт. 1 час назад, SergBrNord сказал: если пытаться писать скрипт под броню отдельно от здоровья, то получается, что он морозит и здоровье противников тоже... Думаю не работает фильтр свой/чужой в скрипте, поэтому морозятся все брони, а так как урон НР в игре скорее всего проходит только когда бронь разрушена, то морозится и НР. 1 час назад, SergBrNord сказал: В данном случае запись идёт уже после получения урона, что отображается в игре другом значение нежели 98. Скорее всего расчёт урона брони по коду игры находится ниже чем расчёт урона НР и получается так, ты записал брони 98, а потом идёт игровая инструкция, которая перезаписывает 98 на новое значение. Поэтому ещё раз поставь бряк (на запись/на доступ) найди инструкцию, проверь фильтр свой/чужой уже для брони и напиши скрипт. ЗЫ: И ещё что мне кажется, в 4 байтах НР и бронь, это видимые значения, а не реальные, которые скорее всего во float. Сейчас качаю репак - антологию от Механиков, проверю. Изменено 14 марта, 2016 пользователем Garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 14 марта, 2016 Поделиться Опубликовано 14 марта, 2016 (изменено) У Механиков версия игры "Serious Sam Classic - The Second Encounter" - 1.07 Как и говорил - НР во float- реальное. НР в 4 байтах - видимое. Вот скрипт "InfiniteHP" = "GodMod" + "OneHitKill" с правильным фильтром: Скрытый текст { Game : SeriousSam.exe Version: Date : 2016-03-14 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(InfiniteHP,Engine.dll,D9 9E CC 00 00 00) // should be unique alloc(newmem,$1000) label(code) label(return) registersymbol(InfiniteHP) newmem: fstp dword ptr [esi+000000CC] push eax mov eax,[esi+5c] mov eax,[eax+0c] cmp dword ptr [eax+08],79616C50 // Play (Classes\Player.ecl у нашего, у врага Classes\Eyeman.ecl) pop eax jne code mov dword ptr [esi+000000CC],(float)200 // GodMod jmp return code: mov dword ptr [esi+000000CC],(float)0 // OHK jmp return InfiniteHP: jmp newmem nop return: [DISABLE] InfiniteHP: db D9 9E CC 00 00 00 unregistersymbol(InfiniteHP) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Engine.dll"+10278C "Engine.dll"+10276C: 8B F1 - mov esi,ecx "Engine.dll"+10276E: 85 F6 - test esi,esi "Engine.dll"+102770: 89 75 F0 - mov [ebp-10],esi "Engine.dll"+102773: 74 03 - je Engine.dll+102778 "Engine.dll"+102775: FF 46 18 - inc [esi+18] "Engine.dll"+102778: 57 - push edi "Engine.dll"+102779: D9 86 CC 00 00 00 - fld dword ptr [esi+000000CC] "Engine.dll"+10277F: D8 65 10 - fsub dword ptr [ebp+10] "Engine.dll"+102782: 8D 4D C4 - lea ecx,[ebp-3C] "Engine.dll"+102785: C7 45 FC 00 00 00 00 - mov [ebp-04],00000000 // ---------- INJECTING HERE ---------- "Engine.dll"+10278C: D9 9E CC 00 00 00 - fstp dword ptr [esi+000000CC] // ---------- DONE INJECTING ---------- "Engine.dll"+102792: E8 D9 33 05 00 - call Engine.dll+155B70 "Engine.dll"+102797: 8B 7D 08 - mov edi,[ebp+08] "Engine.dll"+10279A: C6 45 FC 01 - mov byte ptr [ebp-04],01 "Engine.dll"+10279E: 85 FF - test edi,edi "Engine.dll"+1027A0: 74 03 - je Engine.dll+1027A5 "Engine.dll"+1027A2: FF 47 18 - inc [edi+18] "Engine.dll"+1027A5: 8B 45 CC - mov eax,[ebp-34] "Engine.dll"+1027A8: 85 C0 - test eax,eax "Engine.dll"+1027AA: 8B C8 - mov ecx,eax "Engine.dll"+1027AC: 74 14 - je Engine.dll+1027C2 } Броньку искать не буду - ломает в такие играть, так что дальше сам. Изменено 14 марта, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 15 марта, 2016 Поделиться Опубликовано 15 марта, 2016 (изменено) От не чего делать добавил в "InfiniteHP" броньку и ещё пару скриптов написал: "InfiniteHP" = "GodMod" + "OneHitKill" + "InfiniteArmor" Скрытый текст { Game : SeriousSam.exe Version: Date : 2016-03-14 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(InfiniteHP,Engine.dll,D9 9E CC 00 00 00) // should be unique alloc(newmem,$1000) label(code) label(return) registersymbol(InfiniteHP) newmem: fstp dword ptr [esi+000000CC] push eax mov eax,[esi+5c] mov eax,[eax+0c] cmp dword ptr [eax+08],79616C50 // Play (Classes\Player.ecl у нашего, у врага Classes\Eyeman.ecl) pop eax jne code mov dword ptr [esi+000000CC],(float)200 // GodMod mov dword ptr [esi+00000370],(float)200 // InfiniteArmor jmp return code: mov dword ptr [esi+000000CC],(float)0 // OneHitKill jmp return InfiniteHP: jmp newmem nop return: [DISABLE] InfiniteHP: db D9 9E CC 00 00 00 unregistersymbol(InfiniteHP) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Engine.dll"+10278C "Engine.dll"+10276C: 8B F1 - mov esi,ecx "Engine.dll"+10276E: 85 F6 - test esi,esi "Engine.dll"+102770: 89 75 F0 - mov [ebp-10],esi "Engine.dll"+102773: 74 03 - je Engine.dll+102778 "Engine.dll"+102775: FF 46 18 - inc [esi+18] "Engine.dll"+102778: 57 - push edi "Engine.dll"+102779: D9 86 CC 00 00 00 - fld dword ptr [esi+000000CC] "Engine.dll"+10277F: D8 65 10 - fsub dword ptr [ebp+10] "Engine.dll"+102782: 8D 4D C4 - lea ecx,[ebp-3C] "Engine.dll"+102785: C7 45 FC 00 00 00 00 - mov [ebp-04],00000000 // ---------- INJECTING HERE ---------- "Engine.dll"+10278C: D9 9E CC 00 00 00 - fstp dword ptr [esi+000000CC] // ---------- DONE INJECTING ---------- "Engine.dll"+102792: E8 D9 33 05 00 - call Engine.dll+155B70 "Engine.dll"+102797: 8B 7D 08 - mov edi,[ebp+08] "Engine.dll"+10279A: C6 45 FC 01 - mov byte ptr [ebp-04],01 "Engine.dll"+10279E: 85 FF - test edi,edi "Engine.dll"+1027A0: 74 03 - je Engine.dll+1027A5 "Engine.dll"+1027A2: FF 47 18 - inc [edi+18] "Engine.dll"+1027A5: 8B 45 CC - mov eax,[ebp-34] "Engine.dll"+1027A8: 85 C0 - test eax,eax "Engine.dll"+1027AA: 8B C8 - mov ecx,eax "Engine.dll"+1027AC: 74 14 - je Engine.dll+1027C2 } "InfiniteAmmo": Скрытый текст { Game : SeriousSam.exe Version: Date : 2016-03-15 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(Ammo,EntitiesMP.dll,29 08 5D C3 90) // should be unique alloc(newmem,$1000) label(code) label(return) newmem: code: //sub [eax],ecx pop ebp ret nop jmp return Ammo: jmp code return: registersymbol(Ammo) [DISABLE] Ammo: db 29 08 5D C3 90 unregistersymbol(Ammo) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "EntitiesMP.dll"+104E1D "EntitiesMP.dll"+104E00: 55 - push ebp "EntitiesMP.dll"+104E01: 8B EC - mov ebp,esp "EntitiesMP.dll"+104E03: A1 FC B2 48 60 - mov eax,[EntitiesMP.dll+17B2FC] "EntitiesMP.dll"+104E08: 8B 08 - mov ecx,[eax] "EntitiesMP.dll"+104E0A: FF 15 F8 B2 48 60 - call dword ptr [EntitiesMP.dll+17B2F8] "EntitiesMP.dll"+104E10: 8B 48 54 - mov ecx,[eax+54] "EntitiesMP.dll"+104E13: 85 C9 - test ecx,ecx "EntitiesMP.dll"+104E15: 75 08 - jne EntitiesMP.dll+104E1F "EntitiesMP.dll"+104E17: 8B 45 08 - mov eax,[ebp+08] "EntitiesMP.dll"+104E1A: 8B 4D 0C - mov ecx,[ebp+0C] // ---------- INJECTING HERE ---------- "EntitiesMP.dll"+104E1D: 29 08 - sub [eax],ecx "EntitiesMP.dll"+104E1F: 5D - pop ebp "EntitiesMP.dll"+104E20: C3 - ret "EntitiesMP.dll"+104E21: 90 - nop // ---------- DONE INJECTING ---------- "EntitiesMP.dll"+104E22: 90 - nop "EntitiesMP.dll"+104E23: 90 - nop "EntitiesMP.dll"+104E24: 90 - nop "EntitiesMP.dll"+104E25: 90 - nop "EntitiesMP.dll"+104E26: 90 - nop "EntitiesMP.dll"+104E27: 90 - nop "EntitiesMP.dll"+104E28: 90 - nop "EntitiesMP.dll"+104E29: 90 - nop "EntitiesMP.dll"+104E2A: 90 - nop "EntitiesMP.dll"+104E2B: 90 - nop } "ExperiencePoints": Скрытый текст { Game : SeriousSam.exe (приостановлен) Version: Date : 2016-03-15 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(ExperiencePoints,EntitiesMP.dll,8B 81 AC 25 00 00 89) // should be unique alloc(newmem,$1000) label(code) label(return) label(flag) registersymbol(flag) registersymbol(ExperiencePoints) newmem: cmp [flag],1 jne code add [ecx+000025AC],#10000 mov [flag],0 code: mov eax,[ecx+000025AC] jmp return flag: dd 1 ExperiencePoints: jmp newmem nop return: [DISABLE] ExperiencePoints: db 8B 81 AC 25 00 00 unregistersymbol(flag) unregistersymbol(ExperiencePoints) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "EntitiesMP.dll"+17922 "EntitiesMP.dll"+178E8: 68 10 80 51 60 - push EntitiesMP.dll+208010 "EntitiesMP.dll"+178ED: 8B 00 - mov eax,[eax] "EntitiesMP.dll"+178EF: C7 40 24 00 00 00 00 - mov [eax+24],00000000 "EntitiesMP.dll"+178F6: 8B 0D 60 90 51 60 - mov ecx,[EntitiesMP.dll+209060] "EntitiesMP.dll"+178FC: FF 15 B8 B3 48 60 - call dword ptr [EntitiesMP.dll+17B3B8] "EntitiesMP.dll"+17902: 8B 0D 60 90 51 60 - mov ecx,[EntitiesMP.dll+209060] "EntitiesMP.dll"+17908: C7 45 08 00 00 00 41 - mov [ebp+08],41000000 "EntitiesMP.dll"+1790F: C7 41 38 01 00 00 00 - mov [ecx+38],00000001 "EntitiesMP.dll"+17916: 8B 0D 68 90 51 60 - mov ecx,[EntitiesMP.dll+209068] "EntitiesMP.dll"+1791C: 8B 91 E8 0B 00 00 - mov edx,[ecx+00000BE8] // ---------- INJECTING HERE ---------- "EntitiesMP.dll"+17922: 8B 81 AC 25 00 00 - mov eax,[ecx+000025AC] // ---------- DONE INJECTING ---------- "EntitiesMP.dll"+17928: 89 55 9C - mov [ebp-64],edx "EntitiesMP.dll"+1792B: 8B 55 F0 - mov edx,[ebp-10] "EntitiesMP.dll"+1792E: 85 D2 - test edx,edx "EntitiesMP.dll"+17930: 74 21 - je EntitiesMP.dll+17953 "EntitiesMP.dll"+17932: A1 3C 56 50 60 - mov eax,[EntitiesMP.dll+1F563C] "EntitiesMP.dll"+17937: 85 C0 - test eax,eax "EntitiesMP.dll"+17939: 75 07 - jne EntitiesMP.dll+17942 "EntitiesMP.dll"+1793B: C7 45 08 00 00 80 40 - mov [ebp+08],40800000 "EntitiesMP.dll"+17942: 8B 81 B0 25 00 00 - mov eax,[ecx+000025B0] "EntitiesMP.dll"+17948: 8B 89 B4 25 00 00 - mov ecx,[ecx+000025B4] } Табличка с уже назначенной горячей клавишей Numpad 1 +10000 ExperiencePoints. SeriousSam.CT Изменено 15 марта, 2016 пользователем Garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 15 марта, 2016 Автор Поделиться Опубликовано 15 марта, 2016 (изменено) Гарик, ты развил прям-таки бурную деятельность. Но есть один мааааа-хонький нюанс - ты сделал таблицу для "Классики", а движки SE1 и SE3 работают по-разному. Я проверил твою идею о том, что реальное значение хранится как вещественный тип. Действительно, при выборке в поиск всех типов значений находится и float, но на движке SE3 оно как раз-таки экранное. Скрытый текст 18 час назад, Garik66 сказал: Думаю не работает фильтр свой/чужой в скрипте, поэтому морозятся все брони, а так как урон НР в игре скорее всего проходит только когда бронь разрушена, то морозится и НР. Интересно. Я даже как-то не подумал о таком варианте, хоть он вроде бы даже и логичен. Поставлю остановов на запись - может чего и выловлю. Хотя в последнем варианте я всё-же записывал после того, как урон наносился. Странно. Изменено 15 марта, 2016 пользователем SergBrNord дополнено Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 15 марта, 2016 Поделиться Опубликовано 15 марта, 2016 (изменено) 51 минуту назад, SergBrNord сказал: SE3 У Механиков есть в антологии игра Serious Sam 3 - BFE - это она? Просто у тебя в заголовке игра называется Serious Sam HD: TSE, вот я и подобрал наиболее подходящую из антологии. Изменено 15 марта, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 15 марта, 2016 Автор Поделиться Опубликовано 15 марта, 2016 16 минуту назад, Garik66 сказал: У Механиков есть в антологии игра Serious Sam 3 - BFE - это она? Просто у тебя в заголовке игра называется Serious Sam HD: TSE, вот я и подобрал наиболее подходящую из антологии. Нет, это не оно. Объяснил в ПС. Покопался и нашел смещения, хранящие значения патронов для оружия: Скрытый текст [ECX] + ... 588 - дробовик/двустволка 798 - миниган/автомат 5А8 - ракеты 5B8 - гранатомёт 5C8 - огнемёт 5D8 - лазерное ружьё 5E8 - серьёзная пушка 5F8 - снайперская винтовка 608 - серьёзная бомба Попробую похимичить со значениями, но как показало себя вмешательство с бронёй - игра очень нервно реагирует на изменение содержимого ECX. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 15 марта, 2016 Поделиться Опубликовано 15 марта, 2016 1 минуту назад, SergBrNord сказал: Объяснил в ПС. У меня ничего нет в ЛС. Из старой переписки я вышел уже давно, может ты в неё написал? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 15 марта, 2016 Поделиться Опубликовано 15 марта, 2016 (изменено) Как я и говорил не работал фильтр для брони. Вот попробуй скрипт (долго не тестил) "GodMod + InfiniteArmor" : Скрытый текст { Game : SamHD_TSE.exe Version: Date : 2016-03-15 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(INJECT,SamHD_TSE.exe,8B 55 08 89 01 8B) // should be unique alloc(newmem,$1000) label(code) label(return) registersymbol(INJECT) newmem: mov edx,[ebp+08] cmp [ecx+a0],2 jne @f cmp esi,eax jne @f mov eax,#500 // GodMod jmp code @@: cmp [ecx+2c],1 jne code cmp esi,1 jne code mov eax,#500 // InfiniteArmor code: mov [ecx],eax jmp return INJECT: jmp newmem return: [DISABLE] INJECT: db 8B 55 08 89 01 unregistersymbol(INJECT) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "SamHD_TSE.exe"+4EC6DA "SamHD_TSE.exe"+4EC6C9: 5D - pop ebp "SamHD_TSE.exe"+4EC6CA: C2 04 00 - ret 0004 "SamHD_TSE.exe"+4EC6CD: CC - int 3 "SamHD_TSE.exe"+4EC6CE: CC - int 3 "SamHD_TSE.exe"+4EC6CF: CC - int 3 "SamHD_TSE.exe"+4EC6D0: 55 - push ebp "SamHD_TSE.exe"+4EC6D1: 8B EC - mov ebp,esp "SamHD_TSE.exe"+4EC6D3: 8B 45 0C - mov eax,[ebp+0C] "SamHD_TSE.exe"+4EC6D6: 39 01 - cmp [ecx],eax "SamHD_TSE.exe"+4EC6D8: 74 11 - je SamHD_TSE.exe+4EC6EB // ---------- INJECTING HERE ---------- "SamHD_TSE.exe"+4EC6DA: 8B 55 08 - mov edx,[ebp+08] "SamHD_TSE.exe"+4EC6DD: 89 01 - mov [ecx],eax // ---------- DONE INJECTING ---------- "SamHD_TSE.exe"+4EC6DF: 8B 12 - mov edx,[edx] "SamHD_TSE.exe"+4EC6E1: 8B 12 - mov edx,[edx] "SamHD_TSE.exe"+4EC6E3: 33 C1 - xor eax,ecx "SamHD_TSE.exe"+4EC6E5: 89 51 08 - mov [ecx+08],edx "SamHD_TSE.exe"+4EC6E8: 89 41 04 - mov [ecx+04],eax "SamHD_TSE.exe"+4EC6EB: 5D - pop ebp "SamHD_TSE.exe"+4EC6EC: C2 08 00 - ret 0008 "SamHD_TSE.exe"+4EC6EF: CC - int 3 "SamHD_TSE.exe"+4EC6F0: 8B 01 - mov eax,[ecx] "SamHD_TSE.exe"+4EC6F2: 33 C1 - xor eax,ecx } ЗЫ: Нужно добавить для броньки ещё фильтр, идут зависоны игры иногда, видимо какие-то адреса проскакивают. В сумме через этот фильтр cmp [ecx+a0],2 проскакивает ещё один адрес кроме НР, а через этот cmp [ecx+2c],1 ещё два адреса, кроме броньки. Сейчас подберу. Просто опять вылетела. Скорее всего уже не от скрипта, а из-за самой игры. А почему не сохраняются настройки оконного режима - нужно постоянно по новой настраивать? Переделал скрипт в этом же сообщении. Проверь у себя. При вылетах в игре вот такая ошибка у меня выскакивает: Изменено 15 марта, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 15 марта, 2016 Поделиться Опубликовано 15 марта, 2016 1 час назад, Garik66 сказал: А почему не сохраняются настройки оконного режима - нужно постоянно по новой настраивать? Потому что игра вылетает и не сохраняет их. Вот если поставить оконный режим и выйти из игры по нормальному, тогда всё сохранится. Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 16 марта, 2016 Автор Поделиться Опубликовано 16 марта, 2016 (изменено) 23 часа назад, Garik66 сказал: Как я и говорил не работал фильтр для брони. Вот попробуй скрипт (долго не тестил) "GodMod + InfiniteArmor" : Ух ты! Я и подумать не мог, что можно использовать регистры в качестве фильтров ) Собственно, твой скрипт работал на всё, кроме брони, поэтому я немного его модифицировал: Скрытый текст { Game : SamHD_TSE.exe Version: Date : 2016-03-16 Author : Garik & SergBrNord This script does 99 HP & 98 ARM } [ENABLE] aobscanmodule(SAM_HP_ARM,SamHD_TSE.exe,8B 55 08 89 01 8B) // should be unique alloc(newmem,$1000) label(code) label(return) newmem: mov edx, [ebp+08] cmp [ecx+A0], 2 jne @f cmp esi, eax jne @f mov eax, #99 jmp code @@: cmp [ecx+40], #16 jne code cmp [ecx+2C], 1 //В регистре esi у меня всё, что угодно, но не единица jne code mov eax, #98 code: mov [ecx],eax jmp return SAM_HP_ARM: jmp newmem return: registersymbol(SAM_HP_ARM) [DISABLE] SAM_HP_ARM: db 8B 55 08 89 01 unregistersymbol(SAM_HP_ARM) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "SamHD_TSE.exe"+4F483A "SamHD_TSE.exe"+4F4829: 5D - pop ebp "SamHD_TSE.exe"+4F482A: C2 04 00 - ret 0004 "SamHD_TSE.exe"+4F482D: CC - int 3 "SamHD_TSE.exe"+4F482E: CC - int 3 "SamHD_TSE.exe"+4F482F: CC - int 3 "SamHD_TSE.exe"+4F4830: 55 - push ebp "SamHD_TSE.exe"+4F4831: 8B EC - mov ebp,esp "SamHD_TSE.exe"+4F4833: 8B 45 0C - mov eax,[ebp+0C] "SamHD_TSE.exe"+4F4836: 39 01 - cmp [ecx],eax "SamHD_TSE.exe"+4F4838: 74 11 - je SamHD_TSE.exe+4F484B // ---------- INJECTING HERE ---------- "SamHD_TSE.exe"+4F483A: 8B 55 08 - mov edx,[ebp+08] "SamHD_TSE.exe"+4F483D: 89 01 - mov [ecx],eax // ---------- DONE INJECTING ---------- "SamHD_TSE.exe"+4F483F: 8B 12 - mov edx,[edx] "SamHD_TSE.exe"+4F4841: 8B 12 - mov edx,[edx] "SamHD_TSE.exe"+4F4843: 33 C1 - xor eax,ecx "SamHD_TSE.exe"+4F4845: 89 51 08 - mov [ecx+08],edx "SamHD_TSE.exe"+4F4848: 89 41 04 - mov [ecx+04],eax "SamHD_TSE.exe"+4F484B: 5D - pop ebp "SamHD_TSE.exe"+4F484C: C2 08 00 - ret 0008 "SamHD_TSE.exe"+4F484F: CC - int 3 "SamHD_TSE.exe"+4F4850: 8B 01 - mov eax,[ecx] "SamHD_TSE.exe"+4F4852: 33 C1 - xor eax,ecx } И такой вопрос - данные скрипты, не пишут броню, если её 0. А вот как так сделать, чтобы при получении урона, если брони 0 писалось значение в 98? Вот такой вариант у меня не работает: Скрытый текст @@: //Запись брони cmp [ecx], 0 je @f cmp [ecx+40], #16 jne code cmp [ecx+2C], 1 jne code mov eax, #98 @@: //Запись брони, если 0 cmp [ecx], 0 jne code mov [ecx+14], #98 P.S. До внедрения кода на команду выше, чтобы заменяло только "mov edx, [ebp+08"] и "mov [ecx],eax", я тоже вряд ли бы додумался) Изменено 16 марта, 2016 пользователем SergBrNord Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 16 марта, 2016 Поделиться Опубликовано 16 марта, 2016 Ковырялся щас на СЕ форме и кое что мне попалось - и тут тебя вспомнил ... А то есть как делать по нормальному данные вещи на анреалоском движке, а не как Игорь делает с фильтрами вешая все на регистр. Вот всё подробно и понятно описано, от начала до конца. Тема Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 марта, 2016 Поделиться Опубликовано 16 марта, 2016 36 минуты назад, SergBrNord сказал: Собственно, твой скрипт работал на всё, кроме брони Я игру снёс сразу после написания скрипта. (она меня задолбала вылетами, видимо плохо сломана). Но у меня, в момент, когда инструкция работала с бронёй - esi всегда был равен 1, а когда с НР esi всегда был равен eax. Поэтому и использовал их в качестве фильтра. 39 минуты назад, SergBrNord сказал: И такой вопрос - данные скрипты, не пишут броню, если её 0. Потому что, пока мы не подберём броню, данная инструкция не работает с бронёй. Поэтому совет зайди во всю туже структуру, до подбора брони и смотри, что поменяется в структуре при подборе брони (в +14 - появиться количество брони - это мы знаем), скорее всего будет типа флага какого-нибудь на другом смещении, например 0 когда нет брони и 1 когда есть, или 0 когда нет брони и ID (адрес,- указатель, смещение) когда есть. Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 16 марта, 2016 Поделиться Опубликовано 16 марта, 2016 12 минуты назад, Garik66 сказал: Я игру снёс сразу после написания скрипта. (она меня задолбала вылетами, видимо плохо сломана). Мы её по моему с Krocki тоже смотрели(если не ошибаюсь) и вот эта ошибка тоже надоела я тоже не выдержал. Так и не доделал её и желания больше нет. То под пол провалишься не из за чего, то ещо чего то... Ну конечно не совсем не из за чего, а из за того, что я там что то делаю не так и что то конфликтует, но всё равно эта ошибка очень часто попадалась. Может и правду какая то защита там стоит. Кстати Игорь - я пробовал на лицензии делать и всё равно эта ошибка. Это не что краша игры. Тема должна была остаться тут , но в поиске она почему то не находится. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 марта, 2016 Поделиться Опубликовано 16 марта, 2016 PS: Ещё можно попробовать заставить игру дать нам броню (т.е. вписать сразу количество брони до её подбора), без поиска флага (ID). Не знаю к чему это приведёт, но попробуй скрипт: Скрытый текст { Game : SamHD_TSE.exe Version: Date : 2016-03-16 Author : Garik & SergBrNord This script does 99 HP & 98 ARM } [ENABLE] aobscanmodule(SAM_HP_ARM,SamHD_TSE.exe,8B 55 08 89 01 8B) // should be unique alloc(newmem,$1000) label(code) label(return) newmem: mov edx, [ebp+08] cmp [ecx+A0], 2 jne @f cmp esi, eax jne @f mov eax, #99 mov [ecx+14],#98 // Попробуем вписать броньку при срабатывании инструкции на НР ГГ. jmp code @@: cmp [ecx+40], #16 jne code cmp [ecx+2C], 1 //В регистре esi у меня всё, что угодно, но не единица jne code mov eax, #98 code: mov [ecx],eax jmp return SAM_HP_ARM: jmp newmem return: registersymbol(SAM_HP_ARM) [DISABLE] SAM_HP_ARM: db 8B 55 08 89 01 unregistersymbol(SAM_HP_ARM) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "SamHD_TSE.exe"+4F483A "SamHD_TSE.exe"+4F4829: 5D - pop ebp "SamHD_TSE.exe"+4F482A: C2 04 00 - ret 0004 "SamHD_TSE.exe"+4F482D: CC - int 3 "SamHD_TSE.exe"+4F482E: CC - int 3 "SamHD_TSE.exe"+4F482F: CC - int 3 "SamHD_TSE.exe"+4F4830: 55 - push ebp "SamHD_TSE.exe"+4F4831: 8B EC - mov ebp,esp "SamHD_TSE.exe"+4F4833: 8B 45 0C - mov eax,[ebp+0C] "SamHD_TSE.exe"+4F4836: 39 01 - cmp [ecx],eax "SamHD_TSE.exe"+4F4838: 74 11 - je SamHD_TSE.exe+4F484B // ---------- INJECTING HERE ---------- "SamHD_TSE.exe"+4F483A: 8B 55 08 - mov edx,[ebp+08] "SamHD_TSE.exe"+4F483D: 89 01 - mov [ecx],eax // ---------- DONE INJECTING ---------- "SamHD_TSE.exe"+4F483F: 8B 12 - mov edx,[edx] "SamHD_TSE.exe"+4F4841: 8B 12 - mov edx,[edx] "SamHD_TSE.exe"+4F4843: 33 C1 - xor eax,ecx "SamHD_TSE.exe"+4F4845: 89 51 08 - mov [ecx+08],edx "SamHD_TSE.exe"+4F4848: 89 41 04 - mov [ecx+04],eax "SamHD_TSE.exe"+4F484B: 5D - pop ebp "SamHD_TSE.exe"+4F484C: C2 08 00 - ret 0008 "SamHD_TSE.exe"+4F484F: CC - int 3 "SamHD_TSE.exe"+4F4850: 8B 01 - mov eax,[ecx] "SamHD_TSE.exe"+4F4852: 33 C1 - xor eax,ecx } Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 марта, 2016 Поделиться Опубликовано 16 марта, 2016 2 минуты назад, LIRW сказал: Кстати Игорь - я пробовал на лицензии делать и всё равно эта ошибка. Я почитал сообщения репака, ссылку на который мне дал SergBrNord. Там пишут, что разработчики специально поломали некоторые файлы игры (борьба против пиратов), и только после обновления со Стим эти файлы принимают нормальный вид. Так что, как делали репакеры я не знаю (по-видимому не очень справились), но ошибка явно специально деланная разработчиками. Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 16 марта, 2016 Автор Поделиться Опубликовано 16 марта, 2016 (изменено) 26 минуты назад, LIRW сказал: Может и правду какая то защита там стоит. Кстати Игорь - я пробовал на лицензии делать и всё равно эта ошибка. Это не что краша игры. Тема должна была остаться тут , но в поиске она почему то не находится. На лицензии, CE младше 6.4 крашил игру при присоединении отладчика. Собственно, хоть я давно уроки посмотрел, но только на CE 6.4 смог начать её ломать - других шутеров у меня просто нет, только куча квестов. Так что у игры явно есть какой-то антидебаг-механизм . 25 минуты назад, Garik66 сказал: PS: Ещё можно попробовать заставить игру дать нам броню (т.е. вписать сразу количество брони до её подбора), без поиска флага (ID). Не знаю к чему это приведёт, но попробуй скрипт: Протестировал этот вариант. Как я понял, у некоторых врагов тоже присутствует параметр брони и в этом варианте им тоже добавляется броня. Соответственно, из некоторого оружия их становится просто не убить - к примеру, у клиров из двустволки в упор снимается 50% здоровья, хотя должно ваншотить. Ну и, в конце-концов, игра минут через 8 подвисает. P.S. А есть ли в CE механизм, в который можно подгрузить старую и новую структуру и сравнить? Изменено 16 марта, 2016 пользователем SergBrNord Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения