mirror of
https://github.com/CTCaer/hekate.git
synced 2024-11-22 18:06:40 +00:00
hos: pkg2: rename ini1 value offset
And simplify the logic a bit.
This commit is contained in:
parent
d1be18821d
commit
c828539544
5 changed files with 45 additions and 66 deletions
|
@ -34,7 +34,7 @@
|
||||||
extern hekate_config h_cfg;
|
extern hekate_config h_cfg;
|
||||||
extern const u8 package2_keyseed[];
|
extern const u8 package2_keyseed[];
|
||||||
|
|
||||||
u32 pkg2_newkern_ini1_val;
|
u32 pkg2_newkern_ini1_info;
|
||||||
u32 pkg2_newkern_ini1_start;
|
u32 pkg2_newkern_ini1_start;
|
||||||
u32 pkg2_newkern_ini1_end;
|
u32 pkg2_newkern_ini1_end;
|
||||||
|
|
||||||
|
@ -190,7 +190,7 @@ static u32 _pkg2_calc_kip1_size(pkg2_kip1_t *kip1)
|
||||||
|
|
||||||
void pkg2_get_newkern_info(u8 *kern_data)
|
void pkg2_get_newkern_info(u8 *kern_data)
|
||||||
{
|
{
|
||||||
u32 pkg2_newkern_ini1_off = 0;
|
pkg2_newkern_ini1_info = 0;
|
||||||
pkg2_newkern_ini1_start = 0;
|
pkg2_newkern_ini1_start = 0;
|
||||||
|
|
||||||
// Find static OP offset that is close to INI1 offset.
|
// Find static OP offset that is close to INI1 offset.
|
||||||
|
@ -199,7 +199,7 @@ void pkg2_get_newkern_info(u8 *kern_data)
|
||||||
{
|
{
|
||||||
if (*(u32 *)(kern_data + 0x100 - counter_ops) == PKG2_NEWKERN_GET_INI1_HEURISTIC)
|
if (*(u32 *)(kern_data + 0x100 - counter_ops) == PKG2_NEWKERN_GET_INI1_HEURISTIC)
|
||||||
{
|
{
|
||||||
pkg2_newkern_ini1_off = 0x100 - counter_ops + 12; // OP found. Add 12 for the INI1 offset.
|
pkg2_newkern_ini1_info = 0x100 - counter_ops + 12; // OP found. Add 12 for the INI1 offset.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,11 +210,11 @@ void pkg2_get_newkern_info(u8 *kern_data)
|
||||||
if (!counter_ops)
|
if (!counter_ops)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
u32 info_op = *(u32 *)(kern_data + pkg2_newkern_ini1_off);
|
u32 info_op = *(u32 *)(kern_data + pkg2_newkern_ini1_info);
|
||||||
pkg2_newkern_ini1_val = ((info_op & 0xFFFF) >> 3) + pkg2_newkern_ini1_off; // Parse ADR and PC.
|
pkg2_newkern_ini1_info += ((info_op & 0xFFFF) >> 3); // Parse ADR and PC.
|
||||||
|
|
||||||
pkg2_newkern_ini1_start = *(u32 *)(kern_data + pkg2_newkern_ini1_val);
|
pkg2_newkern_ini1_start = *(u32 *)(kern_data + pkg2_newkern_ini1_info);
|
||||||
pkg2_newkern_ini1_end = *(u32 *)(kern_data + pkg2_newkern_ini1_val + 0x8);
|
pkg2_newkern_ini1_end = *(u32 *)(kern_data + pkg2_newkern_ini1_info + 0x8);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pkg2_parse_kips(link_t *info, pkg2_hdr_t *pkg2, bool *new_pkg2)
|
bool pkg2_parse_kips(link_t *info, pkg2_hdr_t *pkg2, bool *new_pkg2)
|
||||||
|
@ -790,7 +790,7 @@ DPRINTF("%s @ %08X (%08X)\n", is_meso ? "Mesosphere": "kernel",(u32)ctxt->kernel
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Set new INI1 offset to kernel.
|
// Set new INI1 offset to kernel.
|
||||||
*(u32 *)(pdst + (is_meso ? 8 : pkg2_newkern_ini1_val)) = kernel_size;
|
*(u32 *)(pdst + (is_meso ? 8 : pkg2_newkern_ini1_info)) = kernel_size;
|
||||||
|
|
||||||
// Build INI1 for new Package2.
|
// Build INI1 for new Package2.
|
||||||
kernel_size += _pkg2_ini1_build(pdst + kernel_size, hdr, kips_info, ctxt->new_pkg2);
|
kernel_size += _pkg2_ini1_build(pdst + kernel_size, hdr, kips_info, ctxt->new_pkg2);
|
||||||
|
|
|
@ -28,12 +28,13 @@
|
||||||
#define INI1_MAGIC 0x31494E49
|
#define INI1_MAGIC 0x31494E49
|
||||||
|
|
||||||
//! TODO: Update on kernel change if needed.
|
//! TODO: Update on kernel change if needed.
|
||||||
#define PKG2_NEWKERN_GET_INI1_HEURISTIC 0xD2800015 // Offset of OP + 12 is the INI1 offset.
|
// Offset of OP + 12 is the INI1 offset. On v2 with dynamic crt0 it's + 16.
|
||||||
|
#define PKG2_NEWKERN_GET_INI1_HEURISTIC 0xD2800015
|
||||||
#define PKG2_NEWKERN_START 0x800
|
#define PKG2_NEWKERN_START 0x800
|
||||||
|
|
||||||
#define ATM_MESOSPHERE 0x3053534D
|
#define ATM_MESOSPHERE 0x3053534D
|
||||||
|
|
||||||
extern u32 pkg2_newkern_ini1_val;
|
extern u32 pkg2_newkern_ini1_info;
|
||||||
extern u32 pkg2_newkern_ini1_start;
|
extern u32 pkg2_newkern_ini1_start;
|
||||||
extern u32 pkg2_newkern_ini1_end;
|
extern u32 pkg2_newkern_ini1_end;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
|
* Copyright (c) 2022-2023 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -27,17 +28,28 @@
|
||||||
|
|
||||||
typedef struct _bl_hdr_t210b01_t
|
typedef struct _bl_hdr_t210b01_t
|
||||||
{
|
{
|
||||||
u8 aes_mac[0x10];
|
/* 0x000 */ u8 aes_mac[0x10];
|
||||||
u8 rsa_sig[0x100];
|
/* 0x010 */ u8 rsa_sig[0x100];
|
||||||
u8 salt[0x20];
|
/* 0x110 */ u8 salt[0x20];
|
||||||
u8 sha256[0x20];
|
/* 0x130 */ u8 sha256[0x20];
|
||||||
u32 version;
|
/* 0x150 */ u32 version;
|
||||||
u32 size;
|
/* 0x154 */ u32 size;
|
||||||
u32 load_addr;
|
/* 0x158 */ u32 load_addr;
|
||||||
u32 entrypoint;
|
/* 0x15C */ u32 entrypoint;
|
||||||
u8 rsvd[0x10];
|
/* 0x160 */ u8 rsvd[0x10];
|
||||||
} bl_hdr_t210b01_t;
|
} bl_hdr_t210b01_t;
|
||||||
|
|
||||||
|
typedef struct _pk1_hdr_t
|
||||||
|
{
|
||||||
|
/* 0x00 */ u32 si_sha256; // Secure Init.
|
||||||
|
/* 0x04 */ u32 sm_sha256; // Secure Monitor.
|
||||||
|
/* 0x08 */ u32 sl_sha256; // Secure Loader.
|
||||||
|
/* 0x0C */ u32 unk; // what's this? It's not warmboot.
|
||||||
|
/* 0x10 */ char timestamp[14];
|
||||||
|
/* 0x1E */ u8 keygen;
|
||||||
|
/* 0x1F */ u8 version;
|
||||||
|
} pk1_hdr_t;
|
||||||
|
|
||||||
typedef struct _pkg1_id_t
|
typedef struct _pkg1_id_t
|
||||||
{
|
{
|
||||||
const char *id;
|
const char *id;
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
extern hekate_config h_cfg;
|
extern hekate_config h_cfg;
|
||||||
extern const u8 package2_keyseed[];
|
extern const u8 package2_keyseed[];
|
||||||
|
|
||||||
u32 pkg2_newkern_ini1_val;
|
|
||||||
u32 pkg2_newkern_ini1_start;
|
u32 pkg2_newkern_ini1_start;
|
||||||
u32 pkg2_newkern_ini1_end;
|
u32 pkg2_newkern_ini1_end;
|
||||||
|
|
||||||
|
@ -47,8 +46,8 @@ u32 pkg2_calc_kip1_size(pkg2_kip1_t *kip1)
|
||||||
|
|
||||||
void pkg2_get_newkern_info(u8 *kern_data)
|
void pkg2_get_newkern_info(u8 *kern_data)
|
||||||
{
|
{
|
||||||
u32 pkg2_newkern_ini1_off = 0;
|
u32 pkg2_newkern_ini1_info = 0;
|
||||||
pkg2_newkern_ini1_start = 0;
|
pkg2_newkern_ini1_start = 0;
|
||||||
|
|
||||||
// Find static OP offset that is close to INI1 offset.
|
// Find static OP offset that is close to INI1 offset.
|
||||||
u32 counter_ops = 0x100;
|
u32 counter_ops = 0x100;
|
||||||
|
@ -56,7 +55,7 @@ void pkg2_get_newkern_info(u8 *kern_data)
|
||||||
{
|
{
|
||||||
if (*(u32 *)(kern_data + 0x100 - counter_ops) == PKG2_NEWKERN_GET_INI1_HEURISTIC)
|
if (*(u32 *)(kern_data + 0x100 - counter_ops) == PKG2_NEWKERN_GET_INI1_HEURISTIC)
|
||||||
{
|
{
|
||||||
pkg2_newkern_ini1_off = 0x100 - counter_ops + 12; // OP found. Add 12 for the INI1 offset.
|
pkg2_newkern_ini1_info = 0x100 - counter_ops + 12; // OP found. Add 12 for the INI1 offset.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,45 +66,11 @@ void pkg2_get_newkern_info(u8 *kern_data)
|
||||||
if (!counter_ops)
|
if (!counter_ops)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
u32 info_op = *(u32 *)(kern_data + pkg2_newkern_ini1_off);
|
u32 info_op = *(u32 *)(kern_data + pkg2_newkern_ini1_info);
|
||||||
pkg2_newkern_ini1_val = ((info_op & 0xFFFF) >> 3) + pkg2_newkern_ini1_off; // Parse ADR and PC.
|
pkg2_newkern_ini1_info += ((info_op & 0xFFFF) >> 3); // Parse ADR and PC.
|
||||||
|
|
||||||
pkg2_newkern_ini1_start = *(u32 *)(kern_data + pkg2_newkern_ini1_val);
|
pkg2_newkern_ini1_start = *(u32 *)(kern_data + pkg2_newkern_ini1_info);
|
||||||
pkg2_newkern_ini1_end = *(u32 *)(kern_data + pkg2_newkern_ini1_val + 0x8);
|
pkg2_newkern_ini1_end = *(u32 *)(kern_data + pkg2_newkern_ini1_info + 0x8);
|
||||||
}
|
|
||||||
|
|
||||||
bool pkg2_parse_kips(link_t *info, pkg2_hdr_t *pkg2, bool *new_pkg2)
|
|
||||||
{
|
|
||||||
u8 *ptr;
|
|
||||||
// Check for new pkg2 type.
|
|
||||||
if (!pkg2->sec_size[PKG2_SEC_INI1])
|
|
||||||
{
|
|
||||||
pkg2_get_newkern_info(pkg2->data);
|
|
||||||
|
|
||||||
if (!pkg2_newkern_ini1_start)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
ptr = pkg2->data + pkg2_newkern_ini1_start;
|
|
||||||
*new_pkg2 = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ptr = pkg2->data + pkg2->sec_size[PKG2_SEC_KERNEL];
|
|
||||||
|
|
||||||
pkg2_ini1_t *ini1 = (pkg2_ini1_t *)ptr;
|
|
||||||
ptr += sizeof(pkg2_ini1_t);
|
|
||||||
|
|
||||||
for (u32 i = 0; i < ini1->num_procs; i++)
|
|
||||||
{
|
|
||||||
pkg2_kip1_t *kip1 = (pkg2_kip1_t *)ptr;
|
|
||||||
pkg2_kip1_info_t *ki = (pkg2_kip1_info_t *)malloc(sizeof(pkg2_kip1_info_t));
|
|
||||||
ki->kip1 = kip1;
|
|
||||||
ki->size = pkg2_calc_kip1_size(kip1);
|
|
||||||
list_append(info, &ki->link);
|
|
||||||
ptr += ki->size;
|
|
||||||
DPRINTF(" kip1 %d:%s @ %08X (%08X)\n", i, kip1->name, (u32)kip1, ki->size);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//!TODO: Update on mkey changes.
|
//!TODO: Update on mkey changes.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2020 CTCaer
|
* Copyright (c) 2018-2023 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -26,10 +26,12 @@
|
||||||
#define PKG2_SEC_INI1 1
|
#define PKG2_SEC_INI1 1
|
||||||
|
|
||||||
#define INI1_MAGIC 0x31494E49
|
#define INI1_MAGIC 0x31494E49
|
||||||
#define PKG2_NEWKERN_GET_INI1_HEURISTIC 0xD2800015 // Offset of OP + 12 is the INI1 offset.
|
|
||||||
|
//! TODO: Update on kernel change if needed.
|
||||||
|
// Offset of OP + 12 is the INI1 offset. On v2 with dynamic crt0 it's + 16.
|
||||||
|
#define PKG2_NEWKERN_GET_INI1_HEURISTIC 0xD2800015
|
||||||
#define PKG2_NEWKERN_START 0x800
|
#define PKG2_NEWKERN_START 0x800
|
||||||
|
|
||||||
extern u32 pkg2_newkern_ini1_val;
|
|
||||||
extern u32 pkg2_newkern_ini1_start;
|
extern u32 pkg2_newkern_ini1_start;
|
||||||
extern u32 pkg2_newkern_ini1_end;
|
extern u32 pkg2_newkern_ini1_end;
|
||||||
|
|
||||||
|
@ -90,8 +92,7 @@ typedef struct _pkg2_kip1_info_t
|
||||||
} pkg2_kip1_info_t;
|
} pkg2_kip1_info_t;
|
||||||
|
|
||||||
void pkg2_get_newkern_info(u8 *kern_data);
|
void pkg2_get_newkern_info(u8 *kern_data);
|
||||||
u32 pkg2_calc_kip1_size(pkg2_kip1_t *kip1);
|
u32 pkg2_calc_kip1_size(pkg2_kip1_t *kip1);
|
||||||
bool pkg2_parse_kips(link_t *info, pkg2_hdr_t *pkg2, bool *new_pkg2);
|
|
||||||
|
|
||||||
pkg2_hdr_t *pkg2_decrypt(void *data, u8 kb);
|
pkg2_hdr_t *pkg2_decrypt(void *data, u8 kb);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue