PSPx форум

PSPx форум (https://www.pspx.ru/forum/index.php)
-   PSP хакинг и девелопмент (https://www.pspx.ru/forum/forumdisplay.php?f=195)
-   -   Взлом EBOOT подписи! (https://www.pspx.ru/forum/showthread.php?t=89730)

Ins|der 18.01.2011 19:09

Цитата:

Сообщение от ToTAL_SUiCiDE (Сообщение 932272)
Ins|der, ну так в принципе могли бы и оф сдк

резонно) но вроде и без него неплохо люди справляются

Ins|der добавил 18.01.2011 в 19:09
Цитата:

Сообщение от Acid_Jack (Сообщение 932290)
Но радует тот факт, что для того, чтобы запретить запуск на оф. прошивке контент, подписанный данными ключом, сони придётся менять сам кирк.

то есть убрать поддержку всех официальных приложений, подписанных им? это негуманно =)

ErikPshat 18.01.2011 20:15

А это что за лабуда?

SCEkrit.c (v1.0): Compute Sony's Private Keys
Код:

// SCEkrit.c (v1.0): Compute Sony's Private Keys
// Based on Sven's sceverify.c
// -------------------------------------------------------------
// Compile by copying to fail0verflow's ps3tools and add
// SCEkrit.c to TOOLS in the Makefile.
// Depends on libgmp; add -lgmp to LDFLAGS
// - Aaron Lindsay / @AerialX
// And thanks gbcft!

// Copyright 2010      Sven Peter <svenpeter@gmail.com>
// Licensed under the terms of the GNU GPL, version 2
// http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt

#include "tools.h"
#include "types.h"

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <gmp.h>

static int keyid = -1;

static u8 *ptr1 = NULL;
static u8 *ptr2 = NULL;

static u16 type;
typedef struct {
        u16 flags;
        u32 ****_offset;
        u64 info_offset;
        u32 app_type;
        u64 filesize;
        u64 header_len;
} fileinfo;

static fileinfo info1;
static fileinfo info2;

static struct keylist *klist = NULL;

static struct keylist *self_load_keys(fileinfo* info)
{
        enum sce_key id;

        switch (info->app_type) {
                case 1:
                        id = KEY_LV0;
                        break;
                case 2:
                        id = KEY_LV1;
                        break;
                case 3:
                        id = KEY_LV2;
                        break;
                case 4:       
                        id = KEY_APP;
                        break;
                case 5:
                        id = KEY_ISO;
                        break;
                case 6:
                        id = KEY_LDR;
                        break;
                default:
                        fail("invalid type: %08x", info->app_type);       
        }

        return keys_get(id);
}

static void read_self_header(u8* ptr, fileinfo* info)
{
        info->flags    =    be16(ptr + 0x08);
        info->****_offset = be32(ptr + 0x0c);
        info->header_len =  be64(ptr + 0x10);
        info->filesize =    be64(ptr + 0x18);
        info->info_offset = be64(ptr + 0x28);

        info->app_type =    be32(ptr + info->info_offset + 0x0c);

        klist = self_load_keys(info);
}

static void read_pkg_header(u8* ptr, fileinfo* info)
{
        info->flags    =    be16(ptr + 0x08);
        info->****_offset = be32(ptr + 0x0c);
        info->header_len =  be64(ptr + 0x10);
        info->filesize =    be64(ptr + 0x18);

        klist = keys_get(KEY_PKG);
}

static void decrypt(u8* ptr)
{
        if (keyid < 0)
                keyid = sce_decrypt_header(ptr, klist);
        else if (keyid != sce_decrypt_header(ptr, klist))
                fail("Both files must have the same key id");

        if (keyid < 0)
                fail("sce_decrypt_header failed");

        if (sce_decrypt_data(ptr) < 0)
                fail("sce_decrypt_data failed");

        if (klist->keys[keyid].pub_avail < 0)
                fail("no public key available");

        if (ecdsa_set_curve(klist->keys[keyid].ctype) < 0)
                fail("ecdsa_set_curve failed");

        ecdsa_set_pub(klist->keys[keyid].pub);
}

static void verify_signature(u8* ptr, fileinfo* info, u8* hash, u8** s, u8** r)
{
        u64 sig_len;

        sig_len = be64(ptr + info->****_offset + 0x60);
        *r = ptr + sig_len;
        *s = *r + 21;

        sha1(ptr, sig_len, hash);

        printf("Signature\n");
        if (ecdsa_verify(hash, *r, *s))
                printf("  Status: OK\n");
        else
                printf("  Status: FAIL\n");
}

static void load_num(mpz_t n, u8* un)
{
        char buffer[0x100];
        char* ptr = buffer;
        int i;
        for (i = 0; i < 21; i++) {
                sprintf(ptr, "%02x", un[i]);
                ptr += 2;
        }
        mpz_set_str(n, buffer, 16);
}

static char* calculate_private_key(u8* us1, u8* us2, u8* uz1, u8* uz2, u8* un, u8* ur)
{
        mpz_t s1, s2, z1, z2, n, r, k, dA;
        mpz_inits(s1, s2, z1, z2, n, r, k, dA, NULL);
        load_num(s1, us1); load_num(s2, us2); load_num(z1, uz1); load_num(z2, uz2); load_num(n, un); load_num(r, ur);

        mpz_sub(z2, z1, z2);
        mpz_sub(s2, s1, s2);
        mpz_invert(s2, s2, n);
        mpz_mul(k, z2, s2);
        mpz_mod(k, k, n);

        mpz_mul(s2, s1, k);
        mpz_sub(s2, s2, z1);
        mpz_invert(r, r, n);
        mpz_mul(dA, s2, r);
        mpz_mod(dA, dA, n);

//        printf("k: %s\n", mpz_get_str(NULL, 16, k));
        return mpz_get_str(NULL, 16, dA);
}

int main(int argc, char *argv[])
{
        if (argc != 3)
                fail("usage: scesekrit filename1 filename2");

        ptr1 = mmap_file(argv[1]);
        ptr2 = mmap_file(argv[2]);

        type = be16(ptr1 + 0x0a);
        if (type != be16(ptr2 + 0x0a))
                fail("Files must be the same type");
       
        if (type == 1) {
                read_self_header(ptr1, &info1);
        } else if(type == 3) {
                read_pkg_header(ptr1, &info1);
        } else
                fail("Unknown type: %d", type);

        if ((info1.flags) & 0x8000)
                fail("devkit file; nothing to verify");

        if (klist == NULL)
                fail("no key found");

        decrypt(ptr1);
       
        if (type == 1) {
                read_self_header(ptr2, &info2);
        } else if(type == 3) {
                read_pkg_header(ptr2, &info2);
        } else
                fail("Unknown type: %d", type);

        if ((info2.flags) & 0x8000)
                fail("devkit file; nothing to verify");

        if (klist == NULL)
                fail("no key found");

        decrypt(ptr2);

        u8* s1;
        u8* s2;
        u8 z1[21];
        u8 z2[21];
        u8* r1;
        u8* r2;
        u8 ec[21];
        u8 n[21];
        z1[0] = 0;
        z2[0] = 0;
       
        ecdsa_get_params(klist->keys[keyid].ctype, ec, ec, ec, n, ec, ec);

        printf("%s ", argv[1]);
        verify_signature(ptr1, &info1, z1 + 1, &s1, &r1);
        printf("%s ", argv[2]);
        verify_signature(ptr2, &info2, z2 + 1, &s2, &r2);

        if (memcmp(r1, r2, 21))
                fail("Both files must share the same r signature value.");

        const char* dA = calculate_private_key(s1, s2, z1, z2, n, r1);

        int len = strlen(dA);
        int i;
        printf("Private Key: ");
        for (i = len / 2; i < 21; i++)
                printf("00");
        printf("%s\n", dA);

        return 0;
}

Source

lex3a 18.01.2011 20:34

Цитата:

Сообщение от ErikPshat (Сообщение 932398)
А это что за лабуда?

SCEkrit.c (v1.0): Compute Sony's Private Keys
Код:

// SCEkrit.c (v1.0): Compute Sony's Private Keys
// Based on Sven's sceverify.c
// -------------------------------------------------------------
// Compile by copying to fail0verflow's ps3tools and add
// SCEkrit.c to TOOLS in the Makefile.
// Depends on libgmp; add -lgmp to LDFLAGS
// - Aaron Lindsay / @AerialX
// And thanks gbcft!

// Copyright 2010      Sven Peter <svenpeter@gmail.com>
// Licensed under the terms of the GNU GPL, version 2
// http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt

#include "tools.h"
#include "types.h"

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <gmp.h>

static int keyid = -1;

static u8 *ptr1 = NULL;
static u8 *ptr2 = NULL;

static u16 type;
typedef struct {
        u16 flags;
        u32 ****_offset;
        u64 info_offset;
        u32 app_type;
        u64 filesize;
        u64 header_len;
} fileinfo;

static fileinfo info1;
static fileinfo info2;

static struct keylist *klist = NULL;

static struct keylist *self_load_keys(fileinfo* info)
{
        enum sce_key id;

        switch (info->app_type) {
                case 1:
                        id = KEY_LV0;
                        break;
                case 2:
                        id = KEY_LV1;
                        break;
                case 3:
                        id = KEY_LV2;
                        break;
                case 4:       
                        id = KEY_APP;
                        break;
                case 5:
                        id = KEY_ISO;
                        break;
                case 6:
                        id = KEY_LDR;
                        break;
                default:
                        fail("invalid type: %08x", info->app_type);       
        }

        return keys_get(id);
}

static void read_self_header(u8* ptr, fileinfo* info)
{
        info->flags    =    be16(ptr + 0x08);
        info->****_offset = be32(ptr + 0x0c);
        info->header_len =  be64(ptr + 0x10);
        info->filesize =    be64(ptr + 0x18);
        info->info_offset = be64(ptr + 0x28);

        info->app_type =    be32(ptr + info->info_offset + 0x0c);

        klist = self_load_keys(info);
}

static void read_pkg_header(u8* ptr, fileinfo* info)
{
        info->flags    =    be16(ptr + 0x08);
        info->****_offset = be32(ptr + 0x0c);
        info->header_len =  be64(ptr + 0x10);
        info->filesize =    be64(ptr + 0x18);

        klist = keys_get(KEY_PKG);
}

static void decrypt(u8* ptr)
{
        if (keyid < 0)
                keyid = sce_decrypt_header(ptr, klist);
        else if (keyid != sce_decrypt_header(ptr, klist))
                fail("Both files must have the same key id");

        if (keyid < 0)
                fail("sce_decrypt_header failed");

        if (sce_decrypt_data(ptr) < 0)
                fail("sce_decrypt_data failed");

        if (klist->keys[keyid].pub_avail < 0)
                fail("no public key available");

        if (ecdsa_set_curve(klist->keys[keyid].ctype) < 0)
                fail("ecdsa_set_curve failed");

        ecdsa_set_pub(klist->keys[keyid].pub);
}

static void verify_signature(u8* ptr, fileinfo* info, u8* hash, u8** s, u8** r)
{
        u64 sig_len;

        sig_len = be64(ptr + info->****_offset + 0x60);
        *r = ptr + sig_len;
        *s = *r + 21;

        sha1(ptr, sig_len, hash);

        printf("Signature\n");
        if (ecdsa_verify(hash, *r, *s))
                printf("  Status: OK\n");
        else
                printf("  Status: FAIL\n");
}

static void load_num(mpz_t n, u8* un)
{
        char buffer[0x100];
        char* ptr = buffer;
        int i;
        for (i = 0; i < 21; i++) {
                sprintf(ptr, "%02x", un[i]);
                ptr += 2;
        }
        mpz_set_str(n, buffer, 16);
}

static char* calculate_private_key(u8* us1, u8* us2, u8* uz1, u8* uz2, u8* un, u8* ur)
{
        mpz_t s1, s2, z1, z2, n, r, k, dA;
        mpz_inits(s1, s2, z1, z2, n, r, k, dA, NULL);
        load_num(s1, us1); load_num(s2, us2); load_num(z1, uz1); load_num(z2, uz2); load_num(n, un); load_num(r, ur);

        mpz_sub(z2, z1, z2);
        mpz_sub(s2, s1, s2);
        mpz_invert(s2, s2, n);
        mpz_mul(k, z2, s2);
        mpz_mod(k, k, n);

        mpz_mul(s2, s1, k);
        mpz_sub(s2, s2, z1);
        mpz_invert(r, r, n);
        mpz_mul(dA, s2, r);
        mpz_mod(dA, dA, n);

//        printf("k: %s\n", mpz_get_str(NULL, 16, k));
        return mpz_get_str(NULL, 16, dA);
}

int main(int argc, char *argv[])
{
        if (argc != 3)
                fail("usage: scesekrit filename1 filename2");

        ptr1 = mmap_file(argv[1]);
        ptr2 = mmap_file(argv[2]);

        type = be16(ptr1 + 0x0a);
        if (type != be16(ptr2 + 0x0a))
                fail("Files must be the same type");
       
        if (type == 1) {
                read_self_header(ptr1, &info1);
        } else if(type == 3) {
                read_pkg_header(ptr1, &info1);
        } else
                fail("Unknown type: %d", type);

        if ((info1.flags) & 0x8000)
                fail("devkit file; nothing to verify");

        if (klist == NULL)
                fail("no key found");

        decrypt(ptr1);
       
        if (type == 1) {
                read_self_header(ptr2, &info2);
        } else if(type == 3) {
                read_pkg_header(ptr2, &info2);
        } else
                fail("Unknown type: %d", type);

        if ((info2.flags) & 0x8000)
                fail("devkit file; nothing to verify");

        if (klist == NULL)
                fail("no key found");

        decrypt(ptr2);

        u8* s1;
        u8* s2;
        u8 z1[21];
        u8 z2[21];
        u8* r1;
        u8* r2;
        u8 ec[21];
        u8 n[21];
        z1[0] = 0;
        z2[0] = 0;
       
        ecdsa_get_params(klist->keys[keyid].ctype, ec, ec, ec, n, ec, ec);

        printf("%s ", argv[1]);
        verify_signature(ptr1, &info1, z1 + 1, &s1, &r1);
        printf("%s ", argv[2]);
        verify_signature(ptr2, &info2, z2 + 1, &s2, &r2);

        if (memcmp(r1, r2, 21))
                fail("Both files must share the same r signature value.");

        const char* dA = calculate_private_key(s1, s2, z1, z2, n, r1);

        int len = strlen(dA);
        int i;
        printf("Private Key: ");
        for (i = len / 2; i < 21; i++)
                printf("00");
        printf("%s\n", dA);

        return 0;
}

Source

http://psx-scene.com/forums/f6/scekr...ny-keys-74343/

Подписывальщик PS3 приложений, точнее не совсем. Просто получает волшебный ключ, которым можно потом подписать свое приложение для PS3.

ToTAL_SUiCiDE 18.01.2011 20:43

Ins|der, возможно официальные наработки сони избавили бы от массы проблем, связаных с недопониманием различных библиотек) В любом случае это дало бы толчок в разработке, если бы они сделали все софтовое наполнение опенсорсным. Но это врятли будет;)

akela1979 18.01.2011 23:15

Zer01ne OpenIdea Team (OIP) Black Devs Team (BDT) SignMe
 
Вложений: 1
[IMG]http://img203.**************/img203/2104/signmeu.jpg[/IMG]
Only works on Windows, the application can only sign of PBP which have been compiled with the option (BUILD_PRX = 1) in the makefile "most current application.
источник

frostegater 19.01.2011 07:16

akela1979, Ни черта он не подписывает!
Zer01ne (aka Dridri85) всегда хотел быть впереди всех.
Поэтому и славился alpha/beta версиями :D

Wes64 19.01.2011 13:21

Цитата:

Сообщение от Frostegater (Сообщение 932492)
akela1979, Ни черта он не подписывает!
Zer01ne (aka Dridri85) всегда хотел быть впереди всех.
Поэтому и славился alpha/beta версиями :D

Угу она пишет твоя прога типа в такой папке а там пусто :)

ErikPshat 19.01.2011 14:06

Вот рабочая прога: carlosgs updated PSCRYPTER to v2.0 here

http://www.megaupload.com/?d=5CWJAJTE

Я сам ещё не пробовал, но вот этот список внушает доверие: http://endlessparadigm.com/forum/sho....php?tid=25707

dn3d 19.01.2011 14:50

Цитата:

Сообщение от ErikPshat (Сообщение 932604)
Вот рабочая прога: carlosgs updated PSCRYPTER to v2.0 here

http://www.megaupload.com/?d=5CWJAJTE

Я сам ещё не пробовал, но вот этот список внушает доверие: http://endlessparadigm.com/forum/sho....php?tid=25707

Я уже потестил ее... Запустил PGE Lua, PicoDrive, bookR (смог подписать, только после распаковки файла data.psp PRXdecrypter'ом)

ErikPshat 19.01.2011 14:53

Причём EBOOT.PBP шифруется прекрасно. А вот сопутствующие PRX что-то я не догнал, что с ними делать. Пытаюсь через prxEncryper прогнать, но прога не запускается с чужими PRX-ами.
А вот те Ибуты, что по одному, прекрасно запускаются на официалке.

Ну всё! Нас ждёт наводнение, всемирный потоп. Потому что PS3 идёт в параллельном направлении и даже немного опережает PSP.

Acid_Jack 19.01.2011 14:57

ErikPshat, wololo же по полочкам расписал процесс подписывания
HOW TO SIGN YOUR HOMEBREW
This assumes you have access to your homebrew’s prx. If you only have the EBOOT, you can extract the prx with pbp unpacker (data.psp == your prx)

1. if your prx has relocations type 7, run fix-relocations on it (fix-relocations mygame.prx) (if you don’t know, run that anyways, it shouldn’t hurt)
2. run PrxEncrypter on your prx (prxEncrypter mygame.prx)
3. run pack-pbp the way you usually do it in a makefile (pack-pbp EBOOT.PBP PARAM.SFO icon.png NULL pic0.png pic1.png NULL data.psp NULL )
4. That’s it

ErikPshat 19.01.2011 15:00

Acid_Jack, а теперь по русски можешь объяснить, как подписать PRX.

Acid_Jack 19.01.2011 15:03

В простом случае pbpunpack'ером извлечь из EBOOT.PBP файл DATA.PSP. Подписать DATA.PSP и упаковать его обратно в EBOOT.PBP.

dn3d 19.01.2011 15:08

Цитата:

Сообщение от Acid_Jack (Сообщение 932627)
В простом случае pbpunpack'ером извлечь из EBOOT.PBP файл DATA.PSP. Подписать DATA.PSP и упаковать его обратно в EBOOT.PBP.

А что будешь делать если кроме EBOOT.PBP у тебя в программе используется *.prx ??? при загрузке этого prx ЗЫЗа ругается)))

