[r][i][color=gray][url=http://klimaleksus.narod2.ru/Other/realms/171.txt]#171[/url], 02.09.12 (03.09.12)[/color][/i][/r] [quote=nihonjin]Кстати, aleksusklim, вы могли бы в своих постах хотя бы односложно отвечать на такие важные вопросы[/quote] Не-ет… Я просто. Если я отвечу не на всё сразу, то с огромной вероятностью то, на что я не ответил, окажется забыто навсегда! Поэтому я до сих пор так ничего не написал в тему про ВзломИПрограммы… На «важные» вопросы односложно не ответить… А я ж, блин, программист, мне ж неделями коды писать охота! Вот я и [s]бесцельно[/s] потратил очередную неделю на две новых ваще-супер-ультра крутых программы… А ответов от меня сложно дождаться… Ох, сколько ж я задолжал по ЛС и E-Mail… ой, что обо мне подумают добрые люди… [hr] Патчер. Пора бы его усовершенствовать! Как я сказал, нужен SmartPatcher, который сам будет сравнивать файлы и компоновать весь патч в один .bat, а не в кучу непонятно-чего. Ну вот я его и создал: http://klimaleksus.narod2.ru/Files/1/SmartPatcher.rar (100 Кб) Он реально чёткий. Преимуществ – куча! Первое – красивый интерфейс (называется, ломанул DOS кодировку…) Второе – удобное создание и применение, почти что в один клик. Третье – интерактивность. Он всё перепроверяет! Чтобы патч лёг нормально, чтобы данные совпадали, чтобы CRC сумма не подвела. Четвёртое – автоматическое backup архивирование. Если патч может необратимо изменить предложенный файл, то создаётся новый локальный патч лично для испорченного файла, чтобы его можно было восстановить. Таким образом отпадает необходимость в резервном копировании файлов перед применением патча + средствами SmartPatcher невозможно что-то окончательно запороть – даже если доиграться до десятков backup патчей, то всё равно файл можно будет вернуть в нетронутое состояние. Пятое – тонкая работа с данными. Переписывается только то, что реально отличается, что позволит применять несколько разных патчей к одному файлу. Ну например для вас это означает создать по одному патчу на каждую табличку, а потом последовательно применить их к WAD. У программы есть лишь один недостаток – практическая невозможность работы внутри DOS сценариев, поскольку SmartPatcher требует ответов пользователя на многие предупреждения. Принцип работы понятен (надеюсь…) из инструкции. Создание – запускаете, потом по очереди перетаскиваете в консольное окно оригинальный и изменённый файл, потом даёте имя для сохранения и готово; а применение ещё проще – перетаскиваете нужный файл прямо на сам BAT патч (только для этого сам SmartPatcher должен быть рядом, поэтому если хотите пользоваться без проблем, поместите его в Windows или в System32) А чтобы создать эту программу, мне пришлось учить Делфи запускать EXE файлы. Представляете, сам он этого, походу, не умел! Ну я и читал два дня MSDN, чтобы потом кодом через kernel32 всё вытаскивать. Хорошо хоть функция не такая зверская, и принимает «0» как по умолчанию почти для всех своих аргументов. Использованный мной CRC чекер вообще классный, я весь интернет перерывал, чтобы для дипломки такой найти. Вот и нашёл, называется – «crcp», но в SmartPatcher я по запарке назвал его «pcrc»… Сравнение файлов произвожу через стандартную «FC», но чтобы уж быть уверенным, решил её тоже выкопировать, ужать через UPX (кстати, читал статью о вреде UPX от создателей FAR, но этот самый вред проявляется только при запуске нескольких копий программы, что меня абсолютно не касается в данной ситуации) и засунуть внутрь своего SmartPatcher, а это оказалось возможным только через WinHex, когда я выбрал опцию «Copy Block > Pascal Source»; таки же макаром я и pcrc и cmd-скриптик внедрил – а чтобы код не казался пугающе огромным, я вынес каждый файл в отдельный .pas модуль! Поэтому-то прога сама по себе весит 60 Кб, а исходный код к ней – 127… Старался-то я конечно не для одного Spyro1 с его табличками, а для нашего Spyro3 тоже, ведь нам придётся патчить, патчить и патчить… Ну а чтобы эти патчи было легко передавать друг другу, я задумался. Как мы делимся файлами? Отвечу за себя – я халявно заливаю их себе на сайт. Кончится место – зарегистрирую себе ещё один сайт, ЯндексНарод, вроде бы, очень добрый и щедрый. А все остальные? Заливают их на файловые хостинги, где то цифорки не вводятся, то слоты закончились, то скорости нет, то время жизни истекло. Вы что, хотите, что наше наследие постарело и умерло!? Как бы ещё… Ну можно заливать нужные нам файлы в наше Хранилище, но создатели Гугля советуют экономить там место, потому как если мы исчерпаем лимит – будет плохо… Ещё можно друг другу по почте файлы отсылать. Но так очень легко запутаться и отправить кому-то не тому что-то не то, да ещё и испорченное по дороге. Можно заливать прямо сюда с администраторской помощью, но это сработает исключительно для общественно важных файлов, а не для всякого полуфабриката. Можно кодировать небольшие файлы в base64 и выкладывать сюда. А если файл 100 Кб? Как быть? Это не 5 Мб, которые заливают на хостинги. Но это и не 5 Кб, которые можно отправить текстом… Я нашёл решение! КАРТИНКА! (наверно, я изобрёл велосипед, но всё же) : http://klimaleksus.narod2.ru/Files/1/PictureCoder.rar (50 Кб) Я создал прогу, которая конвертирует ЛЮБОЙ файл в картинку BMP. Как? Ну сначала я хотел создать в памяти холст, потом брать три байта данных, выставлять на их основе цвета каналов и закрашивать пиксель, но это оказалось невероятно медленно! Потом я немного обмозговал структуру Bitmap файлов и понял, что данные в них лежат потоком (по крайней мере в картинках, длина которых кратна четырём) Без разделителей. А это значит, что я могу просто копировать двоичный файл прямо в тело картинки сразу после заголовка! Ну только разве что записать туда его размер и расширение имени файла, чтобы не ломать голову над форматом при восстановлении. Слишком просто? Тогда я придумал (два дня математические формулы выводил!) метод, по которому будет вычисляться соотношение сторон будущей картинки (ведь часто не весь последний ряд пикселей заполнялся данными). А именно: 1) Ширина всегда кратна «8». 2) Отношение длинной стороны к короткой не превосходит «4/3», если возможно по пункту 1. 3) Если в пункте 2 имеется несколько вариантов, то используется тот, в котором незанятое пространство будет минимально. 4) Если после пункта 3 осталось несколько одинаковых наборов, то берётся тот, где отношение сторон ближе к квадрату. Причём константы настраиваются (читайте инструкцию). Вот описание заголовка Bitmap (24 бит, после выхода из MSpaint): 2 байта – «BM» (424D). 4 байта – размер всего файла. 4 нулевых байта. 4 байта число «54» (36000000). 4 байта число «40» (28000000). 4 байта – ширина картинки. 4 байта – высота картинки. 2 байта «0100». 4 байта глубина цвета «24» (18000000). 2 нулевых байта. 1 байт «04». И ещё 19 нулевых байт. Итого 54 байта! Дальше потоком идут данные используемого файла. На картинке они заполняются слева направо и снизу вверх, поэтому пустые чёрные пиксели остаются в конце первого ряда. Конвертировать такую картинку, естественно, допустимо лишь в форматы без потерь качества. Например Png! Но где я найду исключительный конвертор BMP<>PNG небольшого размера… Взломал стандартный Paint. Нехило взломал, вырезал оттуда через Restorator почти всё, оставив 100 Кб. Через AutoIt сделал саму программу, которая загружает правильную картинку, потом вставляет адрес куда надо, сохраняет… Пришлось ещё мышь и клавиатуру на пару секунд вырубать, чтобы пользователь не запорол появление окошек. Файл: http://klimaleksus.narod2.ru/Files/1/ConvertPng.bmp (300 Кб) Ага! Это картинка. С моего сайта. Сохраните её и пропустите через PictureCoder. Получите RAR архив. Вот в нем и будет конвертор в Png, очень простой в использовании. А чтобы применить и его, вот ещё сам обрезанный Paint и всё необходимое для нормальной компиляции ConvertPng: http://i.piccy.info/i7/a74cd3549e6ccbd0259b92e97d1109aa/4-44-745/58284155/PaintSaver.png (100 Кб) Это уже PNG и притом не с моего сайта. Сначала конвертируете в BMP, а потом в PictureCoder и разархивировать. Короче, план такой. Создавать патчи готовых текстов/табличек, архивировать и заливать их как картинки на хостинги изображений, потому что такие сервера хранят файлы чуть ли не бесконечно и выдают потом без всяких ограничений. Как вам моя идея? Разумеется, применять её нужно только к небольшим файлам, в переделах пары мегабайт максимум. А то из-за нас закроют все бесплатные хостинги картинок)) [hr] В экспериментах над плейлистами от PSound я пришёл к тупику. Каждый трек имеет 4 уникальных байта, и это не смещение данных… Причём если взять их у одного трека и вставить в другой, то там они работать не будут. Мне кажется, что автор применил хэширование или что-то наподобие электронной подписи. Поэтому выставлять их вручную чтобы так пытаться заставить программу считывать нужные нам данные бесполезно. Зато через ProcessMonitor я смог отследить адрес первого обращения к файлу для чтения. То есть программа выдала мне offset, откуда PSound начинает читать данные. Я увидел, что он сперва берёт 4 байта, а потом транслирует всё остальное блоками по 32 Кб. Адрес конца изначально вроде не фигурирует. Я посмотрел на смещение, с которого он воспроизводил (трек – озвучка одного из драконов первого мира; файл – весь субфайл) – и там нули! Много нулей, около 16-ти и больше. Я скопировал эти данные в новый файл – сканировал. Обнаружено. Offset на этот раз – ноль, потому что данные пошли сразу. Удалил первый байт – сканировал. Ничего! Получается, что первоначальные нули жизненно необходимы если не для воспроизведения звука, то уж точно для его обнаружения. Программа ProcessMonitor: http://klimaleksus.narod2.ru/Files/1/ProcessMonitor135.png (800 Кб) Хи, опять картинка! Справитесь? (это последнее [s]невтемное[/s] демонстрационное принуждение использовать PictureCoder от меня) Как работать рассказать? Вначале в фильтре убедитесь, что все строки красные. Потом поставьте одно include на ProcessName (а если такое уже есть, то редактируйте имеющееся) – имя EXE программы (PSound.exe), не забудьте нажать ADD, а потом OK. Всё управление сводится к двум кнопкам на панели инструментов – Capture (лупа) и Clear (ластик). Если лупа зачёркнута, прога на паузе. Иначе – захват в силе (надо минимизировать это время, а то всё может зависнуть). А стиранием удобно очищать как видимое, так и память. Короче, очищаете список, включаете захват и сразу же в PSound воспроизводите трек. После чего останавливаете захват и анализируете список. Сразу же следует снять все типы данных (четыре крайние кнопки на панели инструментов), кроме мониторинга файловой системы (вторая кнопочка) Внимания заслуживают только те строки, в которых значится правильный файл. Найдите первый запрос «Read» чего-нибудь, дважды кликните и посмотрите на offset. Вот это оно и есть. Зачем? Не знаю. Но ведь что-то с этими WADовскими звуками нам делать надо? [b]Добавлено[/b] (04.09.2012, 00:36) --------------------------------------------- Я взломал ширину тайлов букв! Ух, это невероятно (аж самому не верится), но всё как бы работает: http://klimaleksus.narod2.ru/Files/JAP/width_1.jpg http://klimaleksus.narod2.ru/Files/JAP/width_2.jpg Естесьно, ширина настраивается числом. И даже высота! Но найденная «высота» – не промежуток между строчками, то есть при уменьшении пустое пространство останется, а количество строк не возрастёт. О том, как я умудрился взломать такую трудноотыскиваемую величину, я расскажу позже. Это был утомительный однообразный трёхчасовой беспросветный взлом, и когда я уже было собрался сдаваться, мне вдруг повезло. Просто повезло: http://klimaleksus.narod2.ru/Files/JAP/width_3.png Функция два-два-восемь-шесть-восемь. Я натыкался на неё очень часто, отовсюду (отталкивался от табличек, «чёрных экранов», меню…) и наконец решил исследовать. О, какое же счастье, что константы в LI даны прямо сразу! WinHex: http://klimaleksus.narod2.ru/Files/JAP/width_4.png Красное – высота. Зелёное – ширина. Светлая пара (первые) – общие, тёмная пара (последние) – специальные. Увеличивать что-либо смысла нет: http://klimaleksus.narod2.ru/Files/JAP/width_5.jpg А вот над уменьшением стоит поэкспериментировать. Почему два набора? Не знаю, но для табличек, меню и всех надписей действуют только первые цифры. А вторые работают только на слово «пауза» (ну в заголовке меню паузы, большими буквами) и больше нигде. Наверное, я плохо искал, но пока кроме заголовка они ничего не затрагивают. Эй, помните, вы сказали, что не можете найти заголовок в EXE? А я не смог найти НИГДЕ надписи «Покинуть игру?» именно с вопросительным знаком на конце, то есть надпись в последнем меню «с которой всё понятно». Игра берёт одну надпись без вопроса, потом копирует её в самый-самый конец ОЗУ и приписывает символ вопроса. Интересно, что изменить её там невозможно, поскольку она сама обновляется перед непосредственной отрисовкой. Два вывода: 1) Надеюсь, нам это не помешает; 2) Хоть бы дальше лишь этой фразы такой приём не пошёл. Вторая странность изменения ширины в том, что я менял её в ОЗУ, но при этом не на лету. Не через ArtMoney. Эмулятор, кажется, что-то кэширует или где-то промежуточно сохраняет что ли… Короче, если менять через ArtMoney, то эффекта не возымеет. Чем же орудовал я? Моим MemGet: http://klimaleksus.narod2.ru/Files/Mem.rar Останавливал эмуляцию, дампил память, изменял значение в файле, записывал дамп в ОЗУ и возобновлял эмулятор. Шаг влево, шаг вправо – RuntimeError. Зато результ есть! В финальной версии мы пропишем всё в EXE. А пока что: http://klimaleksus.narod2.ru/Files/JAP/width_6.png Загруженный дамп памяти, тот же блок данных, выделен (понятно надеюсь?). Краткое руководство к действию: – Откройте МОЙ Epsxe. Загрузите образ, запустите уровень, сохраните savestate, сверните окно через Esc. – Откройте MemGet. Все настройки оставьте по умолчанию, ничего не меняйте. – Задайте целевой файл дампа. – Загрузите его же в WinHex. – Нажмите «Применить данные» и «Чтение … ». – Перейдите в WinHex (подтвердите перечитывание), найдите смещение «22870» – то что на скриншоте. – Замените нужные вам байты (ширина – 22878, один байт). – Перейдите в MemGet и кликните «Запись … ». – Вернитесь в эмулятор и проверьте результат. – Загрузите savestate, сверните эмулятор. – Можете снова сдампить память, чтобы испытать другое число. Проверьте. Может нам и не придётся укладываться в непреодолимые рамки повсюду! А в предыдущем комментарии я забыл сказать, что нашёл странный глюк у самой Windows. Очень приколько переименовывать весомые BMP файлы, написав расширение как «.exe»…