mirror of
https://github.com/DarkMatterCore/nxdumptool.git
synced 2024-11-22 18:26:39 +00:00
Small PFS fix.
This commit is contained in:
parent
2c252c03b2
commit
226fbd0e21
2 changed files with 28 additions and 5 deletions
23
README.md
23
README.md
|
@ -1,4 +1,5 @@
|
||||||
todo:
|
```
|
||||||
|
todo:
|
||||||
|
|
||||||
hfs0: filelist generation methods
|
hfs0: filelist generation methods
|
||||||
|
|
||||||
|
@ -10,11 +11,29 @@
|
||||||
romfs: data replacement methods
|
romfs: data replacement methods
|
||||||
romfs: filelist generation methods
|
romfs: filelist generation methods
|
||||||
|
|
||||||
|
nacp mod:
|
||||||
|
|
||||||
|
1. Patch StartupUserAccount in control.nacp to 0x01.
|
||||||
|
2. Recalculate hash for the control.nacp file. Store it in the RomFS file hash table. -> Not so sure about this...
|
||||||
|
3. Recalculate hashes for the modified blocks, then perform chain hash calculation / replacement per each IVFC level up until reaching superblock hash.
|
||||||
|
4. Reencrypt all the modified blocks using the already known crypto properties. Keep the modified + encrypted blocks in memory.
|
||||||
|
5. Recalculate RomFS section header SHA-256 hash. Replace the section hash in the NCA header. Keep a copy of the modified NCA header in memory.
|
||||||
|
6. While generating the output dump, replace sections in the Control NCA with the previously modified + reencrypted blocks before writing data. Also replace the NCA header.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Result txIsFat32(bool *mode) {
|
||||||
|
Result rc = serviceDispatch(&g_tx, 137);
|
||||||
|
if (rc == 0xa08) {
|
||||||
|
*mode = false;
|
||||||
|
return 0;
|
||||||
|
} else if (rc == 0) {
|
||||||
|
*mode = true;
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -158,9 +158,9 @@ bool pfsGenerateEntryPatch(PartitionFileSystemContext *ctx, PartitionFileSystemE
|
||||||
|
|
||||||
u64 data_block_start_offset = (ctx->offset + ALIGN_DOWN(partition_offset, block_size));
|
u64 data_block_start_offset = (ctx->offset + ALIGN_DOWN(partition_offset, block_size));
|
||||||
u64 data_block_end_offset = (ctx->offset + ALIGN_UP(partition_offset + data_size, block_size));
|
u64 data_block_end_offset = (ctx->offset + ALIGN_UP(partition_offset + data_size, block_size));
|
||||||
|
if (data_block_end_offset > (ctx->offset + ctx->size)) data_block_end_offset = (ctx->offset + ctx->size);
|
||||||
u64 data_block_size = (data_block_end_offset - data_block_start_offset);
|
u64 data_block_size = (data_block_end_offset - data_block_start_offset);
|
||||||
|
|
||||||
u64 block_count = (hash_block_size / SHA256_HASH_SIZE);
|
|
||||||
u64 new_data_offset = (partition_offset - ALIGN_DOWN(partition_offset, block_size));
|
u64 new_data_offset = (partition_offset - ALIGN_DOWN(partition_offset, block_size));
|
||||||
|
|
||||||
u8 *hash_table = NULL, *data_block = NULL;
|
u8 *hash_table = NULL, *data_block = NULL;
|
||||||
|
@ -201,7 +201,11 @@ bool pfsGenerateEntryPatch(PartitionFileSystemContext *ctx, PartitionFileSystemE
|
||||||
memcpy(data_block + new_data_offset, data, data_size);
|
memcpy(data_block + new_data_offset, data, data_size);
|
||||||
|
|
||||||
/* Recalculate hashes */
|
/* Recalculate hashes */
|
||||||
for(u64 i = 0; i < block_count; i++) sha256CalculateHash(hash_table + hash_block_start_offset + (i * SHA256_HASH_SIZE), data_block + (i * block_size), block_size);
|
for(u64 i = 0, j = 0; i < data_block_size; i += block_size, j++)
|
||||||
|
{
|
||||||
|
if (block_size > (data_block_size - i)) block_size = (data_block_size - i);
|
||||||
|
sha256CalculateHash(hash_table + hash_block_start_offset + (j * SHA256_HASH_SIZE), data_block + i, block_size);
|
||||||
|
}
|
||||||
|
|
||||||
/* Reencrypt hash block */
|
/* Reencrypt hash block */
|
||||||
out->hash_block = ncaGenerateEncryptedFsSectionBlock(ctx->nca_fs_ctx, hash_table + hash_block_start_offset, hash_block_size, hash_table_offset + hash_block_start_offset, \
|
out->hash_block = ncaGenerateEncryptedFsSectionBlock(ctx->nca_fs_ctx, hash_table + hash_block_start_offset, hash_block_size, hash_table_offset + hash_block_start_offset, \
|
||||||
|
|
Loading…
Reference in a new issue