ErikPshat 19.01.2011 15:10

Acid_Jack, нет, я спрашиваю как PRX зашифровать, а не EBOOT.PBP.

То есть, я так понял, что ntbridge.prx переименовать в DATA.PSP, запихать в EBOOT.PBP, зашифровать, потом извлечь и опять переименовать в ntbridge.prx.

dn3d 19.01.2011 15:12

Цитата:

Сообщение от ErikPshat (Сообщение 932633)
Acid_Jack, нет, я спрашиваю как PRX зашифровать, а не EBOOT.PBP.

То есть, я так понял, что ntbridge.prx переименовать в DATA.PSP, запихать в EBOOT.PBP, зашифровать, потом извлечь и опять переименовать в ntbridge.prx.

не получится, я так уже пробовал... такая же ошибка

Acid_Jack 19.01.2011 15:12

Ух ты ж ёжик...
Если prx внешний, возможно, просто стоит обработать его prxEncrypter'ом.

ErikPshat 19.01.2011 15:13

За пару дней успеем подписать все приложения?

dn3d, вон SD6719 тоже уже успел подписать и выложить Bookr )))

Цитата:

Сообщение от Acid_Jack (Сообщение 932635)
обработать его prxEncrypter'ом

То-же ошибка. Не принимает его прога. Они видать должны быть как-то совместно подписаны или ключ к PRX-ам должен лежать в EBOOT'e.

Acid_Jack 19.01.2011 15:18

ErikPshat, и вторая версия тоже?

Yoti 19.01.2011 16:54

Вы на user mode ограничение и смену методов релокации болт положили?


Текущее время: 08:19. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
PSPx Forum - Сообщество фанатов игровых консолей.