mirror of
https://github.com/CTCaer/hekate.git
synced 2024-11-26 19:52:11 +00:00
hos: Use a new method to get kernel/ini1 offsets
This commit is contained in:
parent
5f142b4c86
commit
3d9c64d548
8 changed files with 87 additions and 16 deletions
|
@ -223,9 +223,17 @@ void dump_packages12()
|
||||||
ini1_off = pkg2_newkern_ini1_start;
|
ini1_off = pkg2_newkern_ini1_start;
|
||||||
ini1_size = pkg2_newkern_ini1_end - pkg2_newkern_ini1_start;
|
ini1_size = pkg2_newkern_ini1_end - pkg2_newkern_ini1_start;
|
||||||
}
|
}
|
||||||
if (sd_save_to_file(pkg2_hdr->data + ini1_off, ini1_size, path))
|
if (ini1_off)
|
||||||
|
{
|
||||||
|
if (sd_save_to_file(pkg2_hdr->data + ini1_off, ini1_size, path))
|
||||||
|
goto out;
|
||||||
|
gfx_puts("INI1 dumped to ini1.bin\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gfx_puts("Failed to dump INI1!\n");
|
||||||
goto out;
|
goto out;
|
||||||
gfx_puts("INI1 dumped to ini1.bin\n");
|
}
|
||||||
|
|
||||||
gfx_puts("\nDone. Press any key...\n");
|
gfx_puts("\nDone. Press any key...\n");
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,8 @@ extern bool is_ipl_updated(void *buf, char *path, bool force);
|
||||||
#define CNT_TYPE_KIP 6
|
#define CNT_TYPE_KIP 6
|
||||||
#define CNT_TYPE_BMP 7
|
#define CNT_TYPE_BMP 7
|
||||||
#define CNT_TYPE_EMC 8
|
#define CNT_TYPE_EMC 8
|
||||||
|
#define CNT_TYPE_KLD 9
|
||||||
|
#define CNT_TYPE_KRN 10
|
||||||
|
|
||||||
#define CNT_FLAG0_EXPERIMENTAL (1 << 0)
|
#define CNT_FLAG0_EXPERIMENTAL (1 << 0)
|
||||||
|
|
||||||
|
|
|
@ -581,7 +581,11 @@ int hos_launch(ini_sec_t *cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
LIST_INIT(kip1_info);
|
LIST_INIT(kip1_info);
|
||||||
pkg2_parse_kips(&kip1_info, pkg2_hdr, &ctxt.new_pkg2);
|
if (!pkg2_parse_kips(&kip1_info, pkg2_hdr, &ctxt.new_pkg2))
|
||||||
|
{
|
||||||
|
_hos_crit_error("INI1 parsing failed!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
gfx_printf("Parsed ini1\n");
|
gfx_printf("Parsed ini1\n");
|
||||||
|
|
||||||
|
|
|
@ -692,14 +692,34 @@ 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 info_op = *(u32 *)(kern_data + PKG2_NEWKERN_GET_INI1);
|
u32 pkg2_newkern_ini1_off = 0;
|
||||||
pkg2_newkern_ini1_val = ((info_op & 0xFFFF) >> 3) + PKG2_NEWKERN_GET_INI1; // Parse ADR and PC.
|
pkg2_newkern_ini1_start = 0;
|
||||||
|
|
||||||
|
// Find static OP offset that is close to INI1 offset.
|
||||||
|
u32 counter_ops = 0x100;
|
||||||
|
while (counter_ops)
|
||||||
|
{
|
||||||
|
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.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
counter_ops -= 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Offset not found?
|
||||||
|
if (!counter_ops)
|
||||||
|
return;
|
||||||
|
|
||||||
|
u32 info_op = *(u32 *)(kern_data + pkg2_newkern_ini1_off);
|
||||||
|
pkg2_newkern_ini1_val = ((info_op & 0xFFFF) >> 3) + pkg2_newkern_ini1_off; // 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_val);
|
||||||
pkg2_newkern_ini1_end = *(u32 *)(kern_data + pkg2_newkern_ini1_val + 0x8);
|
pkg2_newkern_ini1_end = *(u32 *)(kern_data + pkg2_newkern_ini1_val + 0x8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void 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)
|
||||||
{
|
{
|
||||||
u8 *ptr;
|
u8 *ptr;
|
||||||
// Check for new pkg2 type.
|
// Check for new pkg2 type.
|
||||||
|
@ -707,6 +727,9 @@ void pkg2_parse_kips(link_t *info, pkg2_hdr_t *pkg2, bool *new_pkg2)
|
||||||
{
|
{
|
||||||
pkg2_get_newkern_info(pkg2->data);
|
pkg2_get_newkern_info(pkg2->data);
|
||||||
|
|
||||||
|
if (!pkg2_newkern_ini1_start)
|
||||||
|
return false;
|
||||||
|
|
||||||
ptr = pkg2->data + pkg2_newkern_ini1_start;
|
ptr = pkg2->data + pkg2_newkern_ini1_start;
|
||||||
*new_pkg2 = true;
|
*new_pkg2 = true;
|
||||||
}
|
}
|
||||||
|
@ -726,6 +749,8 @@ void pkg2_parse_kips(link_t *info, pkg2_hdr_t *pkg2, bool *new_pkg2)
|
||||||
ptr += ki->size;
|
ptr += ki->size;
|
||||||
DPRINTF(" kip1 %d:%s @ %08X (%08X)\n", i, kip1->name, (u32)kip1, ki->size);
|
DPRINTF(" kip1 %d:%s @ %08X (%08X)\n", i, kip1->name, (u32)kip1, ki->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pkg2_has_kip(link_t *info, u64 tid)
|
int pkg2_has_kip(link_t *info, u64 tid)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2019 CTCaer
|
* Copyright (c) 2018-2020 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,7 +27,7 @@
|
||||||
#define PKG2_SEC_INI1 1
|
#define PKG2_SEC_INI1 1
|
||||||
|
|
||||||
#define INI1_MAGIC 0x31494E49
|
#define INI1_MAGIC 0x31494E49
|
||||||
#define PKG2_NEWKERN_GET_INI1 0x44
|
#define PKG2_NEWKERN_GET_INI1_HEURISTIC 0xD2800015 // Offset of OP + 12 is the INI1 offset.
|
||||||
#define PKG2_NEWKERN_START 0x800
|
#define PKG2_NEWKERN_START 0x800
|
||||||
|
|
||||||
u32 pkg2_newkern_ini1_val;
|
u32 pkg2_newkern_ini1_val;
|
||||||
|
@ -144,7 +144,7 @@ typedef struct _kip1_id_t
|
||||||
} kip1_id_t;
|
} kip1_id_t;
|
||||||
|
|
||||||
void pkg2_get_newkern_info(u8 *kern_data);
|
void pkg2_get_newkern_info(u8 *kern_data);
|
||||||
void 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);
|
||||||
int pkg2_has_kip(link_t *info, u64 tid);
|
int pkg2_has_kip(link_t *info, u64 tid);
|
||||||
void pkg2_replace_kip(link_t *info, u64 tid, pkg2_kip1_t *kip1);
|
void pkg2_replace_kip(link_t *info, u64 tid, pkg2_kip1_t *kip1);
|
||||||
void pkg2_add_kip(link_t *info, pkg2_kip1_t *kip1);
|
void pkg2_add_kip(link_t *info, pkg2_kip1_t *kip1);
|
||||||
|
|
|
@ -549,6 +549,13 @@ static lv_res_t _create_window_dump_pk12_tool(lv_obj_t *btn)
|
||||||
ini1_off = pkg2_newkern_ini1_start;
|
ini1_off = pkg2_newkern_ini1_start;
|
||||||
ini1_size = pkg2_newkern_ini1_end - pkg2_newkern_ini1_start;
|
ini1_size = pkg2_newkern_ini1_end - pkg2_newkern_ini1_start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ini1_off)
|
||||||
|
{
|
||||||
|
s_printf(txt_buf + strlen(txt_buf), "#FFDD00 Failed to dump INI1 and kips!#\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
pkg2_ini1_t *ini1 = (pkg2_ini1_t *)(pkg2_hdr->data + ini1_off);
|
pkg2_ini1_t *ini1 = (pkg2_ini1_t *)(pkg2_hdr->data + ini1_off);
|
||||||
emmcsn_path_impl(path, "/pkg2", "ini1.bin", &storage);
|
emmcsn_path_impl(path, "/pkg2", "ini1.bin", &storage);
|
||||||
if (sd_save_to_file(ini1, ini1_size, path))
|
if (sd_save_to_file(ini1, ini1_size, path))
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2019 CTCaer
|
* Copyright (c) 2018-2020 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,
|
||||||
|
@ -45,14 +45,34 @@ 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 info_op = *(u32 *)(kern_data + PKG2_NEWKERN_GET_INI1);
|
u32 pkg2_newkern_ini1_off = 0;
|
||||||
pkg2_newkern_ini1_val = ((info_op & 0xFFFF) >> 3) + PKG2_NEWKERN_GET_INI1; // Parse ADR and PC.
|
pkg2_newkern_ini1_start = 0;
|
||||||
|
|
||||||
|
// Find static OP offset that is close to INI1 offset.
|
||||||
|
u32 counter_ops = 0x100;
|
||||||
|
while (counter_ops)
|
||||||
|
{
|
||||||
|
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.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
counter_ops -= 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Offset not found?
|
||||||
|
if (!counter_ops)
|
||||||
|
return;
|
||||||
|
|
||||||
|
u32 info_op = *(u32 *)(kern_data + pkg2_newkern_ini1_off);
|
||||||
|
pkg2_newkern_ini1_val = ((info_op & 0xFFFF) >> 3) + pkg2_newkern_ini1_off; // 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_val);
|
||||||
pkg2_newkern_ini1_end = *(u32 *)(kern_data + pkg2_newkern_ini1_val + 0x8);
|
pkg2_newkern_ini1_end = *(u32 *)(kern_data + pkg2_newkern_ini1_val + 0x8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void 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)
|
||||||
{
|
{
|
||||||
u8 *ptr;
|
u8 *ptr;
|
||||||
// Check for new pkg2 type.
|
// Check for new pkg2 type.
|
||||||
|
@ -60,6 +80,9 @@ void pkg2_parse_kips(link_t *info, pkg2_hdr_t *pkg2, bool *new_pkg2)
|
||||||
{
|
{
|
||||||
pkg2_get_newkern_info(pkg2->data);
|
pkg2_get_newkern_info(pkg2->data);
|
||||||
|
|
||||||
|
if (!pkg2_newkern_ini1_start)
|
||||||
|
return false;
|
||||||
|
|
||||||
ptr = pkg2->data + pkg2_newkern_ini1_start;
|
ptr = pkg2->data + pkg2_newkern_ini1_start;
|
||||||
*new_pkg2 = true;
|
*new_pkg2 = true;
|
||||||
}
|
}
|
||||||
|
@ -79,6 +102,8 @@ void pkg2_parse_kips(link_t *info, pkg2_hdr_t *pkg2, bool *new_pkg2)
|
||||||
ptr += ki->size;
|
ptr += ki->size;
|
||||||
DPRINTF(" kip1 %d:%s @ %08X (%08X)\n", i, kip1->name, (u32)kip1, ki->size);
|
DPRINTF(" kip1 %d:%s @ %08X (%08X)\n", i, kip1->name, (u32)kip1, ki->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const u8 mkey_keyseed_8xx[][0x10] =
|
static const u8 mkey_keyseed_8xx[][0x10] =
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2019 CTCaer
|
* Copyright (c) 2018-2020 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,7 +27,7 @@
|
||||||
#define PKG2_SEC_INI1 1
|
#define PKG2_SEC_INI1 1
|
||||||
|
|
||||||
#define INI1_MAGIC 0x31494E49
|
#define INI1_MAGIC 0x31494E49
|
||||||
#define PKG2_NEWKERN_GET_INI1 0x44
|
#define PKG2_NEWKERN_GET_INI1_HEURISTIC 0xD2800015 // Offset of OP + 12 is the INI1 offset.
|
||||||
#define PKG2_NEWKERN_START 0x800
|
#define PKG2_NEWKERN_START 0x800
|
||||||
|
|
||||||
u32 pkg2_newkern_ini1_val;
|
u32 pkg2_newkern_ini1_val;
|
||||||
|
@ -91,7 +91,7 @@ typedef struct _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);
|
||||||
void 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);
|
||||||
|
|
||||||
pkg2_hdr_t *pkg2_decrypt(void *data, u8 kb);
|
pkg2_hdr_t *pkg2_decrypt(void *data, u8 kb);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue