MasterGH Опубликовано 30 декабря, 2012 Поделиться Опубликовано 30 декабря, 2012 (изменено) Версия 1.0Приложение ShotGame.rarПакадж (для тех у кого Unity3d 4.0) ShotUnitypackage.rarПользователь наводит пистолет на стену. После чего выстреливает. Создаётся пуля, ей придаётся сила и пуля летит в стену. Как только пуля касается стены, то стене наносится урон. Количество выстрелов и количество "здоровья" стены отображается в левом верхнем углу. Наша задача исследовать и сделать так чтобы пуля не наносила урон стене.Содержание:1. Обзор игры и кода высокого уровня в игровом движкеВ объекте пули есть поведение (скрипт BulletCollision.cs). Когда пуля соприкасается с коллизей стены, то происходит анимация пламени (prefabflashAnimation) и стене отправляется событие OnDamage с аргументом power OnCollisionEnter. Это стандартная функция-приёмник оповещающая, что была коллизия.А у стены есть скрипт-поведение Unit.cs, в котором есть функция-приёмник OnDamage.В результате соприкосновения коллизий пули и стены получаем, что через сообщение у стены отнимается "здоровье" (если так можно выразиться, подразумевается "прочность стены"). Конечно, здесь нет условия Game Over, если здоровье будет меньше нуля. Оно нам сейчас не особо важно.2. Обзор отладочного кодаusing UnityEngine;using System.Collections;public class BulletCollision : MonoBehaviour {public GameObject prefabflashAnimation;public float power = 25f;void OnCollisionEnter(Collision collision){GameObject.Instantiate(prefabflashAnimation,collision.contacts[0].point,prefabflashAnimation.transform.rotation);collision.collider.SendMessage("OnDamage", power, SendMessageOptions.DontRequireReceiver);}}using UnityEngine;using System.Collections;public class Unit : MonoBehaviour {public float health = 1000000f;string strHealth = "<b>Wall Health</b> 1000000";void OnGUI() {GUILayout.Label(strHealth, GUILayout.Width(220f), GUILayout.Height(30f));}void OnDamage(float valueDamage) {health -= valueDamage;strHealth = "<b>Wall Health</b> " + health.ToString();}}Наша задача сейчас рассмотреть классический метод. Ищем адрес здоровья. Ставим бряк и смотрим код.Хм. Знакомое окно, знакомая картина.0797AEFB - 57 - push edi0797AEFC - 83 EC 04 - sub esp,040797AEFF - 8B 7D 08 - mov edi,[ebp+08]0797AF02 - D9 47 14 - fld dword ptr [edi+14] //EDI=00BB4F600797AF05 - D9 45 0C - fld dword ptr [ebp+0C]0797AF08 - DEE9 - fsubp st(1),st(0)0797AF0A - D9 5F 14 - fstp dword ptr [edi+14]0797AF0D - 8D 47 14 - lea eax,[edi+14]0797AF10 - 83 EC 0C - sub esp,0C0797AF13 - 50 - push eax0797AF14 - E8 D7000000 - call 0797AFF0 // переход на 3-тий бряк0797AF19 - 83 C4 10 - add esp,100797AF1C - 83 EC 08 - sub esp,080797AF1F - 50 - push eax0797AF20 - 68 E097B900 - push 00B997E0 : [0752132C]0797AF25 - E8 3E7CFDFF - call 07952B680797AF2A - 83 C4 10 - add esp,100797AF2D - 89 47 10 - mov [edi+10],eax0797AF30 - 8D 65 FC - lea esp,[ebp-04]0797AF33 - 5F - pop edi0797AF34 - C9 - leave0797AF35 - C3 - retТе кто умеют делать скрипты на CE здесь бы просто могли по сигнатуре нопить fsubp st(1),st(0). Фильтров пока не касаемся. Стена у нас одна, других стен нет.3. Обзор структур данныхВспоним что EDI=00BB4F60, а вот структураОсобо нам это ничего не говорит. Посмотрим в отладчик MonoМда. Возможно и получится найти сходство, если бегать в CE по вложенным указателям в структурах.4. Другой способМы подходим к самому главному. К отключению коллизии.В редакторе это делается просто снятием галочкиИ наша задача как эту галочку снять средствами CE. А вот как именно, об этом позже.Продолжение следует... Изменено 24 октября, 2014 пользователем MasterGH Ссылка на комментарий Поделиться на другие сайты Поделиться
Tiger Опубликовано 8 февраля, 2014 Поделиться Опубликовано 8 февраля, 2014 Перезалей файл, удален за сроком давности. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 8 февраля, 2014 Автор Поделиться Опубликовано 8 февраля, 2014 Еле нашел файлы и залил в аттач. Надеюсь, за 26 мегайбайт Xipho не будет ругаться.Продолжение статьи, скорее всего, не будет, т.к. я не нашел способ выключить коллизию через Cheat Engine и отложил эту затею. Пока нет желания ей заниматься. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 9 февраля, 2014 Поделиться Опубликовано 9 февраля, 2014 Еле нашел файлы и залил в аттач. Надеюсь, за 26 мегайбайт Xipho не будет ругаться.Продолжение статьи, скорее всего, не будет, т.к. я не нашел способ выключить коллизию через Cheat Engine и отложил эту затею. Пока нет желания ей заниматься.У нас 100 гигов на портале, так что 26 мегов - это мелочь, правда же, да? ))))ЗЫ. На досуге начал углубленно осваивать "решетки". Посмотрим, что из этого выйдет )И да, грядет глобальное обновление нашего портала (как только выдастся свободное время). Ссылка на комментарий Поделиться на другие сайты Поделиться
aliast Опубликовано 24 февраля, 2014 Поделиться Опубликовано 24 февраля, 2014 Продолжение статьи, скорее всего, не будет, т.к. я не нашел способ выключить коллизию через Cheat Engine и отложил эту затею. Пока нет желания ей заниматься.Меня только сейчас осенило, что Unity преимущественно C# (Java) движок. А ломать игры, написанные на C#, при помощи Cheat Engine то ещё удовольствие. Там адреса будут постоянно слетать. Проще скрипт, отвечающий за коллизию, из dll выкорчевать и переписать. Надо будет попробовать на досуге... Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 24 февраля, 2014 Автор Поделиться Опубликовано 24 февраля, 2014 Вот что происходит, когда кто-то периодически апает заброшенные темы - рождаются новые идеи. В общем подумав я решил сделать так.Unity3d использует .net сборки для работы своих приложений на разных платформах. Поэтому можно пойти например тремя путями1. Сделать инъекцию кода в сборку Assembly-CSharp.dll2. Переписать Assembly-CSharp.dll3. Отлаживать машинный кодВарианты 1 и 3 делать долго. А вот вариант 2 очень даже простой.1. Ищем Assembly-CSharp.dll2. Декомпилируем через ILSpy3. Находим класс Unitusing System;using UnityEngine;public class Unit : MonoBehaviour{public float health = 1000000f;private string strHealth = "<b>Wall Health</b> 1000000";private void OnGUI(){ GUILayout.Label(this.strHealth, new GUILayoutOption[] { GUILayout.Width(220f), GUILayout.Height(30f) });}private void OnDamage(float valueDamadge){ this.health -= valueDamadge; this.strHealth = "<b>Wall Health</b> " + this.health.ToString();}}4. В этот класс добавляем функцию, которая бы включала и выключала коллизию. Прочитав документацию по скриптингу на официальном сайте узнали, что это можно сделать в функции Update:private void Update(){ //Cheat Disable Wall collision if(Input.GetKeyUp(KeyCode.H)){ collider.enabled = !collider.enabled; }}Сделать это можно декомпилировав Assembly-CSharp.dll и построив новую .net библиотеку Assembly-CSharp.dll в программе Sharp Develop (бесплатная среда разработки .net)5.Компилируем проект в Sharp Develop и заменяем файл Assembly-CSharp.dll6. Запускаем игру и при нажатии на кнопку H можем стрелять сквозь стену. Что собственно я и хотел сделать.----Вывод1. Теперь ни по одной стене попасть нельзя (хотя там одна стена). Стрельба происходит насквозь стены. Если бы это был игрок, а не стена, то игрок с классом Unit был бы бессмертным. К сожалению на .net игры тормозные и их под PC мало.Вывод2. Можно находиться мыслями на более высоком уровне "функций", а не на машинном коде. Иными словами зная функции движка (не только Unity3d, а например UDK) и аргументы функции, можно эти функции использовать для создания читов. Например изменять/читать характеристики коллизий, характеристики игрока... Хотя многие крутые игровые движки и документация SDK закрыты от обычного смертного, все равно можно ковырять и трейсить функции чтобы понять какая функция, что делает. Тогда например посмотрев на каком игровом движке написана игра можно смело использовать сигны функций на любой игре этого движка. Это уже что-то типа сигны на все игры этого движка, а не только на все версии определенной игры...Assembly-CSharp.rar Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения