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

SergBrNord

Пользователи+
  • Постов

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

  • Посещение

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

    12

Сообщения, опубликованные SergBrNord

  1. 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", я тоже вряд ли бы додумался)

  2. 16 минуту назад, Garik66 сказал:

    У Механиков есть в антологии игра Serious Sam 3 - BFE - это она?

    Просто у тебя в заголовке игра называется Serious Sam HD: TSE, вот я и подобрал наиболее подходящую из антологии.

    Нет, это не оно. Объяснил в ПС.

     

    Покопался и нашел смещения, хранящие значения патронов для оружия:

    Скрытый текст

    [ECX] + ...

    588 - дробовик/двустволка

    798 - миниган/автомат

    5А8 - ракеты

    5B8 - гранатомёт

    5C8 - огнемёт

    5D8 - лазерное ружьё

    5E8 - серьёзная пушка

    5F8 - снайперская винтовка

    608 - серьёзная бомба

     

    Попробую похимичить со значениями, но как показало себя вмешательство с бронёй - игра очень нервно реагирует на изменение содержимого ECX.

  3. Гарик, ты развил прям-таки бурную деятельность. Но есть один мааааа-хонький нюанс - ты сделал таблицу для "Классики", а движки SE1 и SE3 работают по-разному. 

    Я проверил твою идею о том, что реальное значение хранится как вещественный тип. Действительно, при выборке в поиск всех типов значений находится и float, но на движке SE3 оно как раз-таки экранное.

    Скрытый текст

    190575785ceed61e1b65.jpg

     

    18 час назад, Garik66 сказал:

    Думаю не работает фильтр свой/чужой в скрипте, поэтому морозятся все брони, а так как урон НР в игре скорее всего проходит только когда бронь разрушена, то морозится и НР.

     

    Интересно. Я даже как-то не подумал о таком варианте, хоть он вроде бы даже и логичен. Поставлю остановов на запись - может чего и выловлю. Хотя в последнем варианте я всё-же записывал после того, как урон наносился. Странно.

     

  4. По мотивам беседы с Гартком в ПМ, пытаюсь совладать с броней и получился такой казус - если пытаться писать скрипт под броню отдельно от здоровья, то получается, что он морозит и здоровье противников тоже... Как я понял, это связано с особенностью пересчёта здоровья и брони игрока.

     

    Собственно, у меня сейчас такой вариант скрипта:

    Скрытый текст
    
    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. А существует вообще в данном случае вариант записать значение брони так, чтобы получаемый урон на него не влиял? 

  5.  

    4 часа назад, Garik66 сказал:

    Стандартная ошибка всех, кто начинает (не беспокойся все эту ошибку делают ;)).

    Посмотри участок твоего кода:

     

    
    mov dword ptr [ecx], #99 // записываем 99 НР
    
    code:
      mov [ecx],eax          // и сразу же затираем их значением в eax/    

    Действительно, глупая ошибка; от постоянной возни с C# у меня как-то в голове перепуталось, что ассемблерный код не является функциями и выполняется последовательно (а возился я с asm года этак с 4 назад).

     

    4 часа назад, Garik66 сказал:

    Записывают XORированные значения (XORирование через две константы) в два соседних адреса, а потом дальше по коду сверяют их друг с другом и, если значения в этих адресах не совпадают, то Ваш ГГ лопается - смотрится очень прикольно кстати - мне понравилось :D

    Т.к. игра на SeriousEngine3, тут возможна следующая подлянка - за игроком по уровням будет быстро-быстро носится неубиваемая зверюшка и сильно мешаться (это происходило в пиратских SS3):lol:

     

    2 часа назад, LIRW сказал:

    И всё равно - что то я не то мне кажется дал... Там на СЕ форуме есть тема как раз про эту игру. И там всё описано понятно. Там просто слишком много переходов по ссылкам - по этому и запутался я.

    В общем что бы не путаться - вот она Тема  

    Спасибо, почитаю. Собственно, мне интересно, как работают все вышеуказанные примеры, так что я их обязательно попробую!

     

    Кстати, те первые две инструкции (которые в окне прерывания на доступ) работают с количеством убитых монстров и набранных очков; чит-режимом.

     

    P.S.

    Собственно, как задумывался скрипт - в SS HD: TSE есть очки; очки даются как за убийство монстров, так и за сбор предметов на уровне (патронов, аптечек). Соответственно, необходимо установить параметр здоровья в такую максимальную величину, чтобы можно было всегда собирать предметы. Так что меня ещё ждёт броня и оружие. Заодно попробую сделать телепорт по мотивам уроков Xipho и неуязвимость от зон смерти (шипов & etc.)

  6. Здравствуйте!

    Я обучаюсь по видеокурсу Xipho и малость застрял на фильтрах "свой/чужой".

    Делал всё по ГОСТу - нашёл инструкцию, покопался в структурах игрока и противника, написал скрипт, который не работает, как мне кажется, из-за неверного определения местонахожения структуры игрока

    Помогите разобраться, где я ошибся.

     

    Насколько я понял, идёт сравнение значений, в начале структуры(?), указатель на который находится в ECX, и значения в EAX; если не совпадает - идёт запись нового значения в начало структуры.

     

    Скрины с редактором памяти и окном прерывания на доступ.

    Скрытый текст

    6aa8f78a1b7e05b29c58.jpg

     

    af0bbb6e0b95201159ef.jpg

     

    Позже я при помощи врагов нашёл ещё парочку адресов, которые работали с этой инструкцией и посмотрел, что там находится. 

     

    Окно разбора структур. Игрок; враг_1; враг_2; враг_3 соответственно.

    Скрытый текст

    73e330de1ad77cf9851b.jpg

     

     

    По смещению А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)

     

     

×
×
  • Создать...

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

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