From e5bb42387fa4e080aadbf134d47207a194f4773c Mon Sep 17 00:00:00 2001 From: Sorvigolova Date: Sun, 25 Mar 2018 18:13:30 +0400 Subject: [PATCH] Header parser fix Minor update --- Release/scetool.exe | Bin 256512 -> 258048 bytes src/sce.cpp | 12 +++--- src/sce.h | 18 ++++---- src/sce_inlines.h | 8 ++-- src/self.cpp | 97 +++++++++++++++++++++++++++++++++----------- 5 files changed, 93 insertions(+), 42 deletions(-) diff --git a/Release/scetool.exe b/Release/scetool.exe index 4c6363a1e1dd0cebe2c5f19a818cabb88c633569..328c6b90fcb6d73a70226c40dc1395b03739e984 100644 GIT binary patch delta 34565 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

nCgULXRxH;0p2v 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 z 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.ai = (app_info_t *)(res->scebuffer + _ES64(res->self.selfh->app_info_offset)); //Section infos. - if (_ES64(res->self.selfh->section_info_offset) != NULL) + if (_ES64(res->self.selfh->segment_info_offset) != NULL) { - res->self.si = (section_info_t *)(res->scebuffer + _ES64(res->self.selfh->section_info_offset)); + res->self.si = (segment_info_t *)(res->scebuffer + _ES64(res->self.selfh->segment_info_offset)); } else res->self.si = 0; @@ -376,7 +376,7 @@ void sce_compress_data(sce_buffer_ctxt_t *ctxt) //Set compression in section info. if(_ES16(ctxt->cfh->category) == CF_CATEGORY_SELF && i < ctxt->makeself->si_sec_cnt) { - ctxt->self.si[i].compressed = SECTION_INFO_COMPRESSED; + ctxt->self.si[i].compressed = SEGMENT_INFO_COMPRESSED; //Update size too. ctxt->self.si[i].size = size_comp; } @@ -470,7 +470,7 @@ void _sce_fixup_ctxt(sce_buffer_ctxt_t *ctxt) ctxt->self.selfh->app_info_offset = _ES64(ctxt->off_self.off_ai); ctxt->self.selfh->elf_offset = _ES64(ctxt->off_self.off_ehdr); ctxt->self.selfh->phdr_offset = _ES64(ctxt->off_self.off_phdr); - ctxt->self.selfh->section_info_offset = _ES64(ctxt->off_self.off_si); + ctxt->self.selfh->segment_info_offset = _ES64(ctxt->off_self.off_si); ctxt->self.selfh->sce_version_offset = _ES64(ctxt->off_self.off_sv); ctxt->self.selfh->control_info_offset = _ES64(ctxt->off_self.off_cis); ctxt->self.selfh->control_info_size = _ES64(_sce_get_ci_len(ctxt)); @@ -557,7 +557,7 @@ void sce_layout_ctxt(sce_buffer_ctxt_t *ctxt) //ELF Program headers. ctxt->off_self.off_phdr = _INC_OFF_SIZE(coff, ctxt->makeself->phsize); //Section info. - ctxt->off_self.off_si = _INC_OFF_SIZE(coff, sizeof(section_info_t) * ctxt->makeself->si_cnt); + ctxt->off_self.off_si = _INC_OFF_SIZE(coff, sizeof(segment_info_t) * ctxt->makeself->si_cnt); //SCE version. ctxt->off_self.off_sv = _INC_OFF_TYPE(coff, sce_version_t); //Control infos. @@ -637,7 +637,7 @@ static void _sce_build_header(sce_buffer_ctxt_t *ctxt) //Section info. u32 i; for(i = 0; i < ctxt->makeself->si_cnt; i++) - _copy_es_section_info((section_info_t *)(ctxt->scebuffer + ctxt->off_self.off_si + sizeof(section_info_t) * i), &ctxt->self.si[i]); + _copy_es_segment_info((segment_info_t *)(ctxt->scebuffer + ctxt->off_self.off_si + sizeof(segment_info_t) * i), &ctxt->self.si[i]); //SCE version. memcpy((sce_version_t *)(ctxt->scebuffer + ctxt->off_self.off_sv), ctxt->self.sv, sizeof(sce_version_t)); diff --git a/src/sce.h b/src/sce.h index be07cf0..1528b6c 100644 --- a/src/sce.h +++ b/src/sce.h @@ -118,9 +118,9 @@ #define SIGNATURE_R_SIZE 21 /*! Compressed. */ -#define SECTION_INFO_COMPRESSED 2 +#define SEGMENT_INFO_COMPRESSED 2 /*! Not compressed. */ -#define SECTION_INFO_NOT_COMPRESSED 1 +#define SEGMENT_INFO_NOT_COMPRESSED 1 /*! SCE version not present. */ #define SCE_VERSION_NOT_PRESENT 0 @@ -192,8 +192,8 @@ typedef struct _self_header u64 phdr_offset; /*! Section headers offset. */ u64 shdr_offset; - /*! Section info offset. */ - u64 section_info_offset; + /*! Segment info offset. */ + u64 segment_info_offset; /*! SCE version offset. */ u64 sce_version_offset; /*! Control info offset. */ @@ -266,8 +266,8 @@ typedef struct _signature u8 padding[6]; } signature_t; -/*! Section info. */ -typedef struct _section_info +/*! Segment info. */ +typedef struct _segment_info { u64 offset; u64 size; @@ -275,7 +275,7 @@ typedef struct _section_info u32 unknown_0; u32 unknown_1; u32 encrypted; -} section_info_t; +} segment_info_t; /*! SCE version. */ typedef struct _sce_version @@ -498,7 +498,7 @@ typedef struct _sce_buffer_ctxt /*! Program info. */ app_info_t *ai; /*! Section info. */ - section_info_t *si; + segment_info_t *si; /*! SCE version. */ sce_version_t *sv; /*! Control infos. */ @@ -538,7 +538,7 @@ typedef struct _sce_buffer_ctxt u32 off_ehdr; /*! Program header offset. */ u32 off_phdr; - /*! Section info offset. */ + /*! Segment info offset. */ u32 off_si; /*! SCE version offset. */ u32 off_sv; diff --git a/src/sce_inlines.h b/src/sce_inlines.h index 4017ec2..e888e62 100644 --- a/src/sce_inlines.h +++ b/src/sce_inlines.h @@ -12,7 +12,7 @@ #include "sce.h" -static inline void _es_section_info(section_info_t *si) +static inline void _es_segment_info(segment_info_t *si) { si->offset = _ES64(si->offset); si->size = _ES64(si->size); @@ -22,10 +22,10 @@ static inline void _es_section_info(section_info_t *si) si->encrypted = _ES32(si->encrypted); } -static inline void _copy_es_section_info(section_info_t *dst, section_info_t *src) +static inline void _copy_es_segment_info(segment_info_t *dst, segment_info_t *src) { - memcpy(dst, src, sizeof(section_info_t)); - _es_section_info(dst); + memcpy(dst, src, sizeof(segment_info_t)); + _es_segment_info(dst); } static inline void _es_ci_data_digest_40(ci_data_digest_40_t *dig) diff --git a/src/self.cpp b/src/self.cpp index 85084d9..ad43520 100644 --- a/src/self.cpp +++ b/src/self.cpp @@ -54,11 +54,29 @@ void _print_self_header(FILE *fp, self_header_t *h) fprintf(fp, " Program Info Offset 0x%016llX\n", _ES64(h->app_info_offset)); fprintf(fp, " ELF Offset 0x%016llX\n", _ES64(h->elf_offset)); fprintf(fp, " PH Offset 0x%016llX\n", _ES64(h->phdr_offset)); - fprintf(fp, " SH Offset 0x%016llX\n", _ES64(h->shdr_offset)); - fprintf(fp, " Section Info Offset 0x%016llX\n", _ES64(h->section_info_offset)); - fprintf(fp, " SCE Version Offset 0x%016llX\n", _ES64(h->sce_version_offset)); - fprintf(fp, " Control Info Offset 0x%016llX\n", _ES64(h->control_info_offset)); - fprintf(fp, " Control Info Size 0x%016llX\n", _ES64(h->control_info_size)); + + if ((_ES64(h->shdr_offset)) != 0) + fprintf(fp, " SH Offset 0x%016llX\n", _ES64(h->shdr_offset)); + else + fprintf(fp, " SH Offset N\\A\n"); + + fprintf(fp, " Segment Info Offset 0x%016llX\n", _ES64(h->segment_info_offset)); + + if ((_ES64(h->sce_version_offset)) != 0) + fprintf(fp, " SCE Version Offset 0x%016llX\n", _ES64(h->sce_version_offset)); + else + fprintf(fp, " SCE Version Offset N\\A\n"); + + if ((_ES64(h->control_info_offset)) != 0) + { + fprintf(fp, " Control Info Offset 0x%016llX\n", _ES64(h->control_info_offset)); + fprintf(fp, " Control Info Size 0x%016llX\n", _ES64(h->control_info_size)); + } + else + { + fprintf(fp, " Control Info Offset N\\A\n"); + fprintf(fp, " Control Info Size N\\A\n"); + } //fprintf(fp, " padding 0x%016llX\n", _ES64(h->padding)); } @@ -103,13 +121,25 @@ void _print_app_info(FILE *fp, app_info_t *ai) //fprintf(fp, " padding 0x%016llX\n", _ES64(ai->padding)); } -void _print_section_info_header(FILE *fp) +void _print_segment_info_header_2(FILE *fp) { - fprintf(fp, "[*] Section Infos:\n"); + fprintf(fp, "[*] Segment Infos:\n"); + fprintf(fp, " Idx Offset Size\n"); +} + +void _print_segment_info_header_3(FILE *fp) +{ + fprintf(fp, "[*] Segment Infos:\n"); fprintf(fp, " Idx Offset Size Compressed unk0 unk1 Encrypted\n"); } -void _print_section_info(FILE *fp, section_info_t *si, u32 idx) +void _print_segment_info_2(FILE *fp, segment_info_t *si, u32 idx) +{ + fprintf(fp, " %03d %08X %08X\n", + idx, (u32)_ES64(si->offset), (u32)_ES64(si->size)); +} + +void _print_segment_info_3(FILE *fp, segment_info_t *si, u32 idx) { fprintf(fp, " %03d %08X %08X %s %08X %08X %s\n", idx, (u32)_ES64(si->offset), (u32)_ES64(si->size), _ES32(si->compressed) == 2 ? "[YES]" : "[NO ]", @@ -481,10 +511,22 @@ bool self_print_info(FILE *fp, sce_buffer_ctxt_t *ctxt) //32 bit ELF. Elf32_Ehdr *eh = (Elf32_Ehdr *)(ctxt->scebuffer + _ES64(ctxt->self.selfh->elf_offset)); - //Print section infos. - _print_section_info_header(fp); + //Print segment infos. + + + if (_ES64(ctxt->self.selfh->header_type) == 3) + _print_segment_info_header_3(fp); + else + _print_segment_info_header_2(fp); + for(i = 0; i < _ES16(eh->e_phnum); i++) - _print_section_info(fp, &ctxt->self.si[i], i); + { + if (_ES64(ctxt->self.selfh->header_type) == 3) + _print_segment_info_3(fp, &ctxt->self.si[i], i); + else + _print_segment_info_2(fp, &ctxt->self.si[i], i); + } + //Print ELF header. _print_elf32_ehdr(fp, eh); @@ -511,12 +553,21 @@ bool self_print_info(FILE *fp, sce_buffer_ctxt_t *ctxt) //64 bit ELF. Elf64_Ehdr *eh = (Elf64_Ehdr *)(ctxt->scebuffer + _ES64(ctxt->self.selfh->elf_offset)); - //Print section infos. + //Print segment infos. if(ctxt->self.si != NULL) { - _print_section_info_header(fp); + if (_ES64(ctxt->self.selfh->header_type) == 3) + _print_segment_info_header_3(fp); + else + _print_segment_info_header_2(fp); + for(i = 0; i < _ES16(eh->e_phnum); i++) - _print_section_info(fp, &ctxt->self.si[i], i); + { + if (_ES64(ctxt->self.selfh->header_type) == 3) + _print_segment_info_3(fp, &ctxt->self.si[i], i); + else + _print_segment_info_2(fp, &ctxt->self.si[i], i); + } } //Print ELF header. @@ -930,7 +981,7 @@ static void _add_phdr_section(sce_buffer_ctxt_t *ctxt, u32 p_type, u32 size, u32 else ctxt->self.si[idx].encrypted = 0; //No LOAD (?). - ctxt->self.si[idx].compressed = SECTION_INFO_NOT_COMPRESSED; + ctxt->self.si[idx].compressed = SEGMENT_INFO_NOT_COMPRESSED; ctxt->self.si[idx].unknown_0 = 0; //Unknown. ctxt->self.si[idx].unknown_1 = 0; //Unknown. } @@ -983,8 +1034,8 @@ static bool _build_self_32(sce_buffer_ctxt_t *ctxt, self_config_t *sconf) //Allocate metadata section headers (one for each program header and one for the section headers). ctxt->metash = (metadata_section_header_t *)malloc(sizeof(metadata_section_header_t) * (ehdr->e_phnum + 1)); - //Copy sections, fill section infos and metadata section headers. - ctxt->self.si = (section_info_t *)malloc(sizeof(section_info_t) * ehdr->e_phnum); + //Copy segments, fill segment infos and metadata section headers. + ctxt->self.si = (segment_info_t *)malloc(sizeof(segment_info_t) * ehdr->e_phnum); u32 loff = 0xFFFFFFFF, skip = 0; for(i = 0; i < ehdr->e_phnum; i++) { @@ -1014,9 +1065,9 @@ static bool _build_self_32(sce_buffer_ctxt_t *ctxt, self_config_t *sconf) loff = phdrs[i].p_offset; } - //Section info count. + //Segment info count. ctxt->makeself->si_cnt = ehdr->e_phnum; - //Number of section infos that are present as data sections. + //Number of segment infos that are present as data sections. ctxt->makeself->si_sec_cnt = ehdr->e_phnum; //Add a section for the section headers. @@ -1061,8 +1112,8 @@ static bool _build_self_64(sce_buffer_ctxt_t *ctxt, self_config_t *sconf) //Allocate metadata section headers (one for each program header and one for the section headers). ctxt->metash = (metadata_section_header_t *)malloc(sizeof(metadata_section_header_t) * (ehdr->e_phnum + 1)); - //Copy sections, fill section infos and metadata section headers. - ctxt->self.si = (section_info_t *)malloc(sizeof(section_info_t) * ehdr->e_phnum); + //Copy segments, fill segment infos and metadata section headers. + ctxt->self.si = (segment_info_t *)malloc(sizeof(segment_info_t) * ehdr->e_phnum); u32 loff = 0xFFFFFFFF, skip = 0; for(i = 0; i < ehdr->e_phnum; i++) { @@ -1093,9 +1144,9 @@ static bool _build_self_64(sce_buffer_ctxt_t *ctxt, self_config_t *sconf) loff = phdrs[i].p_offset; } - //Section info count. + //Segment info count. ctxt->makeself->si_cnt = ehdr->e_phnum; - //Number of section infos that are present as data sections. + //Number of segment infos that are present as data sections. ctxt->makeself->si_sec_cnt = i - skip; //Add a section for the section headers.