Garik66 Опубликовано 16 марта, 2016 Поделиться Опубликовано 16 марта, 2016 5 минут назад, SergBrNord сказал: Протестировал этот вариант. Как я понял, у некоторых врагов тоже присутствует параметр брони и в этом варианте им тоже добавляется броня. Тогда давай ещё сделаем вариант скрипта, раз игра добавила броню. Вариант скрипта - будем добавлять броню только один раз, а потом будет работать уже нормальное часть скрипта: Скрытый текст { 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(flag) // добавляем, чтобы добавление брони в части скрипта с НР происходило только один раз. label(code) label(return) newmem: mov edx, [ebp+08] cmp [ecx+A0], 2 jne @f cmp esi, eax jne @f mov eax, #99 cmp [flag],1 jne @f mov [ecx+14],#98 // Попробуем вписать броньку при срабатывании инструкции на НР ГГ, теперь только один раз. mov [flag],0 jmp code @@: cmp [ecx+40], #16 jne code cmp [ecx+2C], 1 //В регистре esi у меня всё, что угодно, но не единица jne code mov eax, #98 code: mov [ecx],eax jmp return flag: dd 1 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 30 минуты назад, SergBrNord сказал: P.S. А есть ли в CE механизм, в который можно подгрузить старую и новую структуру и сравнить? Посмотри у MasterGH. У него точно был плагин, который позволял сравнивать структуры, я эти плагины ещё не использовал. Один из них тебе должен подойти либо этот: Lua Plugin CE StackViewer Позволяет наблюдать стек в реальном времени в окне структур данных. Подробностей не помню. Смотрите файловый архив форума с подробными описаниями. Когда стек меняется на одном и том же участке, то в реальном времени мы будет наблюдать отличия стека. либо этот: Lua Plugin CE TinyDumper Позволяет сохранять небольшие дампы для сравнения их в окне структур данных. После перезагрузки игры в том числе. Смотрите файловый архив форума с подробными описаниями. Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 16 марта, 2016 Автор Поделиться Опубликовано 16 марта, 2016 (изменено) Скрытый текст Использовал для этого дела Notepad++ и плагин Compare. Меняются 3 значения - броня, указатель и флаг. И вот тут происходит любопытная вещь: Скрытый текст Тут структура игрока загоняется в стек или что? Если открыть указатель по смещению 4, то он будет ссылаться на адрес *BD0, там же опять присутствует указатель по смещению 4, который ссылает на адрес *DD4 и так далее... Вот новая версия скрипта: Скрытый текст { Game : SamHD_TSE.exe Version: Date : 2016-03-16 Author : Garik66 & SergBrNord This script does 99 HP & 98 ARM all time } [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 cmp [ecx+14], 0 jne @f cmp [flag], 1 jne @f mov [ecx+14], #98 mov [ecx+1C], 1 //Пишем тот флаг mov [flag], 0 jmp code @@: cmp [ecx+40], #16 jne code cmp [ecx+2C], 1 jne code mov eax, #98 code: mov [ecx],eax jmp return flag: dd 1 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 } { Game : SamHD_TSE.exe Version: Date : 2016-03-16 Author : Garik66 & SergBrNord This script does 99 HP & 98 ARM all time } [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 cmp [ecx+14], 0 //Проверяем на 0 брони jne @f cmp [flag], 1 jne @f mov [ecx+14], #98 mov [ecx+1C], 1 //Пишем тот флаг mov [flag], 0 jmp code @@: cmp [ecx+40], #16 jne code cmp [ecx+2C], 1 jne code mov eax, #98 code: mov [ecx],eax jmp return flag: dd 1 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 } P.S. Проверил твой и свой вариант скрипта - всё равно работает криво и с крашами. Как я и писал раньше - игра крайне нервно реагирует на прямое изменение содержимого. Изменено 16 марта, 2016 пользователем SergBrNord обновлено Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 марта, 2016 Поделиться Опубликовано 16 марта, 2016 12 минуты назад, SergBrNord сказал: Вот новая версия скрипта: Ты забыл строчку: label(flag) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 марта, 2016 Поделиться Опубликовано 16 марта, 2016 29 минуты назад, SergBrNord сказал: Проверил твой и свой вариант скрипта - всё равно работает криво и с крашами. Мой вариант пробовал, без твоих изменений? Отсюда: Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 16 марта, 2016 Автор Поделиться Опубликовано 16 марта, 2016 (изменено) 19 минуту назад, Garik66 сказал: Мой вариант пробовал, без твоих изменений? Отсюда: Этот тоже. Игра нервно реагирует как-то на прямое изменение брони. Скорее всего, при прямом подборе начинает работать что-то ещё и как это отлавливать - не знаю. И вот забавная деталь - при попытке пострелять из серьёзной пушки игра крашится =) Причём краш происходит при любом изменении функции "mov [ecx], eax". Какую-то непростую зверюшку я себе для опытов выбрал... Изменено 16 марта, 2016 пользователем SergBrNord Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 марта, 2016 Поделиться Опубликовано 16 марта, 2016 (изменено) Проблема с твоей игрой ещё и в том, что не поймёшь, когда она вылетает из-за скрипта, а когда из-за кривого репака. Поэтому советую скачать более раннюю версию этой же игры (да графика в разы хуже, но зато репак от Механиков работает стабильно) и экспериментировать и учиться на ней, А по текущему скрипту - Как видно из твоего скрина 1 час назад, SergBrNord сказал: И вот тут происходит любопытная вещь: при добавлении брони там добавляется целый блок адресов (мини-структурка), можно попробовать и здесь обмануть игру, но скорее всего из этой инструкции, просто так не получиться этого сделать, скорее всего нужно выходить на инструкцию появления брони. Но давай попробуем, как видишь из первого скрина меняется поинтер и он меняется ровно на ту величину, на которую добавляется блок во втором скрине. Так что можно попробовать модифицировать твой последний скрипт: Скрытый текст { Game : SamHD_TSE.exe Version: Date : 2016-03-16 Author : Garik66 & SergBrNord This script does 99 HP & 98 ARM all time } [ENABLE] aobscanmodule(SAM_HP_ARM,SamHD_TSE.exe,8B 55 08 89 01 8B) // should be unique alloc(newmem,$1000) label(flag) label(code) label(return) newmem: mov edx, [ebp+08] cmp [ecx+A0], 2 jne @f cmp esi, eax jne @f mov eax, #99 cmp [ecx+14], 0 jne @f cmp [flag], 1 jne @f mov [ecx+14], #98 sub [ecx+18],24 // Меняем поинтер на DD4-DB0 = 24 mov [ecx+1C], 1 //Пишем тот флаг mov [flag], 0 jmp code @@: cmp [ecx+40], #16 jne code cmp [ecx+2C], 1 jne code mov eax, #98 code: mov [ecx],eax jmp return flag: dd 1 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 } PS: Немного спутал не add, а sub нужно так как структура смещается вверх. Изменено 16 марта, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 марта, 2016 Поделиться Опубликовано 16 марта, 2016 PS1: И ещё забыл написать, я не уверен, что через твой фильтр cmp [ecx+40], #16 не проскакивают другие адреса, это тоже нужно проверять. Через мой двойной фильтр: cmp [ecx+2c],1 jne code cmp esi,1 jne code у меня в игре не проскакивали другие адреса, правда из СУПЕР-Пушек я не стрелял. Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 17 марта, 2016 Автор Поделиться Опубликовано 17 марта, 2016 (изменено) 19 час назад, Garik66 сказал: у меня в игре не проскакивали другие адреса, правда из СУПЕР-Пушек я не стрелял. Я тут кое-что прояснил по пушке...Игра крашится даже при попытке нахождения всех опкодов, имеющих доступ к адресу патронов пушки. Если учитывать, что до CE 6.4 игра тупо падала даже при подключении отладчика - то явно проблема в кривом коде игры. А если вспомнить, что это порт классики с SE1 на движок SE3 и то, что последний раз фиксы на игру (2010 года) выходили в апреле 2015, подозрения перерастают в уверенность. В прочем, по поводу пушки у меня есть одна идейка. Сейчас опробую. И заодно проверю фильтр брони и посмотрю, может третий прикручу. Обновлено. Не работает. Идея основывалась на том, что в EBX при стрельбе из пушки пишется 1, но при внедрении модернизированного скрипта при стрельбе из серьёзной пушки игра всё равно падает. И что ты будешь делать.... Изменено 17 марта, 2016 пользователем SergBrNord Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 17 марта, 2016 Поделиться Опубликовано 17 марта, 2016 SergBrNord, ты скрипт отсюда: опробовал? Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 17 марта, 2016 Автор Поделиться Опубликовано 17 марта, 2016 (изменено) 49 минуты назад, Garik66 сказал: опробовал? Да, опробовал. Заодно выполз пролёт с регистрами. При вычислении здоровья противников eax и esi также одинаковы. Теперь скрипт выглядит так и работает корректно (кроме пушки - так и не понял, как починить): Скрытый текст { Game : SamHD_TSE.exe Version: Date : 2016-03-16 Author : Garik66 & SergBrNord This script does 99 HP & 98 ARM all time } [ENABLE] aobscanmodule(SAM_HP_ARM,SamHD_TSE.exe,8B 55 08 89 01 8B) // should be unique alloc(newmem,$1000) label(code) label(return) label(flag) newmem: mov edx, [ebp+08] //Ставим инъекцию здесь, чтобы не захватывало иного кода cmp [ecx+A0], 2 //Фильтр №1 на игрока jne @f //Прыжок на безымяную метку (не совпадает) cmp [ecx+A4], #45 //Фильтр №2 на игрока jne @f //Прыжок на безымяную метку (не совпадает) mov eax, #99 cmp [flag], 1 jne @f mov [ecx+14], #98 sub [ecx+18], 24 // Меняем указатель на DD4-DB0 = 24 mov [ecx+1C], 1 //Пишем тот флаг mov [flag], 0 jmp code @@: cmp [ecx+2C], 1 jne code cmp [ecx+40], #16 jne code mov eax, #98 code: mov [ecx],eax jmp return flag: dd 1 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 } Изменено 17 марта, 2016 пользователем SergBrNord Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 17 марта, 2016 Поделиться Опубликовано 17 марта, 2016 (изменено) 8 минут назад, SergBrNord сказал: Заодно выполз пролёт с регистрами. Да нету там пролёта - через двойной фильтр проходит только НР нашего героя (и больше никакого адреса) . Ну поменял так поменял. И esi=1 при работе с бронькой тоже правильный фильтр, только что проверил (установил игру без патча). Для НР: cmp [ecx+A0], 2 jne @f cmp esi, eax jne @f Дл Armor: cmp [ecx+2C], 1 jne code cmp esi,1 jne code Да и бронь добавляется тоже корректно (в случае если мы её ещё не подобрали). Изменено 17 марта, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 17 марта, 2016 Автор Поделиться Опубликовано 17 марта, 2016 2 минуты назад, Garik66 сказал: Да нету там пролёта - через двойной фильтр проходит только НР нашего героя (и больше никакого адреса) . Ну поменял так поменял. И esi=1 при работе с бронькой тоже правильный фильтр, только что проверил (установил игру без патча). У меня пролетало. Я в конце-концов плюнул и начал поштучно отлавливать монстров, находить их ХП и смотреть в структуре - меняется ли значение от моего урона. Как я понял есть несколько классов монстров и класс игрока игра также считает за монстра, монстра с параметром брони. А вот как лучше заморозить значение патронов в оружии, если в структуре игрока хранятся сведения о количестве, но нет максимального (я пока не нашёл)? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 17 марта, 2016 Поделиться Опубликовано 17 марта, 2016 Только что, SergBrNord сказал: А вот как лучше заморозить значение патронов в оружии, если в структуре игрока хранятся сведения о количестве, но нет максимального (я пока не нашёл)? Если ты уже нашёл фильтр для патронов, то всё просто: cmp [ecx+...], ...// Здесь твой фильтр для срабатывания инструкции на патронах любого оружия - фильтр нужно подобрать один для всех видов. jne code mov eax,[ecx] // Здесь загружаем предыдущее значение, но в данной игре возможно патроны не будут меняться не только при выстреле, // но и при подборе, поэтому проще написать сразу нужное количество mov eax,#100. code: mov [ecx],eax jmp return Хотя для данной игры можно просто записывать при срабатывании инструкции на здоровье (так как фильтр для здоровья уже есть), просто обновляться значение патронов будут, только, когда по ГГ проходит урон. и проблема ещё в этом случае будет в том, что придётся записывать для каждого оружия своё смещение. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 17 марта, 2016 Поделиться Опубликовано 17 марта, 2016 (изменено) ЗЫ: Вот точно какая проблема есть в скрипте - это в сигнатуре, проверил её, а она не уникальна, т.е.: по сигнатуре 8B 55 08 89 01 8B находятся 4 адреса (это тоже может приводить к вылетам): sl = AOBScan("8B 55 08 89 01 8B"); Found: 4 008EC6DA 68849F9E 688C5353 693307A7 поэтому добавь ещё один байт в конце со значеннием 12, тогда будет только один адрес: по сигнатуре: sl = AOBScan("8B 55 08 89 01 8B 12"); Found: 1 008EC6DA Почему СЕ выбрала такую сигнатуру 8B 55 08 89 01 8B, когда я первый раз писал скрипт не знаю, видимо ошиблась . Изменено 17 марта, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 17 марта, 2016 Автор Поделиться Опубликовано 17 марта, 2016 (изменено) 33 минуты назад, Garik66 сказал: Если ты уже нашёл фильтр для патронов, то всё просто: cmp [ecx+...], ...// Здесь твой фильтр для срабатывания инструкции на патронах любого оружия - фильтр нужно подобрать один для всех видов. jne code mov eax,[ecx] // Здесь загружаем предыдущее значение, но в данной игре возможно патроны не будут меняться не только при выстреле, // но и при подборе, поэтому проще написать сразу нужное количество mov eax,#100. code: mov [ecx],eax jmp return Хотя для данной игры можно просто записывать при срабатывании инструкции на здоровье (так как фильтр для здоровья уже есть), просто обновляться значение патронов будут, только, когда по ГГ проходит урон. и проблема ещё в этом случае будет в том, что придётся записывать для каждого оружия своё смещение. Я, нашёл их чуть ранее. Начинаются с 588, чередуются через смещение в 6. В 15.03.2016в15:35, SergBrNord сказал: Покопался и нашел смещения, хранящие значения патронов для оружия: Скрыть содержимое [ECX] + ... 588 - дробовик/двустволка 798 - миниган/автомат 5А8 - ракеты 5B8 - гранатомёт 5C8 - огнемёт 5D8 - лазерное ружьё 5E8 - серьёзная пушка 5F8 - снайперская винтовка 608 - серьёзная бомба Скрытый текст Проблема в том, что у разного оружия - разные пределы патронов + идёт варьирование значения от сложности игры(!) : Скрытый текст дробовик/двустволка - 200; миниган/автомат - 999; ракеты - 100; гранаты - 100; огнемёт - 999; лазерное ружьё - 800; серьёзная пушка - 60; снайперская винтовка - 100; серьёзная бомба - 5. И вот тут возникает трудность - как сделать так, чтобы смотрелось нормально. Можно, конечно всему пихать по 5 патронов... 23 минуты назад, Garik66 сказал: Вот точно какая проблема есть в скрипте - это в сигнатуре, проверил её, а она не уникальна, т.е.: по сигнатуре 8B 55 08 89 01 8B находятся 4 адреса (это тоже может приводить к вылетам): sl = AOBScan("8B 55 08 89 01 8B"); Found: 4 008EC6DA 68849F9E 688C5353 693307A7 А каким образом это проверять? Изменено 17 марта, 2016 пользователем SergBrNord Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 17 марта, 2016 Поделиться Опубликовано 17 марта, 2016 2 минуты назад, SergBrNord сказал: А каким образом это проверять? Я проверяю с помощью этого - AOB Scan LUA 2 минуты назад, SergBrNord сказал: Я, нашёл их чуть ранее. Я писал про фильтр, а не про патроны. А что ты нашёл патроны я видел. В игре всё ищется легко. 3 минуты назад, SergBrNord сказал: И вот тут возникает трудность - как сделать так, чтобы смотрелось нормально. Если хочешь, чтобы было красиво, то приёдтся прописывать для каждого оружия, своё значение. и тогда можно использовать скрипт на НР, как я писал раньше. Но для этой игры я бы все скрипты переписал не на пишущую инструкцию, а на читающую, Тогда не нужно было бы ждать пока по ГГ или броне нанесётся урон. Читающие инструкцию выводят всё в туже структуру, только она взята ещё выше. И кстати нашёл по поводу сверки шиврованного значения в игре (о чём тоже писал ранее), вот это место в коде: SamHD_TSE.exe+4EC6F4 - 39 41 04 - cmp [ecx+04],eax SamHD_TSE.exe+4EC6F7 - 74 0A - je SamHD_TSE.exe+4EC703 SamHD_TSE.exe+4EC6F9 - C7 05 68A2F500 01000000 - mov [SamHD_TSE.exe+B5A268],00000001 { [00000001] } SamHD_TSE.exe+4EC703 - 8B 01 - mov eax,[ecx] Как видим, если не совпадают, то записывается по адресу SamHD_TSE.exe+B5A268 1 и наверное что-то должно произойти, скорее всего вылет из игры. Так что эту проверку можно отключить просто заменив 74 на EB (т.е. je на jmp). Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 17 марта, 2016 Поделиться Опубликовано 17 марта, 2016 (изменено) Написал скрипт от читающий инструкции, без вылетов, добавляется бронька до её подбора. Попробуй скрипт: Скрытый текст { Game : SamHD_TSE.exe Version: Date : 2016-03-17 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(GodMod,SamHD_TSE.exe,CC 8B 01 33 C1 39 41 04) // should be unique alloc(newmem,$1000) label(code) label(return) registersymbol(GodMod) newmem: cmp [ecx+A0],2 jne @f cmp [ecx+A4],#45 jne @f mov [ecx],#99 xor eax,ecx mov [ecx+04],eax jmp code @@: cmp [ecx+40], #16 jne code cmp [ecx+2C], 1 jne code mov [ecx],#99 xor eax,ecx mov [ecx+04],eax code: mov eax,[ecx] xor eax,ecx cmp [ecx+04],eax jmp return GodMod+01: jmp newmem nop nop return: [DISABLE] GodMod+01: db 8B 01 33 C1 39 41 04 unregistersymbol(GodMod) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "SamHD_TSE.exe"+4EC6F0 "SamHD_TSE.exe"+4EC6DA: 8B 55 08 - mov edx,[ebp+08] "SamHD_TSE.exe"+4EC6DD: 89 01 - mov [ecx],eax "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 // ---------- INJECTING HERE ---------- "SamHD_TSE.exe"+4EC6F0: 8B 01 - mov eax,[ecx] "SamHD_TSE.exe"+4EC6F2: 33 C1 - xor eax,ecx "SamHD_TSE.exe"+4EC6F4: 39 41 04 - cmp [ecx+04],eax // ---------- DONE INJECTING ---------- "SamHD_TSE.exe"+4EC6F7: 74 0A - je SamHD_TSE.exe+4EC703 "SamHD_TSE.exe"+4EC6F9: C7 05 68 A2 F5 00 01 00 00 00 - mov [SamHD_TSE.exe+B5A268],00000001 "SamHD_TSE.exe"+4EC703: 8B 01 - mov eax,[ecx] "SamHD_TSE.exe"+4EC705: C3 - ret "SamHD_TSE.exe"+4EC706: CC - int 3 "SamHD_TSE.exe"+4EC707: CC - int 3 "SamHD_TSE.exe"+4EC708: CC - int 3 "SamHD_TSE.exe"+4EC709: CC - int 3 "SamHD_TSE.exe"+4EC70A: CC - int 3 "SamHD_TSE.exe"+4EC70B: CC - int 3 } Зы: переделал скрипт с твоими фильтрами вроде пашет нормально и на всякий случай добавил xor eax,ecx mov [ecx+04],eax запись шифрованного значения. Изменено 17 марта, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 17 марта, 2016 Поделиться Опубликовано 17 марта, 2016 А супер-оружие это которое на дне первого озера подбираем? Ссылка на комментарий Поделиться на другие сайты Поделиться
SergBrNord Опубликовано 17 марта, 2016 Автор Поделиться Опубликовано 17 марта, 2016 (изменено) 2 часа назад, Garik66 сказал: И кстати нашёл по поводу сверки шиврованного значения в игре (о чём тоже писал ранее), вот это место в коде: SamHD_TSE.exe+4EC6F4 - 39 41 04 - cmp [ecx+04],eax SamHD_TSE.exe+4EC6F7 - 74 0A - je SamHD_TSE.exe+4EC703 SamHD_TSE.exe+4EC6F9 - C7 05 68A2F500 01000000 - mov [SamHD_TSE.exe+B5A268],00000001 { [00000001] } SamHD_TSE.exe+4EC703 - 8B 01 - mov eax,[ecx] Как видим, если не совпадают, то записывается по адресу SamHD_TSE.exe+B5A268 1 и наверное что-то должно произойти, скорее всего вылет из игры. Так что эту проверку можно отключить просто заменив 74 на EB (т.е. je на jmp). Сделал так, чтобы инструкция постоянно срабатывала - ничего не произошло. Скучно =( 1 час назад, Garik66 сказал: Написал скрипт от читающий инструкции, без вылетов, добавляется бронька до её подбора. При активации скрипта НР будет подыматься до максимальной (в зависимости от сложности игры) и потом опять откатываться на #99. Попробуй скрипт: Показать содержимое { Game : SamHD_TSE.exe Version: Date : 2016-03-17 Author : Garik66 This script does blah blah blah } [ENABLE] aobscanmodule(GodMod,SamHD_TSE.exe,CC 8B 01 33 C1 39 41 04) // should be unique alloc(newmem,$1000) label(code) label(return) registersymbol(GodMod) newmem: cmp edi,1 jne code cmp [ecx+A0],2 jne @f mov [ecx],#99 // НР jmp code @@: cmp [ecx+2C], 1 jne code mov [ecx],#99 // Armor code: mov eax,[ecx] xor eax,ecx cmp [ecx+04],eax jmp return GodMod+01: jmp newmem nop nop return: [DISABLE] GodMod+01: db 8B 01 33 C1 39 41 04 unregistersymbol(GodMod) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "SamHD_TSE.exe"+4EC6F0 "SamHD_TSE.exe"+4EC6DA: 8B 55 08 - mov edx,[ebp+08] "SamHD_TSE.exe"+4EC6DD: 89 01 - mov [ecx],eax "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 // ---------- INJECTING HERE ---------- "SamHD_TSE.exe"+4EC6F0: 8B 01 - mov eax,[ecx] "SamHD_TSE.exe"+4EC6F2: 33 C1 - xor eax,ecx "SamHD_TSE.exe"+4EC6F4: 39 41 04 - cmp [ecx+04],eax // ---------- DONE INJECTING ---------- "SamHD_TSE.exe"+4EC6F7: 74 0A - je SamHD_TSE.exe+4EC703 "SamHD_TSE.exe"+4EC6F9: C7 05 68 A2 F5 00 01 00 00 00 - mov [SamHD_TSE.exe+B5A268],00000001 "SamHD_TSE.exe"+4EC703: 8B 01 - mov eax,[ecx] "SamHD_TSE.exe"+4EC705: C3 - ret "SamHD_TSE.exe"+4EC706: CC - int 3 "SamHD_TSE.exe"+4EC707: CC - int 3 "SamHD_TSE.exe"+4EC708: CC - int 3 "SamHD_TSE.exe"+4EC709: CC - int 3 "SamHD_TSE.exe"+4EC70A: CC - int 3 "SamHD_TSE.exe"+4EC70B: CC - int 3 } Броня работает, здоровье отказывается уменьшаться. Сейчас пофикшу. UPD. Заставил здоровье прибавляться, но изменение здоровья каким-то образом уменьшает коэффициент входящего урона в монстров. Посмотрю xor-ы. 1 час назад, Garik66 сказал: А супер-оружие это которое на дне первого озера подбираем? Это пушка, стреляющая ядрами. буквально =) Скрытый текст Вот линк на мои сейвы. Самый первый - там пушка уже есть. Только сохранено рядом с монстром. https://www.dropbox.com/s/f0obmwevlkmb8qn/SeriousSamHD_TSE.rar?dl=0 P.S. А можно ли перемещаться от скрипта к участку кода, который он изменяет? Изменено 17 марта, 2016 пользователем SergBrNord Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 17 марта, 2016 Поделиться Опубликовано 17 марта, 2016 3 минуты назад, SergBrNord сказал: Броня работает, здоровье отказывается уменьшаться. Сейчас пофикшу. Перепроверь тот скрипт, я его чуть-чуть изменил. 4 минуты назад, SergBrNord сказал: Это пушка, стреляющая ядрами. буквально =) Да не, я не буду тестить - тесть сам, я то думал она там рядом просто лежит, в самом начале. У меня всё равно игра периодически вылетает - надоела уже, не поймёшь из-за скрипта или сама. Наверное нужно затестить - запустить игру и не подключать СЕ и скрипты и посмотреть - вылетит ли она или нет. 6 минут назад, SergBrNord сказал: А можно ли перемещаться от скрипта к участку кода, который он изменяет? Вопрос не понял, лучше на примере скрипта покажи, что имеешь ввиду. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 17 марта, 2016 Поделиться Опубликовано 17 марта, 2016 11 минуту назад, SergBrNord сказал: Сделал так, чтобы инструкция постоянно срабатывала - ничего не произошло. Скучно =( А по поводу этих инструкций не до конца я выяснил что это, но какая-то проверка идёт, дальше там идут ещё проверки и к чему это приводит не знаю - может как раз к вылету из игры, но не сразу, а через некоторое время. Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 18 марта, 2016 Поделиться Опубликовано 18 марта, 2016 Всё фильтра сидят делают. В этой игре за базовый адрес можно взять регистр esi - его даже игра использует на жизни. От него в смещении esi + 58 хранятся ID персонажей. Но так как СЕ не может добавить 'PlayerPuppet' за место фильтра, то его перевести надо из текста в какой не будь указатель и поставить сравнение на нем. Это отделит врагов от персонажа. Броня хранится в смещении +49С а жизнь в смещении + 488 Всем максимальные характеристики того или иного, хранятся там же. Это сидеть надо и смотреть. В итоге получается: Вот эта инструкция сравнения на HP персонажа, срабатывает при врубления отладчика на жизни персонажа cmp [esi+00000498],eax видать сравнение жизни в eax лежит 64 - а то есть в 10_ом 100 Вот на этой инструкции и делается всё. Все последующие смещения характеристик, оружия и тому подобного для персонажа идут в этой же структуре. Вот в данном видео я на пример пока не все нашел смещения для оружия и затолкал их на активацию сразу всего и жизни и брони и не которых видов оружия. Вот в этом режиме и можно будет искать все последующие смещения. Так как в нем есть практически всё. Есть конечно инструкция отвечающая за всё оружие в игре, но не знай будет ли она стабильно работать и не вылетать. Лучше уж так по смещениям сделать - видов оружий в игре не много и не которые типы патронов совпадают даже. На пример тоже самое ружьё и двухстволка или пулемет и два автомата в руке используют один и тот же тип патронов. Скрытый текст Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 18 марта, 2016 Поделиться Опубликовано 18 марта, 2016 (изменено) 1 час назад, LIRW сказал: Всё фильтра сидят делают. А что ты умничаешь. Выложи скрипт свой. Посмотрю как ты в скрипте с XORированием сделал. Очень интересно посмотреть.Так как в игре идёт сверка. Я делал автоматический поиск указателей на НР (но там 300 цепочек остаётся и во всех первое смещение +488). Но так и не до отсеил до конца - ломает. Что в esi идёт начало структуры это было понятно с самого начала. А вот этот поинтер (который на смещении +58) я не открывал (не догадался посмотреть по этому смещению, искал по поинтерам около НР), да там действительно есть нормальное ID.PlayerPuppet. Ну теперь с таким ID проблем вообще нет написать скрипт. Но ты всё же выложи свой скрипт - интересно. И расскажи ещё как ты вышел на инструкцию cmp [esi+00000498],eax из адреса НР. Изменено 18 марта, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 18 марта, 2016 Поделиться Опубликовано 18 марта, 2016 52 минуты назад, Garik66 сказал: Выложи скрипт свой. Посмотрю как ты в скрипте с XORированием сделал. Где ты тут видишь шифрование то. newmem: push ecx mov ecx,[esi+58] cmp [ecx],79616C50 Это в обще фильтр идет jne code mov [esi+00000488],#999 //heath mov [esi+00000A10],#200 //ammo shotsgun mov [esi+00000A80],#200 // ammo sniper mov [esi+0000049C],#999 // Armor code: А то сразу умничаешь... Фильтр взять с поинтера и всё.. и то для того что бы врагов отделить от персонажа. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения