Продолжение поста «Наткнулся на упоротую годноту на просторах»5
Ответ на пост «Георгий Вицин - интересные факты»1
30 июля 1947 года родился Арнольд Шварценеггер - один из самых любимых и известных актеров нашей страны
Все привыкли видеть актёра в образе Терминатора, однако в жизни он всегда был совсем другим человеком
1) Арнольд придерживается мясной диеты и регулярно занимается со штангой. На съёмках он отводил определённое время для занятий, даже если это было не предусмотрено сценарием. К штанге его приобщил Френк Коломбо, с которым они познакомились на конкурсе "Мистер Олимпия". Случалось, что после команды "На сцену!" спортсмен смотрел на жюри и вежливо, но твердо заявлял - "Извините, мне сначала надо семь раз поднять вот эти блины и потягать гантельки"
2) Голосом Шварценеггера можно озвучивать фильмы про немецкий концлагерь. Он мог часами тренировать акцент, но не находил идеальное американское звучание. Голосом актёра говорит любимец советских детей - робот из будущего. "Айл би бэк!" Помните? Это Шварц. Или вот известная цитата из этого фильма - "Аста ла виста, бэби! Мне нужны твои ботинки, твоя одежда и твой мотоцикл!". Самый популярный персонаж, которого Шварценеггер озвучивал в мультфильмах - Капитан Храбрость в "Детском Саду Супергероев" (2011)
3) В юности был увлечён культуризмом. Шварц хорошо качался, особенно удавались ему бицепсы на руках. В школьные годы у Арнольда обнаружились балетные данные, и он мог бы поступить в хореографическое училище. Позже он увлёкся политикой и начал лепить горбатого
4) Боготворил пляжи Калифорнии. Все окрестные качки, бездельники, тусовщицы точно знали, когда он выходит "на променад", и собирались перед Венус Бич. Говорят даже, что на проводы его в губернаторы пришло много бывших панков. Их не отпугивали. Знали, что эти звери пришли просто покачаться
5) Помните известную сцену из фильма "Неудержимые", где неподражаемая троица Шварц, Сталлоне и Брюс Уиллис выстраиваются в живую преграду перед бандитами Ван-Дамма? Это же настоящая классика. Шварц сам придумал этот момент и посоветовал Ван-Дамму на этот раз не выпендриваться. Тот с радостью согласился
6) Актёр никого никогда не бил. Ну как не бил. Никаких потасовок при избирателях. Даже когда снимали сцену с пивом для японской рекламы, Шварценеггер поначалу вежливо попросил вписать в контракт условие о запрете демонстрации этих роликов за пределами Японии. Но режиссёр артачился. Тогда ему и пришлось повстречать настоящий австрийский кулак. Единственный раз в жизни
Арнольд Шварценеггер не любил японцев и считал их (вырезано цензурой)
7) Играл роли разного возраста. Арни выглядел молодо и часто исполнял роли персонажей, которые были заметно младше его. Например, в 67 лет он сыграл 18-дневного Т-800 в фильме "Терминатор 5", а в 71 год - старого, но не бесполезного робота в "Терминаторе - Тёмные Судьбы". При этом он также убедительно изображает возрастных героев, например, старого Конана на пробах "Короля Конана". Актёр никогда не выглядел на свой возраст. Хотя и не слишком тщательно следил за своим здоровьем и образом жизни
8) Арни всегда был нескромным человеком. Несмотря на изначальную непопулярность, он сразу старался жить нескромно. На старости жизни он записывал юмористические ролики, приставая к прохожим прямо на улицах Лос-Анджелеса, а на гонорары покупал всякое говно. Однажды он подобрал старый танк, на котором когда-то служил, починил его и поставил себе в гараж
9) Поддерживая знаменитый образ Т-800, Арнольд был удивительно смелым человеком. Например, на съемках фильма "Терминатор 2" была запланирована сцена с Т-1000, причём жидкий робот должен был быть на безопасном расстоянии и за решёткой. Однако что-то пошло не так, и Т-1000, пройдя сквозь решётку, вплотную подошёл к актеру. В шоке были все. Кроме Шварценеггера. "Не бойтесь, - сказал Арни, - новички кинозвёзд не трогают". И даже погладил Роберта Патрика…
10) Невероятно, но в реальной жизни Шварценеггер, Сталлоне и Брюс Уиллис не дружили. Шварц нередко позволял себе нелестные высказывания в адрес коллег. Сталлоне и Уиллис тоже не упускали возможности его поддеть. Но всё это было за кадром
11) У Шварценеггера были и серьёзные роли. Он так убедительно сыграл Гамлета в фильме "Последний Киногерой", что на эту роль в другому фильме по Шекспиру тут же пригласили другого актёра - а Арнольда попросили больше не касаться классики.
В фильме "Красная Жара" 1988 года с Арнольдом Шварценеггером зачем-то сыграл звезда американского кино Джеймс Белуши
12) Сердцеед и любит женское внимание. Был смешной случай: Арнольду предложили однажды сняться в эпизоде, где его герой мчится на водных лыжах по калифорнийскому заливу. Тот отказался, так как не умел плавать. Тогда режиссёр пошел на хитрость и показал ему письмо следующего содержания:
"Уважаемый австрийский дуб! Вы мой идеал, я мечтаю познакомиться с Вами! Слышала, завтра Вы снимаетесь на акваплане? Какой Вы смелый! Я обязательно посмотрю, и после съёмок подойду к Вам без одежды. Поверьте, Вы не разочаруетесь. Шэрон Стоун". На следующий день Арни отважно носился по водной глади
13) В 2012 году в городе Колумбус был установлен памятник Арнольду Шварценеггеру. Он изображен в образе молодого бодибилдера
Это внеплановый выпуск почившей уже почти полгода назад серии Упоротые Пересказы. Извините, разово не удержался. Без ИИ и нейросетей - издеваемся над серьёзными биографическими постами от профессиональных биографов
Оригинал здесь - Георгий Вицин - интересные факты
Хлебный монстр
Сегодня увидел в сети сей кулинарный "шедевр" и по-моему сегодня не буду спать, всему виной этот взгляд...)))
Судный день: Начало
Как я случайно Cheat Engine для браузерных игр написал
Как-то ковыряясь в очередной самопальной браузерной игре, я задумался о том, где она хранит свои переменные. Очень уж хотелось бабосиков себе в ней намутить. Да, подобные приколы умерли вместе с Artmoney и многие считают, что такие выкрутасы в однопользовательских логальных играх - удел неудачников. Но, пытливый ум он иногда просто бесит :(
Ну в самом деле, если на экране написано, что у меня 12345 золотых, то где-то эти 12345 должны лежать. В обычной игре под виндовс я бы на этом месте запустил старый добрый Cheat Engine или ArtMoney, нашёл значение за несколько проходов и успокоился, но тут всё происходило в браузере, а значит стало интересно.
Игра оказалась собрана на WebAssembly. Я с ним раньше особо близко не общался, поэтому некоторое время ушло просто на то, чтобы понять, куда смотреть. Оказалось, что всё не так страшно: память WASM линейная, а со стороны Javascript её часто можно увидеть в виде знакомых массивов HEAP8, HEAP16, HEAP32, HEAPF32 и прочих. По сути, разные представления одних и тех же байтов.
Ну а дальше задача уже выглядит совсем привычно: берём HEAP, ищем в нём нужное значение, запоминаем индексы, значение в игре меняется - ищем новое только среди найденных ранее. Обычный Cheat Engine, только вместо памяти процесса у нас массив Javascript. Я написал для этого три маленьких сниппета в консоль. Первый проходил по HEAP и сохранял найденные индексы в localStorage, второй проверял только сохранённые позиции и отбрасывал лишнее, третий показывал, что в итоге осталось. На этом, собственно, всё и должно было закончиться.
Но не закончилось :)
Куда пропал HEAP
В первой игре всё работало прекрасно, а в следующей нужных HEAP32 и компании я просто не нашёл. Хотя понятно, что память у работающего WASM куда-то исчезнуть не могла.
После некоторого ковыряния выяснилась интересная особенность. Если остановить выполнение игры в отладчике, нужный HEAP обнаруживался в локальных переменных одного из call frames. Пока игра стоит на паузе - вот он, можно спокойно читать. Продолжаем выполнение - привычной ссылки на него уже нет. И вот тут мои три прекрасных сниппета превратились в довольно унылое занятие. Остановить игру в debugger, найти нужный frame, выполнить первый код, снять с паузы, что-нибудь изменить в игре, снова остановить, опять найти HEAP, выполнить следующий код...
Причём в некоторых играх всё это хозяйство ещё и живёт не в основной странице, а во фреймах или вообще в воркерах. Работало, но уже начинало напоминать ручной труд там, где его быть совершенно не должно. Поскольку Chrome умеет всё это делать через Debugger Protocol, следующим логичным шагом было переложить работу на расширение, дабы оно само подключалось к выбранной вкладке, ставило выполнение на паузу, перебирало доступные targets и call frames и искало там HEAPы. Так появилась кнопка Pause & Hunt HEAP и вместе с ней первая более-менее удобная версия того, что я назвал WASM Memory Scanner.
Как этим пользоваться
Если вы когда-нибудь пользовались Cheat Engine или ArtMoney, объяснять особо нечего. Выбираем вкладку с игрой, жмём Pause & Hunt HEAP, после чего расширение пытается найти доступную память WASM.
Дальше вводим значение и делаем First Scan, отпускаем игру через Resume, меняем искомое значение и после следующего Pause & Hunt делаем Next Scan. Повторяем, пока из тысяч результатов не останется что-нибудь вменяемое.
Причём довольно быстро выяснилось, что одного поиска точного значения мало. Поэтому появились Changed/Unchanged, Increased/Decreased, поиск диапазона, изменение на заданную величину и Unknown initial value. Последний полезен, например, когда есть полоска здоровья, но самого числа мы не знаем: запоминаем начальное состояние, получаем урон и оставляем уменьшившиеся значения. Лечимся - оставляем увеличившиеся.
Тут тоже ничего нового, ровно так memory scanners работали последние лет двадцать. Найденные адреса можно складывать в отдельный список, смотреть их текущее значение, записывать новое и при необходимости включать Freeze. Заодно пришлось сделать индикатор прогресса, потому что первый проход по большому HEAP может занять заметное время, а смотреть несколько минут на неподвижное окно и гадать, работает оно или уже всё, оказалось не очень увлекательно.
На чём это работает
Вот здесь самое интересное. Сам факт того, что мы нашли в памяти игры число и успешно его поменяли, ещё совершенно не означает, что мы получили бесконечные деньги, бессмертие и власть над миром. В полностью клиентских и одиночных WASM-играх результат может быть именно таким - значение действительно является частью игровой логики и его изменение сразу на что-то влияет.
С такими играми экспериментировать интереснее всего. В серверных всё сильно зависит от архитектуры. Можно найти локальное количество денег, заменить 100 на 999999 и даже увидеть новый результат на WASM Memory Scanner , а при попытке что-нибудь купить сервер вполне резонно сообщит, что денег у нас как было 100, так и осталось.
Мы поменяли представление на клиенте, а настоящее состояние хранится совсем в другом месте. По той же причине я не вижу особого смысла лезть с этим в нормальные сетевые игры. Помимо возможного нарушения правил конкретной игры, там просто значительно меньше интересного: сервер всё равно главный.
А вот старые и новые однопользовательские браузерные игры, всякие Unity WebGL/WASM проекты, эмуляторы, небольшие игры на Emscripten и вообще WASM, в который хочется посмотреть из любопытства - совсем другое дело. Хотя последнее всё-таки с оговоркой: техническая возможность залезть программе в память не означает автоматически разрешение делать это где угодно. Для экспериментов лучше выбирать свои проекты, локальные игры или то, где подобные вещи не запрещены.
В итоге
Самое забавное во всей этой истории, что писать расширение я вообще не собирался. Мне нужны были три маленьких Javascript-сниппета, чтобы один раз проверить одну идею. Потом понадобилось автоматически находить HEAP. Потом выяснилось, что его надо выковыривать из остановленных call frames. Потом нашлись workers. Потом захотелось нормального поиска, прогресса, изменения значений, Freeze и интерфейса, которым можно пользоваться не держа рядом инструкцию.
Ну и в какой-то момент стало очевидно, что сниппеты несколько вышли из-под контроля :) Сейчас это уже вполне самостоятельное расширение для Chrome/Chromium. Всё работает локально, никакого сервера нет, исходники открыты, интерфейс на русском и английском.
В репозитории лежит само расширение, инструкция по установке и немного более подробное описание того, что оно делает.
Ссылка на репу: https://github.com/rikovmike/chrome-wasm-memory-scanner
Если кто-нибудь попробует его на какой-нибудь необычной WASM-игре или движке - интересно будет посмотреть на результаты. Особенно если HEAP там не найдётся вообще...
По сути, инструмент может быть полезен в дебаггинге своих игровых разработок, проверке безопасности и своих античитерских наработок, если ваш мегапроект настолько крут, что его нужно от этого защищать:)
UDP: В 99% случаев достаточно сканировать HEAP32, а на остальные забить. В 64, U32, U64 , да и порой в 16 значения просто отзеркалены из HEAP32. Можно не тратить на них время. Но... 1% все же существует :)













