FalsifyTwlBackup:改ざん項目の追加。

Category 関数で書きだしたかどうかを返すようにした。

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_test_tools@41 6b0af911-cb57-b745-895f-eec5701120e1
This commit is contained in:
n2460 2011-11-01 02:27:59 +00:00
parent ecf1942c1b
commit 78f20ab988
8 changed files with 364 additions and 56 deletions

View File

@ -8,7 +8,7 @@ namespace FalsifyTwlBackup
{ {
partial class Program partial class Program
{ {
static void FalsifyingDataCategory1xx(int improperNo, Properties prop, byte[] improperData) static bool FalsifyingDataCategory1xx(int improperNo, Properties prop, byte[] improperData)
{ {
Blocks blocksForFalsifying = (Blocks)prop.decryptedBlocks.Clone(); Blocks blocksForFalsifying = (Blocks)prop.decryptedBlocks.Clone();
@ -130,10 +130,51 @@ partial class Program
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break; break;
// WPS Only : private セーブデータの前に不正なデータを入れる
case 119:
if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
{
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_PRIVATE_SAVE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// WPS Only : private セーブデータの一部を不正なデータを差し替える
case 120:
if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
{
ReplaceImproperData(blocksForFalsifying[SECTION_PRIVATE_SAVE].body, improperData);
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// WPS Only : private セーブデータの後ろに不正なデータを入れる
case 121:
if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
{
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_PRIVATE_SAVE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// ありえない // ありえない
default: default:
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
return true;
} }
} }
} }

View File

@ -8,7 +8,7 @@ namespace FalsifyTwlBackup
{ {
partial class Program partial class Program
{ {
static void FalsifyingDataCategory2xx(int improperNo, Properties prop, byte[] improperData) static bool FalsifyingDataCategory2xx(int improperNo, Properties prop, byte[] improperData)
{ {
Blocks blocksForFalsifying = (Blocks)prop.decryptedBlocks.Clone(); Blocks blocksForFalsifying = (Blocks)prop.decryptedBlocks.Clone();
@ -79,9 +79,19 @@ partial class Program
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break; break;
// コンテンツ[0] の fileSize を変更 // コンテンツの fileSize を変更
case 208: case 208:
header.fileSizes[(int)Utility.SectionIndex.CONTENT]++; if (prop.bkpType != BkpType.LEGACY)
{
for (int i = 0; i < MAX_CONTENTS; i++)
{
header.fileSizes[(int)Utility.SectionIndex.CONTENT + i]++;
}
}
else
{
header.fileSizes[(int)Utility.SectionIndex.CONTENT]++;
}
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET); outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break; break;
@ -117,30 +127,91 @@ partial class Program
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break; break;
// コンテンツ Index を変更
case 212: case 212:
header.tmdReserved.publicSaveSize++; if (prop.bkpType != BkpType.LEGACY)
{
for (int i = 0; i < header.contentIndex.Length; i++)
{
header.contentIndex[i]++;
}
}
else
{
header.contentIndexForLegacy++;
}
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET); outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break; break;
case 213: case 213:
header.tmdReserved.publicSaveSize++;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break;
case 214:
header.tmdReserved.privateSaveSize++; header.tmdReserved.privateSaveSize++;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET); outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break; break;
// public save の fileSize, TMD Reserved の publicSaveSize を変更 // public save の fileSize, TMD Reserved の publicSaveSize を変更
case 214: case 215:
header.fileSizes[prop.indexPublicSave]++; header.fileSizes[prop.indexPublicSave]++;
header.tmdReserved.publicSaveSize++; header.tmdReserved.publicSaveSize++;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET); outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break; break;
// Normal, WPS Only : headerVersion を変更
case 216 :
if (prop.bkpType != BkpType.LEGACY)
{
header.headerVersion++;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// WPS Only : ヘッダの privateSaveSize を変更
case 217 :
if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
{
header.privateSaveForWPS++;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// WPS Only : ヘッダの privateSaveSize, TMD Reserved の privateSaveSize を変更
case 218 :
if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
{
header.privateSaveForWPS++;
header.tmdReserved.privateSaveSize++;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, NONE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// ありえない // ありえない
default: default:
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
return true;
} }
} }
} }

View File

@ -8,7 +8,7 @@ namespace FalsifyTwlBackup
{ {
partial class Program partial class Program
{ {
static void FalsifyingDataCategory3xx(int improperNo, Properties prop, byte[] improperData) static bool FalsifyingDataCategory3xx(int improperNo, Properties prop, byte[] improperData)
{ {
Blocks blocksForFalsifying = (Blocks)prop.decryptedBlocks.Clone(); Blocks blocksForFalsifying = (Blocks)prop.decryptedBlocks.Clone();
@ -60,6 +60,7 @@ partial class Program
default: default:
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
return true;
} }
} }
} }

View File

@ -8,7 +8,7 @@ namespace FalsifyTwlBackup
{ {
partial class Program partial class Program
{ {
static void FalsifyingDataCategory4xx(int improperNo, Properties prop, byte[] improperData) static bool FalsifyingDataCategory4xx(int improperNo, Properties prop, byte[] improperData)
{ {
Blocks blocksForFalsifying = (Blocks)prop.decryptedBlocks.Clone(); Blocks blocksForFalsifying = (Blocks)prop.decryptedBlocks.Clone();
@ -110,7 +110,7 @@ partial class Program
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break; break;
// public save の fileSize, TMD Reserved の publicSave を変更し、public save の前にデータを入れる // public save の fileSize, TMD Reserved の publicSaveSize を変更し、public save の前にデータを入れる
case 412: case 412:
header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE; header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE;
header.tmdReserved.publicSaveSize += IMPROPER_DATA_SIZE; header.tmdReserved.publicSaveSize += IMPROPER_DATA_SIZE;
@ -118,7 +118,7 @@ partial class Program
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break; break;
// public save の fileSize, TMD Reserved の publicSave を変更し、public save の後ろにデータを入れる // public save の fileSize, TMD Reserved の publicSaveSize を変更し、public save の後ろにデータを入れる
case 413: case 413:
header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE; header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE;
header.tmdReserved.publicSaveSize += IMPROPER_DATA_SIZE; header.tmdReserved.publicSaveSize += IMPROPER_DATA_SIZE;
@ -126,22 +126,97 @@ partial class Program
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break; break;
// WPS Only : private save の fileSize を変更し、private save の前にデータを入れる
case 414: case 414:
header.tmdReserved.privateSaveSize += IMPROPER_DATA_SIZE; if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_PUBLIC_SAVE, NC_MAC_AND_HASHSET); {
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); header.privateSaveForWPS += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_PRIVATE_SAVE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break; break;
// WPS Only : private save の fileSize を変更し、private save の後ろにデータを入れる
case 415: case 415:
header.tmdReserved.privateSaveSize += IMPROPER_DATA_SIZE; if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_PUBLIC_SAVE, NC_MAC_AND_HASHSET); {
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); header.privateSaveForWPS += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_PRIVATE_SAVE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// WPS Only : TMD Reserved の privateSaveSize を大きくした上で、private セーブデータの前に不正なデータを入れる
case 416:
if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
{
header.tmdReserved.privateSaveSize += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_PRIVATE_SAVE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// WPS Only : TMD Reserved の privateSaveSize を大きくした上で、private セーブデータの後ろに不正なデータを入れる
case 417:
if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
{
header.tmdReserved.privateSaveSize += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_PRIVATE_SAVE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// WPS Only : ヘッダの privateSaveSize, TMD Reserved の privateSaveSize を変更し、private save の前にデータを入れる
case 418:
if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
{
header.privateSaveForWPS += IMPROPER_DATA_SIZE;
header.tmdReserved.privateSaveSize += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_PRIVATE_SAVE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// WPS Only : ヘッダの privateSaveSize, TMD Reserved の privateSaveSize を変更し、private save の後ろにデータを入れる
case 419:
if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
{
header.privateSaveForWPS += IMPROPER_DATA_SIZE;
header.tmdReserved.privateSaveSize += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_PRIVATE_SAVE, NC_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break; break;
// ありえない // ありえない
default: default:
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
return true;
} }
} }
} }

View File

@ -8,7 +8,7 @@ namespace FalsifyTwlBackup
{ {
partial class Program partial class Program
{ {
static void FalsifyingDataCategory5xx(int improperNo, Properties prop, byte[] improperData) static bool FalsifyingDataCategory5xx(int improperNo, Properties prop, byte[] improperData)
{ {
Blocks blocksForFalsifying = (Blocks)prop.decryptedBlocks.Clone(); Blocks blocksForFalsifying = (Blocks)prop.decryptedBlocks.Clone();
@ -118,7 +118,7 @@ partial class Program
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break; break;
// public save の fileSize, TMD Reserved の publicSave を変更し、public save の前にデータを入れる // public save の fileSize, TMD Reserved の publicSaveSize を変更し、public save の前にデータを入れる
// public save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する // public save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 512: case 512:
header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE; header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE;
@ -127,7 +127,7 @@ partial class Program
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break; break;
// public save の fileSize, TMD Reserved の publicSave を変更し、public save の後ろにデータを入れる // public save の fileSize, TMD Reserved の publicSaveSize を変更し、public save の後ろにデータを入れる
// public save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する // public save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 513: case 513:
header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE; header.fileSizes[prop.indexPublicSave] += IMPROPER_DATA_SIZE;
@ -136,22 +136,103 @@ partial class Program
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
break; break;
// WPS Only : private save の fileSize を変更し、private save の前にデータを入れる
// private save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 514: case 514:
header.tmdReserved.privateSaveSize += IMPROPER_DATA_SIZE; if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_PUBLIC_SAVE, CHG_MAC_AND_HASHSET); {
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); header.privateSaveForWPS += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_PRIVATE_SAVE, CHG_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break; break;
// WPS Only : private save の fileSize を変更し、private save の後ろにデータを入れる
// private save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 515: case 515:
header.tmdReserved.privateSaveSize += IMPROPER_DATA_SIZE; if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_PUBLIC_SAVE, CHG_MAC_AND_HASHSET); {
OutputFalsifiedData(improperNo, prop.outFolderPath, outData); header.privateSaveForWPS += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_PRIVATE_SAVE, CHG_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// WPS Only : TMD Reserved の privateSaveSize を大きくした上で、private セーブデータの前に不正なデータを入れる
// private save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 516:
if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
{
header.tmdReserved.privateSaveSize += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_PRIVATE_SAVE, CHG_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// WPS Only : TMD Reserved の privateSaveSize を大きくした上で、private セーブデータの後ろに不正なデータを入れる
// private save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 517:
if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
{
header.tmdReserved.privateSaveSize += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_PRIVATE_SAVE, CHG_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// WPS Only : ヘッダの privateSaveSize, TMD Reserved の privateSaveSize を変更し、private save の前にデータを入れる
// private save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 518:
if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
{
header.privateSaveForWPS += IMPROPER_DATA_SIZE;
header.tmdReserved.privateSaveSize += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, FRONT_PRIVATE_SAVE, CHG_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break;
// WPS Only : ヘッダの privateSaveSize, TMD Reserved の privateSaveSize を変更し、private save の後ろにデータを入れる
// private save ブロックの MAC を更新し、署名ブロック内ハッシュも更新する
case 519:
if (prop.bkpType == BkpType.WITH_PRIVATE_SAVE)
{
header.privateSaveForWPS += IMPROPER_DATA_SIZE;
header.tmdReserved.privateSaveSize += IMPROPER_DATA_SIZE;
outData = MergeEncryptBody(blocksForFalsifying, prop, improperData, REAR_PRIVATE_SAVE, CHG_MAC_AND_HASHSET);
OutputFalsifiedData(improperNo, prop.outFolderPath, outData);
}
else
{
return false;
}
break; break;
// ありえない // ありえない
default: default:
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
return true;
} }
} }
} }

View File

@ -8,7 +8,7 @@ namespace FalsifyTwlBackup
{ {
partial class Program partial class Program
{ {
static void FalsifyingDataCategory9xx(int improperNo, Properties prop, byte[] improperData) static bool FalsifyingDataCategory9xx(int improperNo, Properties prop, byte[] improperData)
{ {
Blocks blocksForFalsifying = (Blocks)prop.decryptedBlocks.Clone(); Blocks blocksForFalsifying = (Blocks)prop.decryptedBlocks.Clone();
@ -33,6 +33,7 @@ partial class Program
default: default:
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
return true;
} }
} }
} }

View File

@ -171,7 +171,7 @@ partial class Program
byte[] encryptedBlock = new byte[0]; byte[] encryptedBlock = new byte[0];
// (データ本体の前に不正データ挿入) // (データ本体の前に不正データ挿入)
if (insertPos >= FRONT_BANNER && insertPos <= FRONT_SUB_BANNER) if (insertPos >= FRONT_BANNER && insertPos <= FRONT_PRIVATE_SAVE)
{ {
if (section == insertPos - FRONT_BANNER) if (section == insertPos - FRONT_BANNER)
{ {
@ -183,7 +183,7 @@ partial class Program
encryptedBlock = MergeByteArray(encryptedBlock, dataBlocks[section].body.GetBytes()); // bodyを暗号化 encryptedBlock = MergeByteArray(encryptedBlock, dataBlocks[section].body.GetBytes()); // bodyを暗号化
// (データ本体の後に不正データ挿入) // (データ本体の後に不正データ挿入)
if (insertPos >= REAR_BANNER && insertPos <= REAR_SUB_BANNER) if (insertPos >= REAR_BANNER && insertPos <= REAR_PRIVATE_SAVE)
{ {
if (section == insertPos - REAR_BANNER) if (section == insertPos - REAR_BANNER)
{ {
@ -203,9 +203,19 @@ partial class Program
encryptedBlock = MergeByteArray(encryptedBlock, dataBlocks[section].iv); // IVを結合 encryptedBlock = MergeByteArray(encryptedBlock, dataBlocks[section].iv); // IVを結合
// (データブロックの後に不正データ挿入) // (データブロックの後に不正データ挿入)
if (section == SECTION_SUB_BANNER && insertPos == REAR_DATA) if (prop.bkpType != BkpType.WITH_PRIVATE_SAVE)
{ {
encryptedBlock = MergeByteArray(encryptedBlock, impData); if (section == SECTION_SUB_BANNER && insertPos == REAR_DATA)
{
encryptedBlock = MergeByteArray(encryptedBlock, impData);
}
}
else
{
if (section == SECTION_PRIVATE_SAVE && insertPos == REAR_DATA)
{
encryptedBlock = MergeByteArray(encryptedBlock, impData);
}
} }
return encryptedBlock; return encryptedBlock;
@ -296,31 +306,32 @@ partial class Program
/// <param name="improperNo"></param> /// <param name="improperNo"></param>
/// <param name="prop"></param> /// <param name="prop"></param>
/// <param name="improperData"></param> /// <param name="improperData"></param>
static void FalsifyingData(int improperNo, Properties prop, byte[] improperData) /// <returns>改ざんファイルを生成したかどうか</returns>
static bool FalsifyingData(int improperNo, Properties prop, byte[] improperData)
{ {
if (MIN_OF_CAT100 <= improperNo && improperNo <= MAX_OF_CAT100) if (MIN_OF_CAT100 <= improperNo && improperNo <= MAX_OF_CAT100)
{ {
FalsifyingDataCategory1xx(improperNo, prop, improperData); return FalsifyingDataCategory1xx(improperNo, prop, improperData);
} }
else if (MIN_OF_CAT200 <= improperNo && improperNo <= MAX_OF_CAT200) else if (MIN_OF_CAT200 <= improperNo && improperNo <= MAX_OF_CAT200)
{ {
FalsifyingDataCategory2xx(improperNo, prop, improperData); return FalsifyingDataCategory2xx(improperNo, prop, improperData);
} }
else if (MIN_OF_CAT300 <= improperNo && improperNo <= MAX_OF_CAT300) else if (MIN_OF_CAT300 <= improperNo && improperNo <= MAX_OF_CAT300)
{ {
FalsifyingDataCategory3xx(improperNo, prop, improperData); return FalsifyingDataCategory3xx(improperNo, prop, improperData);
} }
else if (MIN_OF_CAT400 <= improperNo && improperNo <= MAX_OF_CAT400) else if (MIN_OF_CAT400 <= improperNo && improperNo <= MAX_OF_CAT400)
{ {
FalsifyingDataCategory4xx(improperNo, prop, improperData); return FalsifyingDataCategory4xx(improperNo, prop, improperData);
} }
else if (MIN_OF_CAT500 <= improperNo && improperNo <= MAX_OF_CAT500) else if (MIN_OF_CAT500 <= improperNo && improperNo <= MAX_OF_CAT500)
{ {
FalsifyingDataCategory5xx(improperNo, prop, improperData); return FalsifyingDataCategory5xx(improperNo, prop, improperData);
} }
else else
{ {
FalsifyingDataCategory9xx(improperNo, prop, improperData); return FalsifyingDataCategory9xx(improperNo, prop, improperData);
} }
} }
@ -349,8 +360,10 @@ partial class Program
{ {
for (int j = NUM_OF_PATTERN[i, 0]; j <= NUM_OF_PATTERN[i, 1]; j++) for (int j = NUM_OF_PATTERN[i, 0]; j <= NUM_OF_PATTERN[i, 1]; j++)
{ {
FalsifyingData(j, prop, improperData); if (FalsifyingData(j, prop, improperData))
Console.WriteLine(" Complete falsifying No.{0}.", j); {
Console.WriteLine(" Complete falsifying No.{0}.", j);
}
} }
Console.WriteLine(" Complete falsifying Cat.{0}.\n", NUM_OF_PATTERN[i, 0]); Console.WriteLine(" Complete falsifying Cat.{0}.\n", NUM_OF_PATTERN[i, 0]);
} }
@ -360,8 +373,10 @@ partial class Program
Console.WriteLine(" Falsifying category No.{0}.", NUM_OF_PATTERN[MODE_CAT100 - 1, 0]); Console.WriteLine(" Falsifying category No.{0}.", NUM_OF_PATTERN[MODE_CAT100 - 1, 0]);
for (int i = 100; i <= MAX_OF_CAT100; i++) for (int i = 100; i <= MAX_OF_CAT100; i++)
{ {
FalsifyingData(i, prop, improperData); if (FalsifyingData(i, prop, improperData))
Console.WriteLine(" Complete falsifying No.{0}.", i); {
Console.WriteLine(" Complete falsifying No.{0}.", i);
}
} }
Console.WriteLine(" Complete falsifying Cat.{0}.\n", NUM_OF_PATTERN[MODE_CAT100 - 1, 0]); Console.WriteLine(" Complete falsifying Cat.{0}.\n", NUM_OF_PATTERN[MODE_CAT100 - 1, 0]);
break; break;
@ -370,8 +385,10 @@ partial class Program
Console.WriteLine(" Falsifying category No.{0}.", NUM_OF_PATTERN[MODE_CAT200 - 1, 0]); Console.WriteLine(" Falsifying category No.{0}.", NUM_OF_PATTERN[MODE_CAT200 - 1, 0]);
for (int i = 200; i <= MAX_OF_CAT200; i++) for (int i = 200; i <= MAX_OF_CAT200; i++)
{ {
FalsifyingData(i, prop, improperData); if (FalsifyingData(i, prop, improperData))
Console.WriteLine(" Complete falsifying No.{0}.", i); {
Console.WriteLine(" Complete falsifying No.{0}.", i);
}
} }
Console.WriteLine(" Complete falsifying Cat.{0}.\n", NUM_OF_PATTERN[MODE_CAT200 - 1, 0]); Console.WriteLine(" Complete falsifying Cat.{0}.\n", NUM_OF_PATTERN[MODE_CAT200 - 1, 0]);
break; break;
@ -380,8 +397,10 @@ partial class Program
Console.WriteLine(" Falsifying category No.{0}.", NUM_OF_PATTERN[MODE_CAT300 - 1, 0]); Console.WriteLine(" Falsifying category No.{0}.", NUM_OF_PATTERN[MODE_CAT300 - 1, 0]);
for (int i = 300; i <= MAX_OF_CAT300; i++) for (int i = 300; i <= MAX_OF_CAT300; i++)
{ {
FalsifyingData(i, prop, improperData); if (FalsifyingData(i, prop, improperData))
Console.WriteLine(" Complete falsifying No.{0}.", i); {
Console.WriteLine(" Complete falsifying No.{0}.", i);
}
} }
Console.WriteLine(" Complete falsifying Cat.{0}.\n", NUM_OF_PATTERN[MODE_CAT300 - 1, 0]); Console.WriteLine(" Complete falsifying Cat.{0}.\n", NUM_OF_PATTERN[MODE_CAT300 - 1, 0]);
break; break;
@ -390,8 +409,10 @@ partial class Program
Console.WriteLine(" Falsifying category No.{0}.", NUM_OF_PATTERN[MODE_CAT400 - 1, 0]); Console.WriteLine(" Falsifying category No.{0}.", NUM_OF_PATTERN[MODE_CAT400 - 1, 0]);
for (int i = 400; i <= MAX_OF_CAT400; i++) for (int i = 400; i <= MAX_OF_CAT400; i++)
{ {
FalsifyingData(i, prop, improperData); if (FalsifyingData(i, prop, improperData))
Console.WriteLine(" Complete falsifying No.{0}.", i); {
Console.WriteLine(" Complete falsifying No.{0}.", i);
}
} }
Console.WriteLine(" Complete falsifying Cat.{0}.\n", NUM_OF_PATTERN[MODE_CAT400 - 1, 0]); Console.WriteLine(" Complete falsifying Cat.{0}.\n", NUM_OF_PATTERN[MODE_CAT400 - 1, 0]);
break; break;
@ -400,16 +421,24 @@ partial class Program
Console.WriteLine(" Falsifying category No.{0}.", NUM_OF_PATTERN[MODE_CAT500 - 1, 0]); Console.WriteLine(" Falsifying category No.{0}.", NUM_OF_PATTERN[MODE_CAT500 - 1, 0]);
for (int i = 500; i <= MAX_OF_CAT500; i++) for (int i = 500; i <= MAX_OF_CAT500; i++)
{ {
FalsifyingData(i, prop, improperData); if (FalsifyingData(i, prop, improperData))
Console.WriteLine(" Complete falsifying No.{0}.", i); {
Console.WriteLine(" Complete falsifying No.{0}.", i);
}
} }
Console.WriteLine(" Complete falsifying Cat.{0}.\n", NUM_OF_PATTERN[MODE_CAT500 - 1, 0]); Console.WriteLine(" Complete falsifying Cat.{0}.\n", NUM_OF_PATTERN[MODE_CAT500 - 1, 0]);
break; break;
default: // 1パターンのみを個別指定 default: // 1パターンのみを個別指定
Console.WriteLine(" Falsifying pattern No.{0}.", falsifyingMode); Console.WriteLine(" Falsifying pattern No.{0}.", falsifyingMode);
FalsifyingData(falsifyingMode, prop, improperData); if (FalsifyingData(falsifyingMode, prop, improperData))
Console.WriteLine(" Complete falsifying No.{0}.\n", falsifyingMode); {
Console.WriteLine(" Complete falsifying No.{0}.\n", falsifyingMode);
}
else
{
Console.WriteLine(" No.{0} isn't support by specified type.\n", falsifyingMode);
}
break; break;
} }
} }

View File

@ -34,6 +34,7 @@ partial class Program
private const int FRONT_CONTENT = 104; private const int FRONT_CONTENT = 104;
private const int FRONT_PUBLIC_SAVE = FRONT_CONTENT + MAX_CONTENTS; private const int FRONT_PUBLIC_SAVE = FRONT_CONTENT + MAX_CONTENTS;
private const int FRONT_SUB_BANNER = FRONT_PUBLIC_SAVE + 1; private const int FRONT_SUB_BANNER = FRONT_PUBLIC_SAVE + 1;
private const int FRONT_PRIVATE_SAVE = FRONT_SUB_BANNER + 1;
private const int REAR_BANNER = 200; // ブロック内データ本体の後 private const int REAR_BANNER = 200; // ブロック内データ本体の後
private const int REAR_HEADER = 201; private const int REAR_HEADER = 201;
@ -42,6 +43,7 @@ partial class Program
private const int REAR_CONTENT = 204; private const int REAR_CONTENT = 204;
private const int REAR_PUBLIC_SAVE = REAR_CONTENT + MAX_CONTENTS; private const int REAR_PUBLIC_SAVE = REAR_CONTENT + MAX_CONTENTS;
private const int REAR_SUB_BANNER = REAR_PUBLIC_SAVE + 1; private const int REAR_SUB_BANNER = REAR_PUBLIC_SAVE + 1;
private const int REAR_PRIVATE_SAVE = REAR_SUB_BANNER + 1;
private const int REAR_DATA = 99; // データ全体の後 private const int REAR_DATA = 99; // データ全体の後
@ -62,11 +64,11 @@ partial class Program
private const int MIN_OF_CAT500 = 500; private const int MIN_OF_CAT500 = 500;
// 各カテゴリでの最大番号 // 各カテゴリでの最大番号
private const int MAX_OF_CAT100 = 118; private const int MAX_OF_CAT100 = 121;
private const int MAX_OF_CAT200 = 214; private const int MAX_OF_CAT200 = 218;
private const int MAX_OF_CAT300 = 303; private const int MAX_OF_CAT300 = 303;
private const int MAX_OF_CAT400 = 415; private const int MAX_OF_CAT400 = 419;
private const int MAX_OF_CAT500 = 515; private const int MAX_OF_CAT500 = 519;
private static readonly int[,] NUM_OF_PATTERN = new int[,] private static readonly int[,] NUM_OF_PATTERN = new int[,]
{ {
@ -97,7 +99,8 @@ partial class Program
Console.WriteLine("./FalsifyingTwlBackup.exe BACKUP_FILE ENC_KEY_FILE MAC_KEY_FILE [-mode MODE] [-type TYPE]"); Console.WriteLine("./FalsifyingTwlBackup.exe BACKUP_FILE ENC_KEY_FILE MAC_KEY_FILE [-mode MODE] [-type TYPE]");
Console.WriteLine(" BACKUP_FILE : *.bin"); Console.WriteLine(" BACKUP_FILE : *.bin");
Console.WriteLine(" ENC_KEY_FILE : *.txt"); Console.WriteLine(" ENC_KEY_FILE : *.txt");
Console.WriteLine(" MAC_KEY_FILE : *.txt\n"); Console.WriteLine(" MAC_KEY_FILE : *.txt");
Console.WriteLine();
Console.WriteLine(" MODE"); Console.WriteLine(" MODE");
Console.WriteLine(" all (default) : output all falsifying pattern"); Console.WriteLine(" all (default) : output all falsifying pattern");
Console.WriteLine(" cat:CAT_NUM : output all pattern of CAT_NUM category"); Console.WriteLine(" cat:CAT_NUM : output all pattern of CAT_NUM category");
@ -105,6 +108,12 @@ partial class Program
Console.WriteLine(" each:PAT_NUM : output PAT_NUM pattern"); Console.WriteLine(" each:PAT_NUM : output PAT_NUM pattern");
Console.WriteLine(" ex) -mode each:204 -> falsifying 204 only"); Console.WriteLine(" ex) -mode each:204 -> falsifying 204 only");
Console.WriteLine(" verify : verify backup file"); Console.WriteLine(" verify : verify backup file");
Console.WriteLine();
Console.WriteLine(" TYPE");
Console.WriteLine(" normal (default) : normal bkp type");
Console.WriteLine(" wps : bkp with private save type");
Console.WriteLine(" legacy : legacy bkp type");
Environment.Exit(-1); Environment.Exit(-1);
} }