mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Merge pull request #4900 from leoetlino/exheader-fix
ncch_container: Fix NCCH decryption heuristic when replacing exheader
This commit is contained in:
		
						commit
						360e6cb513
					
				
					 1 changed files with 13 additions and 11 deletions
				
			
		|  | @ -325,20 +325,11 @@ Loader::ResultStatus NCCHContainer::Load() { | ||||||
|                 return file && file.ReadBytes(&exheader_header, size) == size; |                 return file && file.ReadBytes(&exheader_header, size) == size; | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|             FileUtil::IOFile exheader_override_file{filepath + ".exheader", "rb"}; |             if (!read_exheader(file)) { | ||||||
|             const bool has_exheader_override = read_exheader(exheader_override_file); |  | ||||||
|             if (has_exheader_override) { |  | ||||||
|                 if (exheader_header.system_info.jump_id != |  | ||||||
|                     exheader_header.arm11_system_local_caps.program_id) { |  | ||||||
|                     LOG_WARNING(Service_FS, "Jump ID and Program ID don't match. " |  | ||||||
|                                             "The override exheader might not be decrypted."); |  | ||||||
|                 } |  | ||||||
|                 is_tainted = true; |  | ||||||
|             } else if (!read_exheader(file)) { |  | ||||||
|                 return Loader::ResultStatus::Error; |                 return Loader::ResultStatus::Error; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             if (!has_exheader_override && is_encrypted) { |             if (is_encrypted) { | ||||||
|                 // This ID check is masked to low 32-bit as a toleration to ill-formed ROM created
 |                 // This ID check is masked to low 32-bit as a toleration to ill-formed ROM created
 | ||||||
|                 // by merging games and its updates.
 |                 // by merging games and its updates.
 | ||||||
|                 if ((exheader_header.system_info.jump_id & 0xFFFFFFFF) == |                 if ((exheader_header.system_info.jump_id & 0xFFFFFFFF) == | ||||||
|  | @ -358,6 +349,17 @@ Loader::ResultStatus NCCHContainer::Load() { | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             FileUtil::IOFile exheader_override_file{filepath + ".exheader", "rb"}; | ||||||
|  |             const bool has_exheader_override = read_exheader(exheader_override_file); | ||||||
|  |             if (has_exheader_override) { | ||||||
|  |                 if (exheader_header.system_info.jump_id != | ||||||
|  |                     exheader_header.arm11_system_local_caps.program_id) { | ||||||
|  |                     LOG_WARNING(Service_FS, "Jump ID and Program ID don't match. " | ||||||
|  |                                             "The override exheader might not be decrypted."); | ||||||
|  |                 } | ||||||
|  |                 is_tainted = true; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             is_compressed = (exheader_header.codeset_info.flags.flag & 1) == 1; |             is_compressed = (exheader_header.codeset_info.flags.flag & 1) == 1; | ||||||
|             u32 entry_point = exheader_header.codeset_info.text.address; |             u32 entry_point = exheader_header.codeset_info.text.address; | ||||||
|             u32 code_size = exheader_header.codeset_info.text.code_size; |             u32 code_size = exheader_header.codeset_info.text.code_size; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue