Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also .

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also .
  • 4 commits
  • 1 file changed
  • 0 commit comments
  • 2 contributors
Commits on Sep 27, 2018
Merge pull request #68 from Guillem96/master
FS module patch clean up
Showing with 58 additions and 46 deletions.
  1. +58 −46 src/firmware.c
View
@@ -42,6 +42,59 @@ pk11_offs *pkg11_offsentify(u8 *pkg1) {
return NULL; return NULL;
} }
void patchFS(pkg2_kip1_info_t* ki) {
u8 kipHash[0x20];
print("Patching FS\n");
se_calc_sha256(&kipHash, ki->kip1, ki->size);
se_calc_sha256(&kipHash, ki->kip1, ki->size);
//Create header
size_t sizeDiff = ki->kip1->sections[0].size_decomp - ki->kip1->sections[0].size_comp;
size_t newSize = ki->size + sizeDiff;
pkg2_kip1_t *moddedKip = malloc(newSize);
memcpy(moddedKip, ki->kip1, newSize);
u32 pos = 0;
//Get decomp .text segment
u8 *kipDecompText = blz_decompress(moddedKip->data, moddedKip->sections[0].size_comp);
kippatchset_t *pset = kippatch_find_set(kipHash, kip_patches);
if (!pset) {
print(" could not find patchset with matching hash\n");
} else {
int res = kippatch_apply_set(kipDecompText, moddedKip->sections[0].size_decomp, pset);
if (res) error("kippatch_apply_set() failed\n");
}
moddedKip->flags &= ~1;
memcpy((void*)moddedKip->data, kipDecompText, moddedKip->sections[0].size_decomp);
free(kipDecompText);
pos += moddedKip->sections[0].size_comp;
moddedKip->sections[0].size_comp = moddedKip->sections[0].size_decomp;
for(int i = 1; i < KIP1_NUM_SECTIONS; i++) {
if(moddedKip->sections[i].offset != 0) {
memcpy((void*)moddedKip->data + pos + sizeDiff, (void*)ki->kip1->data + pos, moddedKip->sections[i].size_comp);
pos += moddedKip->sections[i].size_comp;
}
}
free(ki->kip1);
ki->size = newSize;
ki->kip1 = moddedKip;
}
pkg2_kip1_info_t* find_by_tid(link_t* kip_list, u64 tid) {
LIST_FOREACH_ENTRY(pkg2_kip1_info_t, ki, kip_list, link) {
if(ki->kip1->tid == 0x0100000000000000)
return ki;
}
return NULL;
}
void patch(pk11_offs *pk11, pkg2_hdr_t *pkg2, link_t *kips) { void patch(pk11_offs *pk11, pkg2_hdr_t *pkg2, link_t *kips) {
//Patch Secmon //Patch Secmon
if(!customSecmon){ if(!customSecmon){
@@ -224,53 +277,12 @@ void patch(pk11_offs *pk11, pkg2_hdr_t *pkg2, link_t *kips) {
end:; end:;
} }
u8 kipHash[0x20];
//Patch FS module (truly not my proudest code TODO cleanup) pkg2_kip1_info_t* FS_module = find_by_tid(kips, 0x0100000000000000);
LIST_FOREACH_ENTRY(pkg2_kip1_info_t, ki, kips, link) { if(FS_module == NULL) {
//Patch FS error("Could not find FS Module.\n");
if(ki->kip1->tid == 0x0100000000000000) { } else {
print("Patching FS\n"); patchFS(FS_module);
se_calc_sha256(&kipHash, ki->kip1, ki->size);
se_calc_sha256(&kipHash, ki->kip1, ki->size);
//Create header
size_t sizeDiff = ki->kip1->sections[0].size_decomp - ki->kip1->sections[0].size_comp;
size_t newSize = ki->size + sizeDiff;
pkg2_kip1_t *moddedKip = malloc(newSize);
memcpy(moddedKip, ki->kip1, newSize);
u32 pos = 0;
for(int i = 0; i < KIP1_NUM_SECTIONS; i++) {
if(!i) {
//Get decomp .text segment
u8 *kipDecompText = blz_decompress(moddedKip->data, moddedKip->sections[i].size_comp);
kippatchset_t *pset = kippatch_find_set(kipHash, kip_patches);
if (!pset) {
print(" could not find patchset with matching hash\n");
} else {
int res = kippatch_apply_set(kipDecompText, moddedKip->sections[i].size_decomp, pset);
if (res) error("kippatch_apply_set() failed\n");
}
moddedKip->flags &= ~1;
memcpy((void*)moddedKip->data, kipDecompText, moddedKip->sections[i].size_decomp);
free(kipDecompText);
pos += moddedKip->sections[i].size_comp;
moddedKip->sections[i].size_comp = moddedKip->sections[i].size_decomp;
} else {
if(moddedKip->sections[i].offset == 0) continue;
memcpy((void*)moddedKip->data + pos + sizeDiff, (void*)ki->kip1->data + pos, moddedKip->sections[i].size_comp);
pos += moddedKip->sections[i].size_comp;
}
}
free(ki->kip1);
ki->size = newSize;
ki->kip1 = moddedKip;
}
} }
} }

No commit comments for this range