FalsifyTwlBackup:BkpType Legacy に対応。

(こっちがFalsifyTwlBackup で、 r38 は TWLBackupBlock)

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_test_tools@39 6b0af911-cb57-b745-895f-eec5701120e1
This commit is contained in:
n2460 2011-10-27 11:53:02 +00:00
parent 12cf32bf6b
commit 279357adf6
6 changed files with 54 additions and 21 deletions

View File

@ -88,22 +88,30 @@ partial class Program
// public save の fileSize を変更
case 209:
header.fileSizes[(int)Utility.SectionIndex.PUBLIC_SAVE]++;
header.fileSizes[prop.indexPublicSave]++;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break;
// sub banner の fileSize を変更
case 210:
header.fileSizes[(int)Utility.SectionIndex.SUB_BANNER]++;
header.fileSizes[prop.indexSubBanner]++;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break;
// コンテンツ ID を変更
case 211:
for (int i = 0; i < header.contentId.Length; i++)
if (prop.bkpType != BkpType.LEGACY)
{
header.contentId[i]++;
for (int i = 0; i < header.contentId.Length; i++)
{
header.contentId[i]++;
}
}
else
{
header.contentIdForLegacy++;
}
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
@ -123,7 +131,7 @@ partial class Program
// public save の fileSize, TMD Reserved の publicSaveSize を変更
case 214:
header.fileSizes[(int)Utility.SectionIndex.PUBLIC_SAVE]++;
header.fileSizes[prop.indexPublicSave]++;
header.tmdReserved.publicSaveSize++;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);

View File

@ -72,28 +72,28 @@ partial class Program
// public save の fileSize を大きくした上で、public save の前に不正なデータを入れる
case 406:
header.fileSizes[(int)Utility.SectionIndex.PUBLIC_SAVE] += IMPROPER_DATA_SIZE;
header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_PUBLIC_SAVE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break;
// public save の fileSize を大きくした上で、public save の後ろに不正なデータを入れる
case 407:
header.fileSizes[(int)Utility.SectionIndex.PUBLIC_SAVE] += IMPROPER_DATA_SIZE;
header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_PUBLIC_SAVE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break;
// サブバナーの fileSize を大きくした上で、サブバナーの前に不正なデータを入れる
case 408:
header.fileSizes[(int)Utility.SectionIndex.SUB_BANNER] += IMPROPER_DATA_SIZE;
header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_SUB_BANNER, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break;
// サブバナーの fileSize を大きくした上で、サブバナーの後ろに不正なデータを入れる
case 409:
header.fileSizes[(int)Utility.SectionIndex.SUB_BANNER] += IMPROPER_DATA_SIZE;
header.fileSizes[prop.indexSubBanner] += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_SUB_BANNER, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break;
@ -112,7 +112,7 @@ partial class Program
// public save の fileSize, TMD Reserved の publicSave を変更し、public save の前にデータを入れる
case 412:
header.fileSizes[(int)Utility.SectionIndex.PUBLIC_SAVE] += IMPROPER_DATA_SIZE;
header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE;
header.tmdReserved.publicSaveSize += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_PUBLIC_SAVE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
@ -120,7 +120,7 @@ partial class Program
// public save の fileSize, TMD Reserved の publicSave を変更し、public save の後ろにデータを入れる
case 413:
header.fileSizes[(int)Utility.SectionIndex.PUBLIC_SAVE] += IMPROPER_DATA_SIZE;
header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE;
header.tmdReserved.publicSaveSize += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_PUBLIC_SAVE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);

View File

@ -77,7 +77,7 @@ partial class Program
// public save の fileSize を大きくした上で、public save の前に不正なデータを入れる
// public save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 506:
header.fileSizes[(int)Utility.SectionIndex.PUBLIC_SAVE] += IMPROPER_DATA_SIZE;
header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_PUBLIC_SAVE, CHG_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break;
@ -85,7 +85,7 @@ partial class Program
// public save の fileSize を大きくした上で、public save の後ろに不正なデータを入れる
// public save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 507:
header.fileSizes[(int)Utility.SectionIndex.PUBLIC_SAVE] += IMPROPER_DATA_SIZE;
header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_PUBLIC_SAVE, CHG_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break;
@ -93,7 +93,7 @@ partial class Program
// サブバナーの fileSize を大きくした上で、サブバナーの前に不正なデータを入れる
// サブバナーブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 508:
header.fileSizes[(int)Utility.SectionIndex.SUB_BANNER] += IMPROPER_DATA_SIZE;
header.fileSizes[prop.indexSubBanner] += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_SUB_BANNER, CHG_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break;
@ -101,7 +101,7 @@ partial class Program
// サブバナーの fileSize を大きくした上で、サブバナーの後ろに不正なデータを入れる
// サブバナーブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 509:
header.fileSizes[(int)Utility.SectionIndex.SUB_BANNER] += IMPROPER_DATA_SIZE;
header.fileSizes[prop.indexSubBanner] += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_SUB_BANNER, CHG_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break;
@ -121,7 +121,7 @@ partial class Program
// public save の fileSize, TMD Reserved の publicSave を変更し、public save の前にデータを入れる
// public save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 512:
header.fileSizes[(int)Utility.SectionIndex.PUBLIC_SAVE] += IMPROPER_DATA_SIZE;
header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE;
header.tmdReserved.publicSaveSize += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_PUBLIC_SAVE, CHG_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
@ -130,7 +130,7 @@ partial class Program
// public save の fileSize, TMD Reserved の publicSave を変更し、public save の後ろにデータを入れる
// public save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 513:
header.fileSizes[(int)Utility.SectionIndex.PUBLIC_SAVE] += IMPROPER_DATA_SIZE;
header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE;
header.tmdReserved.publicSaveSize += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_PUBLIC_SAVE, CHG_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);

View File

@ -71,7 +71,7 @@ partial class Program
/// <param name="dataBlocks">変更対象となる署名ブロックを有するBlocks</param>
/// <param name="hash">新しいハッシュ値</param>
/// <param name="section">変更するブロックセクション</param>
static void ChangeHashSet(Blocks dataBlocks, byte[] hash, int section)
static void ChangeHashSet(Blocks dataBlocks, byte[] hash, int section, BkpType type)
{
Debug.Assert((section <= BLOCK_NUM - 1) && (section >= 0));
@ -98,11 +98,25 @@ partial class Program
break;
case SECTION_PUBLIC_SAVE:
hash.CopyTo(signature.digest.section[(int)Utility.SectionIndex.PUBLIC_SAVE], 0);
if (type != BkpType.LEGACY)
{
hash.CopyTo(signature.digest.section[(int)Utility.SectionIndex.PUBLIC_SAVE], 0);
}
else
{
hash.CopyTo(signature.digest.section[(int)Utility.SectionIndexLegacy.PUBLIC_SAVE], 0);
}
break;
case SECTION_SUB_BANNER:
hash.CopyTo(signature.digest.section[(int)Utility.SectionIndex.SUB_BANNER], 0);
if (type != BkpType.LEGACY)
{
hash.CopyTo(signature.digest.section[(int)Utility.SectionIndex.SUB_BANNER], 0);
}
else
{
hash.CopyTo(signature.digest.section[(int)Utility.SectionIndexLegacy.SUB_BANNER], 0);
}
break;
case SECTION_PRIVATE_SAVE:
@ -227,7 +241,7 @@ partial class Program
if (dataBlocks[i].body != null)
{
encryptedBlocks[i] = EncryptBlock(dataBlocks, i, prop, impData, insertPos, byteMac[i], byteHash[i]); // ブロックを暗号化&結合
ChangeHashSet(dataBlocks, byteHash[i], i); // ハッシュセットを更新
ChangeHashSet(dataBlocks, byteHash[i], i, prop.bkpType); // ハッシュセットを更新
}
else
{

View File

@ -14,6 +14,8 @@ namespace FalsifyTwlBackup
public byte[] macKeyData; // MAC生成のための鍵データ
public BkpType bkpType; // バックアップの形式。
public int indexPublicSave; // パブリックセーブデータのインデックス
public int indexSubBanner; // サブバナーのインデックス
public string outFolderPath; // 出力フォルダ名

View File

@ -229,6 +229,8 @@ partial class Program
return;
}
else
{
// 拡張子の判定
CheckExtension(args[0], ".bin"); // 入力ファイル名
@ -258,10 +260,17 @@ partial class Program
int argTypeIndex = (isSpecifyMode) ? 6 : 4;
prop.bkpType = BkpType.NORMAL;
prop.indexPublicSave = (int)Utility.SectionIndex.PUBLIC_SAVE;
prop.indexSubBanner = (int)Utility.SectionIndex.SUB_BANNER;
if (args.Length >= argTypeIndex + 1 && args[argTypeIndex - 1].ToUpper().TrimStart('-') == "TYPE")
{
prop.bkpType = GetBackupType(args[argTypeIndex]);
}
if (prop.bkpType == BkpType.LEGACY)
{
prop.indexPublicSave = (int)Utility.SectionIndexLegacy.PUBLIC_SAVE;
prop.indexSubBanner = (int)Utility.SectionIndexLegacy.SUB_BANNER;
}
// バックアップデータの読み込み
byte[] twlBackupData = File.ReadAllBytes(twlBackupName);