Возраст: -- | |
Сообщений: 368 Благодарности: 15 / 9 Репутация: 9 Предупреждений: 0
Друзья Тут: 13 лет 1 месяц
Как обычно зловещая корпорация не хочет, чтобы под их консоль штамповали игры, не отчисляя ей ни копейки - тем более, основной доход идет именно с процентов от продажи игр, а приставки частенько продаются по себестоимости, или даже в убыль. Поэтому статья из журнала хакер. абсолютно легально не получится не то что написать программу - да даже ее и запустить. Слава хакерам - нашлись умельцы, давно взломавшие зловещую прошивку приставки и убравшие из нее защиту (заодно врубив эмуляцию iso-образов игр, потому что UMD-диски дороговато стоят... но я вам этого не говорил ;)). Как получить такую версию прошивки расскажет pspinfo.ru. Иди на этот сайт и перепрошивайся до 3.90 М33-3, и не забудь установить ядро 1.50 (если у тебя "толстая" версия консоли) - иначе то, что у нас получится, вполне может и не запуститься. Так что я буду считать, что ты это уже сделал, и останавливаться на этом не стану.
Также тебе понадобится карточка MemoryStick Duo. Идущая в комплекте должна вполне подойти, хотя я бы посоветовал купить хотя бы на 2 гигабайта - для программирования это очень много, но образы некоторых игр весят больше 1 Гб. Понадобится и шнур для соединения компа с приставкой (тоже есть в комплекте, а если уже потерял - что, ты не найдешь Usb-2-MiniUsb?). Еще из хардваре пригодится холодный, незамутненный разум хирурга, а то вскрытие (программное, корпус открывать не будем) может завершиться смертью или сумасшествием пациента.
Кстати, предупреждаю сразу: ни я, ни редакция, ни - тем более - Sony не дает никаких гарантий, что с приставкой все будет хорошо в результате наших анатомических исследований. Она вполне может брикнуться (так бывалые псп-геймеры называют таинственное превращение клевой приставки в черный, белый, розовый - нужное подчеркнуть кирпич), заглючить, убить твою карточку MemoryStick или, превратившись в НЛО, улететь на Луну оставлять там будоражащие кровь в жилах надписи.
Но ни у меня, ни у тех на ком я ставил свои противоестественные опыты, ничего такого не случилось. Самое страшное, что было - это зависание намертво, которое лечится обычным аварийным выключением: задержи рычажок выключения в позиции Power секунд на 6-7, пока зеленая лампочка не перестанет мигать. Теперь можешь включать.
В блокноте получается писать только на javascript'е, что для наших целей не особо подходит, поэтому придется скачать IDE и набор компиляторов. IDE я рекомендую Code::Blocks - именно для этой IDE я опишу процесс настройки, а набор компиляторов, под названием DevKitPSP. Я распаковал DevKitPSP в корень диска E:, так, что у меня теперь есть папка E:\devkitpsp\, а в ней папки bin, include и другие, и настройки буду указывать для этого пути - соответственно, если у тебя путь окажется другой, его придется везде заменять. IDE можно установить куда угодно, после чего запусти его и настрой (буду давать сведения по настройке максимально сжато потому, что их много. Утешает то, что придется сделать это один раз):
1. Settings - Compiler and Debugger, Selected Compiler: GNU GCC, жмем Copy, называем копию DevKitPSP, выбираем ее в списке компиляторов.
2. В том же окне - вкладка Search Directories - Compiler должна содержать только:
Compiler's installation directory: E:\devkitPSP C-compiler: psp-gcc.exe C++-compiler: psp-g++.exe Linker for dynamic libs: psp-g++.exe Linker for static libs: psp-ar.exe
Еще три поля там же оставляем пустыми, и жмем ОК.
4. Создаем проект: File-New-Project..., Projects, Empty. Project Title пусть будет PSPHelloWorld, указываем папку для сохранения проекта где-нибудь на компьютере; компилятор ставим DevKitPSP.
5. Cоздаем фаил File>New>File..., main.c — в мастере создания фаила выбираем язык Си и ставим галочки "Add to current project", "Debug" и "Release".
6. В созданный фаил копируем код из архива. Попозже разберемся, что он делает, а пока - донастроим проект и запустим его.
7. Project-Properties, Build targets. Снимаем галочку "Auto-generate filename extension", и правим в Output filename расширение "exe" на "elf". Выполняем тоже самое для конфигурации Release, жмем Ok.
8. Project-Build Options, Linker Options, Other linker options:
Ура! Можно жать на Build-Build и собирать проект, надеюсь - без ошибок. Так мы получим elf-файл с программой. Но эльфы "грабят корованы" в юниксах, а у нас странная ОС от PSP, готовая исполнять лишь файлы с милым русскому человеку названием EBOOT.PBP. Для выполнения сложной операции преобразования у меня есть волшебный bat-ник:
Разумеется, запускать его надо с аргументом-именем твоего elf-фаила (без расширения). Т.е., если у тебя получился HelloWorld.elf, то запускай батник как my_batnik.bat HelloWorld. Ну а если ты противник таких вещей - можешь вводить содержимое по строчке в консоль, заменяя %1 на имя того файла.
Теперь у нас есть долгожданный EBOOT, и его мы пихаем в папку /PSP/GAME150/HelloWorld/ нашей PSP-шки. После чего запускаем его, громогласно приветствуя мир. Поздравляю! Вы написали свою первую программу на PSP. Прежде чем закрывать IDE, советую сохранить проект как шаблон (File-Save Project as user-template...) - чтобы потом, при создании нового, не начинать все заново.
Как ты уже наверное понял, функция pspDebugScreenPrintf() выводит текст на экран. Она - полный аналог функции printf() и поддерживает ее форматную строку. Я начал описывать код с нее, так как это - первая функция, которой учат несчастных, изучающих Си. Вторая же изучаемая функция - обычно scanf(), но ее для PSP нет - потому что нет клавиатуры. Поэтому я просто расскажу, как получать состояние кнопок и джойстика.
За кнопки отвечает функция sceCtrlReadBufferPositive, описанная в фаиле pspctrl.h, так что добавляем в начало main.c строку:
#include
В качестве параметров функция принимает указатель на структуру SceCtrlData, в которую она возвратит данные о кнопках, и количество буферов для чтения, так что вызывать мы ее будем так:
PSP_CTRL_SCREEN = 0x400000, // только в режиме ядра
PSP_CTRL_VOLUP = 0x100000, // только в режиме ядра
PSP_CTRL_VOLDOWN = 0x200000, // только в режиме ядра
PSP_CTRL_WLAN_UP = 0x040000, // только в режиме ядра
PSP_CTRL_REMOTE = 0x080000, // только в режиме ядра
PSP_CTRL_DISC = 0x1000000, // только в режиме ядра
PSP_CTRL_MS = 0x2000000, // только в режиме ядра
};
Как использовать эти странные числа? А очень просто. Чтобы узнать, нажата ли, скажем, кнопка с кружочком, нам надо проверить (pad.Buttons & PSP_CTRL_CIRCLE). Т.е., например:
if (pad.Buttons & PSP_CTRL_CIRCLE) pspDebugScreenPrintf("CIRCLE PRESSED");
А как использовать джойстик, можно догадаться и самому. Надо только знать, что координаты его положения меняются от 0 до 255 (значит, середина - в точке (128,128)), и не забывать, что он редко стоит прямо по центру (на отклонение в несколько единиц лучше не обращать внимания, позже ты увидишь, почему). Кстати, чтобы информация о положении джойстика приходила, необходимо добавить вот такие строки:
Все. Теперь мы знаем о кнопках все, что можем. И для примера можно написать несложную программу, которая будет показывать, что в данный момент нажато. Вот что получилось у меня (я, кстати, поленился и стал мониторить только кнопки с рисунками, т.е. крестик, кружок, треугольник и квадрат. Но не думаю, что у тебя возникнут какие-то проблемы с этим):
SceCtrlData pad;
int main(int argc, char ** argv) { pspDebugScreenInit();
// устанавливаем каллбеки
SetupCallbacks();
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
// настраиваем на прием информации о положении стика
// в этой программе эта строчка никогда не выполнится ;)
return 0;
}
Все остальные функции лучше оставить такими, какие есть. Полную версию этой программы с комментарием к каждой строчке можно найти в архиве.
Итак, мы можем теперь выводить что угодно и узнавать, как на это реагирует пользователь. Самое время портировать Moria или какую-нибудь змейку :) Для полного текстового счастья не хватает, конечно же, цвета и возможности писать где угодно. Ради цвета я бы посоветовал использовать макрос, который я благополучно стырил откуда-то из хедеров к IDE:
typedef unsigned char byte; // определяем, потому что DevKitPSP понятия не имеет,
Возраст: -- | |
Сообщений: 368 Благодарности: 15 / 9 Репутация: 9 Предупреждений: 0
Друзья Тут: 13 лет 1 месяц
Существует множество сценариев, позволяющих осуществить поиск уязвимости и создание эксплоита. Например: переполнение буфера, переполнение кучи, повреждение стека, повреждение памяти…
В данной статье будет рассказано о Переполнении буфера, как наиболее простом и понятном пути атаки на программу. В частности, популярные эксплоиты, основанные на файлах сохранения игры (GripShift, Lumines, GTA LCS), являются примерами использования Переполнения буфера.
Нижеследующий пример применим к архитектуре x86, но общие принципы и методы для создание эксплоита одинаковы.
В чем особенность эксплоита, работающего на уровне ядра?
Главная особенность такого эксплоита заключаются в том, что он позволяет работать с памятью ядра. В основном, уязвимости обнаруживаются в SceIoOpen, для этого нужно дизассемблировать PRX файлы прошивки PSP. Поиск уязвимости требует много времени и терпения. Это одна из причин, почему такие уязвимости трудно найти.
Что есть Переполнение буфера?
Переполнение буфера (Buffer Overflow или Buffer Overrun) — явление, возникающее, когда компьютерная программа записывает данные за пределами выделенного в памяти буфера.
Переполнение буфера обычно возникает из-за неправильной работы с данными, полученными извне, и памятью, при отсутствии жесткой защиты со стороны подсистемы программирования (компилятор или интерпретатор) и операционной системы. В результате переполнения могут быть испорчены данные, расположенные следом за буфером (или перед ним). Для примера рассмотрим следующий код, написанный на С++:
#include #include
int copy(char *string){ char buffer[5]; strcpy(buffer, string); return 1; }
Пока ничего необычного. Сначала мы объявили подпрограмму, вызвали main(), инициализировали Строку (string) и Буфер (buffer). После этого компьютер выводит «Hello World» на экран консоли. А вот после этого начинается самое интересное – программа вызывает функцию copy(), которая копирует в буфер данные введенные пользователем с консоли. В программе используется стандартная функция библиотеки С – strcpy(), весьма ненадежная функция, которую следует избегать при программировании. Функция strcpy() копирует данные из string в buffer. Однако размер buffer составляет всего 5 байт. Но что произойдет, если передать больше 5 байт? Например, передадим 30 байт, чтобы быть уверенными, что мы перезаписали все важное в памяти. Смотрим:
scrnshot1.png (41.29 Kb) Замечательно. Как вы видите, EIP – адрес возврата был перезаписан следующими данными - 0x41414141, что в переводе из 16-ричного вида в ANSI означает «AAAA». Если подобное происходит на платформе архитектуры MIPS (к коей относится и PSP) , то вы увидите: $ra: 0x41414141. $ra – это адрес возврата для MIPS.
Отлично, а теперь вместо краха программы сделаем что-нибудь более полезное, например, заменим адрес возврата так, чтобы он указывал на функцию main(). Ищем адрес функции main() в памяти:
scrnshot2.png (30.92 Kb) Дебаггер Nemiver указывает, что функция main() расположена в 0x080488AF. Итак, перезапишем EIP таким образом, чтобы он принял значение 0x080488AF. Если все сделано правильно, то на экран «Hello World» выведется дважды.
В эксплоите MaTiAz для игры GripShift возвратный адрес указывал на ячейку сохранения игры, которая содержала неподписанный код (а отсюда и ограничение в размере).
Как видите, данные действия требуют терпеливости и усидчивости, некоторое количество мозгов и знаний, а также времени для того, чтобы превратить найденную уязвимость в эксплоит. Далеко не все уязвимости так хороши для атаки, как та, что приведена в примере. Уязвимость приобретает ценность, если она способна нести полезную нагрузку – исполняемый код. Потому всякого рода вопли вокруг файлов сохранений различных игр вызывают смех. Зависание PSP не означает наличие эксплоита.
Для более подробного ознакомления советую посетить: //en.wikipedia.org/wiki/Buffer_overrun //ru.wikipedia.org/wiki/Переполнение_буфера
Также в следующей статье будет рассказано более подробно о конкретном примере для PSP, на основе статьи Wololo. Если вам не терпится попробовать свои силы самостоятельно, то скачайте и установите следующие плагины и программы:
Теперь вы можете сделать незашифрованное сохранение к игре, найти в нем строки, содержащие имя персонажа (то, что вы вводите сами в игре), попробовать его перезаписать длинной строкой. Если игра обращается к данной строке, и не имеет защиты, то она или зависнет, или вылетит. Если это произойдет, переходите к следующему шагу – анализ краха игры с помощью PSPLink. Помните, что далеко не каждая уязвимость имеет ценность, но, возможно, вы найдете что-нибудь полезное. Продолжение следует...
Возраст: -- | |
Сообщений: 368 Благодарности: 15 / 9 Репутация: 9 Предупреждений: 0
Друзья Тут: 13 лет 1 месяц
у нас на данный момент очень мало эксплоитов для 6.37. ищите и выкладывайте эксплоиты. пока на данный момент у нас есть только один рабочий эксплоит на 6.37. помогайте и только тогда мы сможем сделать хен для 6.37.
Возраст: -- | |
Сообщений: 368 Благодарности: 15 / 9 Репутация: 9 Предупреждений: 0
Друзья Тут: 13 лет 1 месяц
почему нельзя сделать пиратские диски для psp? если бы мы все написали письмо в компанию datel они бы начали выпускать такие диски? представьте самому записывать на диски игры для пихи!
Возраст: -- | |
Сообщений: 368 Благодарности: 15 / 9 Репутация: 9 Предупреждений: 0
Друзья Тут: 13 лет 1 месяц
сейчас я просто вселил в вас надежде, покаав вам это видео. никого пока не дергайте больше начсет хена. он будет готов . подождите еще чуть-чуть. и больще никого ни о чем н не спрашивайте. просто ждите :)
"" and "PlayStation" are registered trademarks of Sony Computer Entertainment Inc. "", PSP and "UMD" are trademarks of Sony Computer Entertainment Inc. "", "XMB", "Memory Stick Duo" and the "Memory Stick Duo" logotype are trademarks of Sony Corp. All product titles, publisher names, trademarks, artwork and associated imagery are trademarks, registered trademarks and/or copyright material of the respective owners. All rights reserved.