mirror of
https://github.com/Maschell/JNUSTool.git
synced 2024-11-27 18:34:18 +01:00
added hash checks and auto update
- Added serval hash checks (h0-h3 + h3 file hash) - If the decrypted file already exists, but the hash is missing it'll re downloaded. - to download the meta.xml the beginning the cached files will be used if they exist. - improved content type detection (fixed issue with some wrong decrypted files in the code folder) - added an automatic updatelist.csv updater - refactoring / code cleanup / several small fixes I don't remember note: make sure to use the new config file. It contains the URL's for the auto update feature
This commit is contained in:
parent
1177adff2c
commit
f03719487f
BIN
jar/JNUSTool.jar
BIN
jar/JNUSTool.jar
Binary file not shown.
@ -1,3 +1,5 @@
|
||||
http://ccs.cdn.wup.shop.nintendo.net/ccs/download
|
||||
[COMMONKEY]
|
||||
updatetitles.csv
|
||||
updatetitles.csv
|
||||
https://tagaya.wup.shop.nintendo.net/tagaya/versionlist/EUR/EU/latest_version
|
||||
https://tagaya-wup.cdn.nintendo.net/tagaya/versionlist/EUR/EU/list/%d.versionlist
|
@ -1,386 +1,393 @@
|
||||
0005000E-10100600;1;WUP;00AF;WUP-U-AKNJ;AKNJAF;TEKKEN TAG TOURNAMENT 2 Wii U EDITION;16
|
||||
0005000E-10101B00;4;WUP;0001;WUP-U-APLP;APLP01;LEGO® CITY UNDERCOVER;16
|
||||
0005000E-10101C00;1;WUP;0001;WUP-U-ARPJ;ARPJ01;New SUPER MARIO BROS. U;32,48,65
|
||||
0005000E-10101D00;2;WUP;0001;WUP-U-ARPE;ARPE01;New SUPER MARIO BROS. U;32,48,64
|
||||
0005000E-10101E00;4;WUP;0001;WUP-U-ARPP;ARPP01;New SUPER MARIO BROS. U;32,48,64,80
|
||||
0005000E-10101F00;1;WUP;0001;WUP-U-ALCJ;ALCJ01;Nintendo Land;32
|
||||
0005000E-10102000;2;WUP;0001;WUP-U-ALCE;ALCE01;Nintendo Land;32
|
||||
0005000E-10102100;4;WUP;0001;WUP-U-ALCP;ALCP01;Nintendo Land;32
|
||||
0005000E-10102200;1;WUP;0001;WUP-U-ASTJ;ASTJ01;Wii Fit U;32,48,64,81
|
||||
0005000E-10102300;2;WUP;0001;WUP-U-ASTE;ASTE01;Wii Fit U;16,48,64,81
|
||||
0005000E-10102400;4;WUP;0001;WUP-U-ASTP;ASTP01;Wii Fit U;16,48,64,81
|
||||
0005000E-10104D00;1;WUP;0008;WUP-U-AHDJ;AHDJ08;MONSTER HUNTER 3(tri-)G HD Ver.;16,32,48,65,80,96
|
||||
0005000E-10106900;1;WUP;0001;WUP-U-AURJ;AURJ01;Mario & Sonic at the Sochi 2014 Olympic Winter Games;16,32
|
||||
0005000E-10106B00;2;WUP;0041;WUP-U-ASSE;ASSE41;Assassin's Creed® III;16,32,48,64,80
|
||||
0005000E-1010AE00;2;WUP;0041;WUP-U-AJDE;AJDE41;JUST DANCE 4;16,32
|
||||
0005000E-1010AF00;2;WUP;0041;WUP-U-AMVE;AMVE41;Marvel Avengers™: Battle for Earth;16
|
||||
0005000E-1010B000;2;WUP;0041;WUP-U-ARBE;ARBE41;Rabbids Land;16
|
||||
0005000E-1010B300;2;WUP;008P;WUP-U-AS2E;AS2E8P;Sonic & All-Stars Racing Transformed;16,32,48
|
||||
0005000E-1010B400;2;WUP;0041;WUP-U-ASPE;ASPE41;ESPN Sports Connection;16,33
|
||||
0005000E-1010B600;2;WUP;0041;WUP-U-AYSE;AYSE41;Your Shape® Fitness Evolved 2013;16,32
|
||||
0005000E-1010C700;2;WUP;0001;WUP-U-AURE;AURE01;Mario & Sonic at the Sochi 2014 Olympic Winter Games;16,32
|
||||
0005000E-1010C800;4;WUP;0001;WUP-U-AURP;AURP01;Mario & Sonic at the Sochi 2014 Olympic Winter Games;16,32
|
||||
0005000E-1010CF00;2;WUP;0052;WUP-U-AECE;AECE52;Call of Duty: Black Ops II;16,32,48,64,80,96,112,128
|
||||
0005000E-1010DA00;2;WUP;0054;WUP-U-ANBE;ANBE54;NBA 2K13;16,32
|
||||
0005000E-1010DC00;2;WUP;0069;WUP-U-AMEE;AMEE69;Mass Effect™ 3 Special Edition;16
|
||||
0005000E-1010DD00;2;WUP;0041;WUP-U-AZUE;AZUE41;ZombiU;16,32
|
||||
0005000E-1010E300;2;WUP;0041;WUP-U-AS9E;AS9E41;Splinter Cell Blacklist;16,32,48
|
||||
0005000E-1010EA00;1;WUP;00C8;WUP-U-AHBJ;AHBJC8;WARRIORS OROCHI 3 Hyper;16,32,48,64
|
||||
0005000E-1010EB00;1;WUP;0001;WUP-P-AMKJ;AMKJ01;MARIO KART 8;17,33,48,64
|
||||
0005000E-1010EC00;2;WUP;0001;WUP-P-AMKE;AMKE01;MARIO KART 8;16,32,48,64
|
||||
0005000E-1010ED00;4;WUP;0001;WUP-P-AMKP;AMKP01;MARIO KART 8;16,32,48,64
|
||||
0005000E-1010EE00;4;WUP;0069;WUP-U-AF3P;AF3P69;FIFA 13 ;16
|
||||
0005000E-1010EF00;4;WUP;0041;WUP-U-AZUP;AZUP41;ZombiU;16,32
|
||||
0005000E-1010F000;4;WUP;0041;WUP-U-AJDP;AJDP41;JUST DANCE 4;16,32
|
||||
0005000E-1010F500;4;WUP;0069;WUP-U-AMEP;AMEP69;Mass Effect™ 3 Special Edition;16
|
||||
0005000E-1010F600;4;WUP;0041;WUP-U-ASSP;ASSP41;Assassin's Creed® III;16,32,48,64,80
|
||||
0005000E-1010F700;4;WUP;0041;WUP-U-AYSP;AYSP41;Your Shape® Fitness Evolved 2013;16,33
|
||||
0005000E-1010F800;4;WUP;00AF;WUP-U-AKNP;AKNPAF;TEKKEN TAG TOURNAMENT 2 Wii U EDITION;32
|
||||
0005000E-1010FB00;4;WUP;00NK;WUP-U-WDLP;WDLPNK;Puddle;16
|
||||
0005000E-1010FC00;4;WUP;0041;WUP-U-ARBP;ARBP41;Rabbids Land;16
|
||||
0005000E-1010FF00;4;WUP;00WR;WUP-U-AGPP;AGPPWR;Game Party Champions;16
|
||||
0005000E-10110000;2;WUP;00AF;WUP-U-AKNE;AKNEAF;TEKKEN TAG TOURNAMENT 2 Wii U EDITION;32
|
||||
0005000E-10110100;2;WUP;00JX;WUP-U-WASE;WASEJX;Nano Assault Neo;17
|
||||
0005000E-10110200;2;WUP;00C8;WUP-U-AHBE;AHBEC8;WARRIORS OROCHI 3 Hyper(NA);16,32
|
||||
0005000E-10110600;4;WUP;00JX;WUP-U-WASP;WASPJX;Nano Assault Neo;17
|
||||
0005000E-10110800;4;WUP;0041;WUP-U-AMVP;AMVP41;Marvel Avengers™: Battle for Earth;16
|
||||
0005000E-10110900;1;WUP;00C8;WUP-U-ANGJ;ANGJC8;NINJA GAIDEN 3: Razor's Edge;16,32,48,64
|
||||
0005000E-10110A00;2;WUP;0001;WUP-U-ANGE;ANGE01;NINJA GAIDEN 3: Razor's Edge;16,32,48,64,80
|
||||
0005000E-10110B00;4;WUP;0001;WUP-U-ANGP;ANGP01;NINJA GAIDEN 3: Razor's Edge;17,32,48
|
||||
0005000E-10110E00;1;WUP;0001;WUP-P-AXFJ;AXFJ01;Super Smash Bros. for Wii U;16,49,64,80,96,112,128,144,160,176,192,208,224,288
|
||||
0005000E-10111700;2;WUP;00WR;WUP-U-AJSE;AJSEWR;Injustice: Gods Among Us;16
|
||||
0005000E-10111A00;4;WUP;00WR;WUP-U-AJSP;AJSPWR;Injustice: Gods Among Us;16
|
||||
0005000E-10111C00;1;WUP;00C8;WUP-U-AG9J;AG9JC8;Romance of the Three Kingdoms 12;16,33
|
||||
0005000E-10111D00;4;WUP;0041;WUP-U-ASPP;ASPP41;Sports Connection;16
|
||||
0005000E-10111F00;4;WUP;008P;WUP-U-AS2P;AS2P8P;Sonic & All-Stars Racing Transformed;32,48
|
||||
0005000E-10112000;2;WUP;00G9;WUP-U-ACRE;ACREG9;THE CROODS;16
|
||||
0005000E-10112100;4;WUP;0041;WUP-U-AKFP;AKFP41;Know Your Friends;16
|
||||
0005000E-10112200;4;WUP;00FZ;WUP-U-WBDP;WBDPFZ;Trine 2 Director's Cut;16
|
||||
0005000E-10112300;1;WUP;0041;WUP-U-AZUJ;AZUJ41;ZombiU;16,32
|
||||
0005000E-10112400;1;WUP;0041;WUP-U-ASSJ;ASSJ41;Assassin's Creed® III;16,32,48,64,80
|
||||
0005000E-10112500;1;WUP;0041;WUP-U-ASPJ;ASPJ41;Sports Connection;17
|
||||
0005000E-10112800;1;WUP;0041;WUP-U-AS9J;AS9J41;Splinter Cell Blacklist;17,32,48
|
||||
0005000E-10112B00;4;WUP;00C8;WUP-U-AHBP;AHBPC8;WARRIORS OROCHI 3 Hyper(EU);16,32
|
||||
0005000E-10112F00;4;WUP;0054;WUP-U-ANBP;ANBP54;NBA 2K13;32
|
||||
0005000E-10113000;1;WUP;0013;WUP-U-AMEJ;AMEJ13;Mass Effect™ 3 Special Edition;16
|
||||
0005000E-10113100;1;WUP;0008;WUP-U-ABHJ;ABHJ08;BIOHAZARD REVELATIONS Unveiled Edition;16
|
||||
0005000E-10113400;4;WUP;0052;WUP-U-AECP;AECP52;Call of Duty: Black Ops II;16,32,48,64,80,96,112,128
|
||||
0005000E-10113500;4;WUP;0052;WUP-U-AECI;AECI52;Call of Duty: Black Ops II;16,32,48,64,80,96,112,144
|
||||
0005000E-10113700;4;WUP;0052;WUP-U-AECD;AECD52;Call of Duty: Black Ops II;16,32,48,64,80,96,112,144
|
||||
0005000E-10113800;4;WUP;00Y4;WUP-U-WBAP;WBAPY4;Zen Pinball 2;17,32,48,65,80,96
|
||||
0005000E-10113C00;2;WUP;00GT;WUP-U-AFBE;AFBEGT;Funky Barn;16
|
||||
0005000E-10115E00;1;WUP;00GD;WUP-U-ADQJ;ADQJGD;Dragon Quest X;16,80,128,144,160,192,208,224,240,256,272,288,304,336,368,384,400,416,432,448,464,480,496,512,528,544,560,624,640,656,672,688,704,736,752,784,800,816,832,848,960,976,992,1008,1024,1040,1056,1072,1088,1104,1120,1136,1152,1168,1184,1200,1216,1232,1248,1264,1280,1296,1312,1328,1344,1360,1376,1392,1408,1424,1440,1456,1472,1488,1504,1520,1536,1552,1568,1584,1600,1616,1632,1648,1664,1680,1696,1712,1728,1744,1760,1776,1792,1808,1824,1840,1856,1872,1888,1904,1920,1936,1952,1968,1984,2000,2016,2032,2048,2064,2080,2096,2112,2128,2144,2160,2176,2192,2208,2224,2240,2256,2272,2288,2304,2320,2336,2352,2384,2400,2416,2432,2448,2464,2480,2496,2512,2528,2544,2560,2576,2592,2608,2624,2640,2656,2672,2688,2704,2720,2736,2752,2768,2784,2800,2816
|
||||
0005000E-10115F00;2;WUP;00Y4;WUP-U-WBAE;WBAEY4;Zen Pinball 2;16,32,48,65,80,96
|
||||
0005000E-10116100;1;WUP;0001;WUP-P-AX5J;AX5J01;XenobladeX;16,32,48
|
||||
0005000E-10116300;1;WUP;0001;WUP-U-ACMJ;ACMJ01;The Wonderful 101;16
|
||||
0005000E-10116500;4;WUP;00TW;WUP-U-WAAP;WAAPTW;Toki Tori 2+;16,32
|
||||
0005000E-10116600;1;WUP;00C8;WUP-U-AH9J;AH9JC8;Fist of the North Star: Ken's Rage 2;17
|
||||
0005000E-10117200;4;WUP;0008;WUP-U-AHDP;AHDP08;MONSTER HUNTER 3 ULTIMATE;16,32
|
||||
0005000E-10117700;4;WUP;00TJ;WUP-U-WCAP;WCAPTJ;Chasing Aurora;17
|
||||
0005000E-10118300;2;WUP;0008;WUP-U-AHDE;AHDE08;MONSTER HUNTER 3 ULTIMATE;16,32
|
||||
0005000E-10118400;4;WUP;00GT;WUP-U-AFBP;AFBPGT;Funky Barn;16
|
||||
0005000E-1011A700;4;WUP;0041;WUP-U-AZUD;AZUD41;ZombiU;16,32
|
||||
0005000E-1011AF00;2;WUP;00XY;WUP-U-WBTE;WBTEXY;BIT.TRIP Presents... Runner2: Future Legend of Rhythm Alien;16,33
|
||||
0005000E-1011B300;4;WUP;00TZ;WUP-U-AFBZ;AFBZTZ;Funky Barn (Download Version);16
|
||||
0005000E-1011B400;1;WUP;00GD;WUP-U-AECJ;AECJGD;Call of Duty: Black Ops II;16,32,48,64,80,96
|
||||
0005000E-1011B600;1;WUP;00GD;WUP-U-AQDJ;AQDJGD;Dragon Quest X Beta test;16,32,48,64,96
|
||||
0005000E-1011B700;4;WUP;0041;WUP-U-WLAP;WLAP41;Uplay;16,32,33,48,64
|
||||
0005000E-1011BA00;2;WUP;0041;WUP-U-WLAE;WLAE41;Uplay;16,33,48,64
|
||||
0005000E-1011C000;2;WUP;00TJ;WUP-U-WCAE;WCAETJ;Chasing Aurora;16
|
||||
0005000E-10128400;4;WUP;0069;WUP-U-ANSP;ANSP69;Need for Speed™ Most Wanted U;16,32
|
||||
0005000E-10128700;2;WUP;00TW;WUP-U-WAAE;WAAETW;Toki Tori 2+;16,32
|
||||
0005000E-10128800;2;WUP;0069;WUP-U-ANSE;ANSE69;Need for Speed™ Most Wanted U;16,32
|
||||
0005000E-10128A00;2;WUP;00FZ;WUP-U-WBDE;WBDEFZ;Trine 2 Director's Cut;16
|
||||
0005000E-10128F00;2;WUP;008P;WUP-U-ASNE;ASNE8P;SONIC LOST WORLD;16,32,48
|
||||
0005000E-10129000;2;WUP;0008;WUP-U-WDKE;WDKE08;DuckTales: Remastered;16,32
|
||||
0005000E-10129200;4;WUP;0008;WUP-U-WDKP;WDKP08;DuckTales: Remastered;16,32
|
||||
0005000E-1012AC00;4;WUP;0041;WUP-U-AS9P;AS9P41;Splinter Cell Blacklist;16,32,48
|
||||
0005000E-1012B100;4;WUP;008P;WUP-U-ASNP;ASNP8P;SONIC LOST WORLD;16,32,48
|
||||
0005000E-1012B400;4;WUP;0008;WUP-U-ABHP;ABHP08;RESIDENT EVIL REVELATIONS;16
|
||||
0005000E-1012B700;1;WUP;0013;WUP-U-ANSJ;ANSJ13;Need for Speed™ Most Wanted U;16,32
|
||||
0005000E-1012BC00;1;WUP;0001;WUP-U-AC3J;AC3J01;PIKMIN 3;17,48,64,80,96
|
||||
0005000E-1012BD00;2;WUP;0001;WUP-U-AC3E;AC3E01;PIKMIN 3;33,48,64,80,96
|
||||
0005000E-1012BE00;4;WUP;0001;WUP-U-AC3P;AC3P01;PIKMIN 3;17,48,64,80,96
|
||||
0005000E-1012C500;4;WUP;00AF;WUP-U-ACRP;ACRPAF;THE CROODS;16
|
||||
0005000E-1012CF00;2;WUP;0008;WUP-U-ABHE;ABHE08;RESIDENT EVIL REVELATIONS;16
|
||||
0005000E-1012DC00;2;WUP;0001;WUP-U-ACME;ACME01;The Wonderful 101;16
|
||||
0005000E-1012F000;2;WUP;00JX;WUP-P-WFSE;WFSEJX;FAST Racing NEO;33,48
|
||||
0005000E-1012F100;1;WUP;0001;WUP-U-AWSJ;AWSJ01;Wii Sports Club;16,32,48,64,80,96,112
|
||||
0005000E-10131D00;1;WUP;0001;WUP-P-ASEJ;ASEJ01;幻影異聞録♯FE;17,32
|
||||
0005000E-10131F00;1;WUP;0001;WUP-U-AYCJ;AYCJ01;yoshi's woolly world;32
|
||||
0005000E-10132400;4;WUP;00WR;WUP-U-ALMP;ALMPWR;LEGO® MARVEL Super Heroes;16,32,48
|
||||
0005000E-10132500;1;WUP;0001;WUP-U-WB9J;WB9J01;Wii Fit U Quick Check;16,64,81
|
||||
0005000E-10132600;2;WUP;0001;WUP-U-WB9E;WB9E01;Wii Fit U Quick Check;16,64,81
|
||||
0005000E-10132700;4;WUP;0001;WUP-U-WB9P;WB9P01;Wii Fit U Quick Check;16,64,81
|
||||
0005000E-10132800;2;WUP;00UP;WUP-U-WEPE;WEPEUP;Unepic EnjoyUp Games;16,32
|
||||
0005000E-10132900;2;WUP;004Q;WUP-U-ADSE;ADSE4Q;Disney INFINITY;16,32,49
|
||||
0005000E-10132A00;4;WUP;00Y4;WUP-U-WA2P;WA2PY4;Star Wars Pinball;17,32,48
|
||||
0005000E-10132B00;2;WUP;00WR;WUP-P-ALME;ALMEWR;LEGO® MARVEL Super Heroes;16,32
|
||||
0005000E-10135200;2;WUP;00Y4;WUP-U-WA2E;WA2EY4;Star Wars Pinball;16,33,48
|
||||
0005000E-10135300;4;WUP;0001;WUP-U-ACMP;ACMP01;The Wonderful 101;16
|
||||
0005000E-10135700;1;WUP;008P;WUP-U-ASNJ;ASNJ8P;SONIC LOST WORLD;16,32,48
|
||||
0005000E-10136300;4;WUP;00XY;WUP-U-WBTP;WBTPXY;BIT.TRIP Presents... Runner2: Future Legend of Rhythm Alien;17
|
||||
0005000E-10136C00;4;WUP;00WR;WUP-U-AZEP;AZEPWR;Batman™: Arkham Origins;16
|
||||
0005000E-10136F00;4;WUP;004Q;WUP-U-ADSP;ADSP4Q;Disney Infinity;16,32,49
|
||||
0005000E-10137000;4;WUP;004Q;WUP-U-ADSZ;ADSZ4Q;Disney Infinity;16,32,49
|
||||
0005000E-10137C00;2;WUP;00WR;WUP-U-AZEE;AZEEWR;Batman™: Arkham Origins;16
|
||||
0005000E-10137F00;2;WUP;0001;WUP-P-ARKE;ARKE01;Donkey Kong Country Tropical Freeze;16
|
||||
0005000E-10138300;4;WUP;0001;WUP-P-ARKP;ARKP01;Donkey Kong Country Tropical Freeze;17
|
||||
0005000E-10138700;4;WUP;00YV;WUP-P-WB6P;WB6PYV;Spin the Bottle: Bumpie's Party;16,33
|
||||
0005000E-10138800;4;WUP;0041;WUP-U-ASBP;ASBP41;Assassin's Creed® IV Black Flag;16,32
|
||||
0005000E-10138B00;2;WUP;0041;WUP-U-ASBE;ASBE41;Assassin's Creed® IV Black Flag;16,32
|
||||
0005000E-10138E00;4;WUP;0041;WUP-U-WB7P;WB7P41;Rayman Legends Challenges App;16
|
||||
0005000E-10138F00;1;WUP;0001;WUP-U-ADNJ;ADNJ01;Devil's Third;16
|
||||
0005000E-10139200;2;WUP;0052;WUP-U-ASFE;ASFE52;Skylanders SWAP Force;16
|
||||
0005000E-10139500;2;WUP;0041;WUP-U-WB7E;WB7E41;Rayman Legends Challenges App;16
|
||||
0005000E-10139900;2;WUP;0041;WUP-P-AJ5E;AJ5E41;JUST DANCE® 2014;16
|
||||
0005000E-10140400;4;WUP;0052;WUP-U-ASFP;ASFP52;Skylanders SWAP Force;16
|
||||
0005000E-10140700;1;WUP;00WR;WUP-U-AJSJ;AJSJWR;Injustice: Gods Among Us;16
|
||||
0005000E-10142700;4;WUP;0001;WUP-P-AA9P;AA9P01;Art Academy: SketchPad;16
|
||||
0005000E-10142A00;2;WUP;005G;WUP-U-AZBE;AZBE5G;Zumba Fitness World Party;16
|
||||
0005000E-10142B00;1;WUP;0001;WUP-P-AA9J;AA9J01;Art Academy: SketchPad;16
|
||||
0005000E-10142C00;2;WUP;0001;WUP-P-AA9E;AA9E01;Art Academy: SketchPad;16
|
||||
0005000E-10143F00;4;WUP;0041;WUP-P-AJ5P;AJ5P41;JUST DANCE® 2014;16
|
||||
0005000E-10144000;2;WUP;00G9;WUP-U-ADVE;ADVEG9;Adventure Time: Explore the Dungeon Because I Don't Know!;16
|
||||
0005000E-10144800;1;WUP;0001;WUP-P-ARKJ;ARKJ01;Donkey Kong Country Tropical Freeze;17
|
||||
0005000E-10144D00;2;WUP;0001;WUP-U-AWSE;AWSE01;Wii Sports Club;16,33,48,64,80,96,112
|
||||
0005000E-10144E00;4;WUP;0001;WUP-U-AWSP;AWSP01;Wii Sports Club;16,33,48,64,80,96,112
|
||||
0005000E-10144F00;2;WUP;0001;WUP-P-AXFE;AXFE01;Super Smash Bros. for Wii U;32,48,64,80,96,112,128,144,160,176,192,208,224,288
|
||||
0005000E-10145000;4;WUP;0001;WUP-P-AXFP;AXFP01;Super Smash Bros. for Wii U;32,48,64,80,96,112,128,144,160,176,192,208,224,288
|
||||
0005000E-10145600;7;WUP;0001;WUP-U-ADBA;ADBA01;Animal Crossing Plaza;16
|
||||
0005000E-10145800;4;WUP;00UP;WUP-U-WEPP;WEPPUP;Unepic EnjoyUp Games;16,32
|
||||
0005000E-10145900;4;WUP;00HL;WUP-U-WCDP;WCDPHL;Coaster Crazy Deluxe;16
|
||||
0005000E-10145F00;1;WUP;0001;WUP-P-WMGJ;WMGJ01;NES REMIX;16
|
||||
0005000E-10146000;2;WUP;0001;WUP-P-WMGE;WMGE01;NES REMIX;16
|
||||
0005000E-10146100;4;WUP;0001;WUP-P-WMGP;WMGP01;NES REMIX;16
|
||||
0005000E-10146800;2;WUP;0052;WUP-P-ACPE;ACPE52;Call of Duty: Ghosts;16,32,48,64,80,96,112
|
||||
0005000E-10147600;4;WUP;00DZ;WUP-P-WEVP;WEVPDZ;EvoFish;17
|
||||
0005000E-10147F00;2;WUP;00YV;WUP-P-WB6E;WB6EYV;Spin the Bottle: Bumpie's Party;16,32
|
||||
0005000E-10148000;1;WUP;00AF;WUP-P-AUNJ;AUNJAF;ONE PIECE UNLIMITED WORLD R;16
|
||||
0005000E-10148200;2;WUP;00UP;WUP-U-WAEE;WAEEUP;Rock 'N Racing Off Road;16
|
||||
0005000E-10148F00;1;WUP;0041;WUP-U-WLAJ;WLAJ41;Uplay;16
|
||||
0005000E-10149200;4;WUP;00SS;WUP-U-WDFP;WDFPSS;Spot The Differences: Party!;16,32
|
||||
0005000E-10149500;2;WUP;00CS;WUP-P-WKTE;WKTECS;Scram Kitty and his Buddy on Rails;16,32
|
||||
0005000E-10149700;1;WUP;0001;WUP-P-WAUJ;WAUJ01;役満 鳳凰;34,48,64
|
||||
0005000E-1014C600;4;WUP;00CX;WUP-U-WGSP;WGSPCX;Giana Sisters Twisted Dreams;16
|
||||
0005000E-1014C800;1;WUP;0041;WUP-U-ASBJ;ASBJ41;Assassin's Creed® IV Black Flag;16
|
||||
0005000E-1014CB00;2;WUP;00CX;WUP-P-WGSE;WGSECX;Giana Sisters Twisted Dreams;16
|
||||
0005000E-1014CF00;2;WUP;00HL;WUP-U-WCDE;WCDEHL;Coaster Crazy Deluxe;16,32
|
||||
0005000E-1014D100;4;WUP;00CS;WUP-U-WKTP;WKTPCS;Scram Kitty and his Buddy on Rails;17,32
|
||||
0005000E-1014D900;1;WUP;008P;WUP-P-APTJ;APTJ8P;PUYOPUYOTETRIS;16,32
|
||||
0005000E-1014DA00;1;WUP;0008;WUP-U-AMFJ;AMFJ08;Monster Hunter Frontier G;80,96,112,128,144,160,176,192,208,224,240,256,288,304,320,336,352,368,400,432,448,464,480,496,512,528,544,560,576,592,608,624,640,656,672,688,704,720,736,752,768,784,800,816,832,848,864,880,896,912,928,944,960,976,992,1008,1024,1040,1056,1072,1088,1104,1120,1136,1152,1168,1184,1200,1216,1232,1248,1264,1280,1296,1312,1328,1344,1360,1376,1392,1408,1424,1440,1456,1472,1488,1504,1520,1536,1552,1568,1584,1600,1616
|
||||
0005000E-1014DE00;2;WUP;00WR;WUP-U-ALAE;ALAEWR;The LEGO® Movie Videogame;16
|
||||
0005000E-1014E000;4;WUP;00WR;WUP-U-ALAP;ALAPWR;The LEGO® Movie Videogame;18
|
||||
0005000E-1014E100;4;WUP;00AF;WUP-U-ADVP;ADVPAF;Adventure Time: Explore the Dungeon Because I Don't Know!;16
|
||||
0005000E-1014E300;4;WUP;00GT;WUP-U-AZBP;AZBPGT;Zumba Fitness World Party;16
|
||||
0005000E-10154600;1;WUP;00WR;WUP-U-AZEJ;AZEJWR;Batman™: Arkham Origins;16
|
||||
0005000E-10154D00;4;WUP;00BU;WUP-U-WC3P;WC3PBU;The Mysterious Cities of Gold: Secret Paths;16
|
||||
0005000E-10156100;4;WUP;0052;WUP-P-ACPP;ACPP52;Call of Duty: Ghosts;16,32,48,64,80,96,112
|
||||
0005000E-10156500;2;WUP;00BU;WUP-U-WC3E;WC3EBU;The Mysterious Cities of Gold: Secret Paths;16
|
||||
0005000E-10157600;4;WUP;0052;WUP-P-ACPI;ACPI52;Call of Duty: Ghosts;16,32,48,64,80,96,112
|
||||
0005000E-10157900;1;WUP;00GD;WUP-P-ACPJ;ACPJGD;Call of Duty: Ghosts;16,32,48,64,80,97,112
|
||||
0005000E-10159800;1;WUP;0001;WUP-U-AFCJ;AFCJ01;Wii Fit U (Free);48,64,81
|
||||
0005000E-10159900;2;WUP;0001;WUP-U-AFCE;AFCE01;Wii Fit U (Free);48,64,81
|
||||
0005000E-10159A00;4;WUP;0001;WUP-U-AFCP;AFCP01;Wii Fit U (promo);48,64,81
|
||||
0005000E-1015A300;1;WUP;00AF;WUP-U-ADSJ;ADSJAF;Disney INFINITY;17
|
||||
0005000E-1015B200;2;WUP;0041;WUP-P-ACLE;ACLE41;CHILD of LIGHT;16
|
||||
0005000E-1015D300;2;WUP;00AS;WUP-P-WLCE;WLCEAS;Lucadian Chronicles;16,32
|
||||
0005000E-1015EB00;1;WUP;00R7;WUP-U-WHYJ;WHYJR7;Mighty Switch Force!™ Hyper Drive Edition;18
|
||||
0005000E-10161F00;1;WUP;0001;WUP-U-ABAJ;ABAJ01;Mario Party 10;16
|
||||
0005000E-10162300;4;WUP;00YR;WUP-U-WCZP;WCZPYR;Color Zen;17
|
||||
0005000E-10162B00;1;WUP;0001;WUP-P-AGMJ;AGMJ01;Splatoon;16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272
|
||||
0005000E-10162D00;2;WUP;0001;WUP-U-ABAE;ABAE01;Mario Party 10;16
|
||||
0005000E-10169600;4;WUP;00UP;WUP-U-WEPS;WEPSUP;Unepic EnjoyUp Games;16,32
|
||||
0005000E-1016A200;4;WUP;00SS;WUP-U-WBXP;WBXPSS;Bombing Bastards;16
|
||||
0005000E-1016A400;4;WUP;00WR;WUP-P-BTMP;BTMPWR;LEGO® Batman™ 3 Beyond Gotham;16,32,48
|
||||
0005000E-1016A600;1;WUP;00TF;WUP-P-WB6J;WB6JTF;わいわい!みんなでチャレンジ;17
|
||||
0005000E-1016AB00;2;WUP;00SS;WUP-U-WBXE;WBXESS;Bombing Bastards;16
|
||||
0005000E-1016AC00;2;WUP;009T;WUP-U-WMLE;WMLE9T;Armillo;16
|
||||
0005000E-1016AD00;2;WUP;00WR;WUP-P-BTME;BTMEWR;LEGO® Batman™ 3 Beyond Gotham;16,32,48
|
||||
0005000E-1016B200;2;WUP;009V;WUP-U-WMRE;WMRE9V;Master Reboot;16
|
||||
0005000E-1016C700;4;WUP;009T;WUP-U-WMLP;WMLP9T;Armillo;16
|
||||
0005000E-1016CE00;2;WUP;00YR;WUP-U-WCZE;WCZEYR;Color Zen;16
|
||||
0005000E-1016D500;4;WUP;009Y;WUP-P-WCTP;WCTP9Y;Super Toy Cars;22
|
||||
0005000E-1016D800;1;WUP;0041;WUP-P-ACLJ;ACLJ41;CHILD of LIGHT;16
|
||||
0005000E-1016DC00;2;WUP;004Q;WUP-P-ADRE;ADRE4Q;Disney Infinity [2.0];16,32,64,80
|
||||
0005000E-1016DE00;2;WUP;009Y;WUP-P-WCTE;WCTE9Y;Super Toy Cars;16
|
||||
0005000E-1016E100;2;WUP;00AY;WUP-P-WKNE;WKNEAY;Shovel Knight;16,32,48,64,80
|
||||
0005000E-1016E300;2;WUP;008S;WUP-P-WGRE;WGRE8S;GravBlocks+ From Nothing Game Studios;16
|
||||
0005000E-1016E800;4;WUP;009V;WUP-U-WMRP;WMRP9V;Master Reboot;16
|
||||
0005000E-1016EA00;4;WUP;0041;WUP-P-ACLP;ACLP41;CHILD of LIGHT;16
|
||||
0005000E-1016FF00;2;WUP;00NT;WUP-P-WFWE;WFWENT;Flowerworks HD Follie's Adventure;16
|
||||
0005000E-10170200;2;WUP;007Z;WUP-U-WGAE;WGAE7Z;Pier Solar and the Great Architects;16,33
|
||||
0005000E-10170600;1;WUP;00AF;WUP-U-APWJ;APWJAF;KAMEN RIDER BATTRIDE WAR Ⅱ PREMIUM TV&MOVIE SOUND ED.;16
|
||||
0005000E-10170700;1;WUP;00AF;WUP-U-ABWJ;ABWJAF;KAMEN RIDER BATTRIDE WAR Ⅱ;17
|
||||
0005000E-10172A00;2;WUP;009Z;WUP-N-HRLE;HRLE9Z;Crunchyroll;16
|
||||
0005000E-10172B00;4;WUP;009Z;WUP-N-HRLP;HRLP9Z;Crunchyroll;17
|
||||
0005000E-10173300;4;WUP;00UB;WUP-U-WCGP;WCGPUB;Stealth Inc 2 A Game of Clones;16,32
|
||||
0005000E-10175B00;2;WUP;008P;WUP-P-BSSE;BSSE8P;Sonic Boom: Rise of Lyric;16
|
||||
0005000E-10175D00;4;WUP;00AF;WUP-P-AUNP;AUNPAF;ONE PIECE Unlimited World Red;16
|
||||
0005000E-10176500;2;WUP;00UB;WUP-U-WCGE;WCGEUB;Stealth Inc 2 A Game of Clones;16
|
||||
0005000E-10176600;1;WUP;00R5;WUP-P-WG8J;WG8JR5;GREAT RACE;16
|
||||
0005000E-10176900;2;WUP;0001;WUP-P-AGME;AGME01;Splatoon;16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272
|
||||
0005000E-10176A00;4;WUP;0001;WUP-P-AGMP;AGMP01;Splatoon;32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272
|
||||
0005000E-10176F00;4;WUP;0041;WUP-P-BJDP;BJDP41;JUST DANCE® 2015;16
|
||||
0005000E-10177600;2;WUP;0001;WUP-U-ADNE;ADNE01;Devil's Third;16
|
||||
0005000E-10177800;4;WUP;008P;WUP-P-BSSP;BSSP8P;Sonic Boom: Rise of Lyric;16
|
||||
0005000E-10178F00;4;WUP;00AY;WUP-P-WKNP;WKNPAY;Shovel Knight;16,32,48
|
||||
0005000E-10179100;2;WUP;0041;WUP-P-BJDE;BJDE41;JUST DANCE® 2015;16
|
||||
0005000E-1017BE00;1;WUP;0001;WUP-U-BXAJ;BXAJ01;Art Academy: Home Studio;48
|
||||
0005000E-1017BF00;2;WUP;0001;WUP-U-BXAE;BXAE01;Art Academy: Home Studio;17
|
||||
0005000E-1017C600;2;WUP;0052;WUP-P-BK7E;BK7E52;Skylanders Trap Team;16
|
||||
0005000E-1017CD00;1;WUP;00C8;WUP-U-BWPJ;BWPJC8;Hyrule Warriors;32,49,64,80,98,112,113,128,144,160,176,192,208,224,240,256
|
||||
0005000E-1017D800;2;WUP;0001;WUP-U-BWPE;BWPE01;Hyrule Warriors;16,32,48,64,80,96,112,128,144,160,176,192
|
||||
0005000E-1017D900;4;WUP;0001;WUP-U-BWPP;BWPP01;Hyrule Warriors;16,33,48,64,80,96,112,128,144,160,176,192,208
|
||||
0005000E-1017DA00;2;WUP;011S;WUP-P-ACQE;ACQE1S;Costume Quest 2;16
|
||||
0005000E-1017E000;4;WUP;00XQ;WUP-P-WK8P;WK8PXQ;Turtle Tale;16
|
||||
0005000E-1017E200;4;WUP;0102;WUP-P-WTSP;WTSP02;3Souls;16
|
||||
0005000E-1017E700;2;WUP;0102;WUP-P-WTSE;WTSE02;3Souls;16
|
||||
0005000E-10180500;1;WUP;0001;WUP-P-AKBJ;AKBJ01;Captain Toad: Treasure Tracker;16
|
||||
0005000E-10180600;2;WUP;0001;WUP-P-AKBE;AKBE01;Captain Toad: Treasure Tracker;16
|
||||
0005000E-10180700;4;WUP;0001;WUP-P-AKBP;AKBP01;Captain Toad: Treasure Tracker;16
|
||||
0005000E-10181F00;4;WUP;0052;WUP-P-BK7P;BK7P52;Skylanders Trap Team;16
|
||||
0005000E-10182C00;4;WUP;00XT;WUP-U-AJTP;AJTPXT;Jett Tailfin;16
|
||||
0005000E-10183000;2;WUP;010P;WUP-P-ARNE;ARNE0P;Runbow;16,33,49,64
|
||||
0005000E-10183900;2;WUP;00UP;WUP-U-BMVE;BMVEUP;99Moves;16,32
|
||||
0005000E-10184D00;2;WUP;0001;WUP-U-AYCE;AYCE01;Yoshi's Woolly World;17
|
||||
0005000E-10187100;4;WUP;00LW;WUP-U-BUGP;BUGPLW;Underground;16,32
|
||||
0005000E-10188B00;1;WUP;0001;WUP-U-AXYJ;AXYJ01;Kirby and the Rainbow Curse;16
|
||||
0005000E-10188C00;4;WUP;004Q;WUP-P-ADRP;ADRP4Q;Disney Infinity [2.0];16,32,64,80
|
||||
0005000E-10188D00;4;WUP;004Q;WUP-P-ADRZ;ADRZ4Q;Disney Infinity [2.0];16,32,64,80
|
||||
0005000E-10189200;2;WUP;011C;WUP-P-BSPE;BSPE1C;Sportsball;16
|
||||
0005000E-1018C400;1;WUP;00AF;WUP-P-BSFJ;BSFJAF;藤子・F・不二雄キャラクターズ 大集合!SFドタバタパーティー!!;16
|
||||
0005000E-1018D900;1;WUP;00AF;WUP-P-APHJ;APHJAF;LOST REAVERS;17,32,48
|
||||
0005000E-1018DB00;1;WUP;0001;WUP-U-AMAJ;AMAJ01;Super Mario Maker;16,32,48,64,80,96,113,128,144,160,176,192,208
|
||||
0005000E-1018DC00;2;WUP;0001;WUP-U-AMAE;AMAE01;Super Mario Maker;16,32,48,64,80,96,113,128,144,160,176,192,208
|
||||
0005000E-1018DD00;4;WUP;0001;WUP-U-AMAP;AMAP01;Super Mario Maker;32,48,64,80,96,113,128,144,160,176,192,208
|
||||
0005000E-1018DE00;4;WUP;00NK;WUP-U-ATCP;ATCPNK;Tetrobot and Co.;16
|
||||
0005000E-1018ED00;2;WUP;00NK;WUP-U-ATCE;ATCENK;Tetrobot and Co.;16
|
||||
0005000E-10190300;1;WUP;0001;WUP-U-ABJJ;ABJJ01;M & S at the Rio 2016 Olympic Games;48
|
||||
0005000E-10191700;4;WUP;00UP;WUP-U-BMVP;BMVPUP;99Moves;16,32
|
||||
0005000E-10191800;4;WUP;00UP;WUP-U-WAEP;WAEPUP;Rock 'N Racing Off Road;16
|
||||
0005000E-10192200;1;WUP;00AF;WUP-P-BRSJ;BRSJAF;KAMEN RIDER SUMMON RIDE!;16,33,48,64,80
|
||||
0005000E-10193300;4;WUP;006V;WUP-P-BLKP;BLKP6V;Legend of Kay Anniversary;16
|
||||
0005000E-10193400;2;WUP;006V;WUP-P-BLKE;BLKE6V;Legend of Kay Anniversary;16
|
||||
0005000E-10194200;2;WUP;00WR;WUP-P-APZE;APZEWR;LEGO® DIMENSIONS™;16,32,48,64,80,96,112,128,144,160
|
||||
0005000E-10195D00;4;WUP;00WR;WUP-P-APZP;APZPWR;LEGO® DIMENSIONS™;32,48,64,80,96,112,128,144,160,176,192
|
||||
0005000E-10197800;4;WUP;011S;WUP-P-ACQP;ACQP1S;Costume Quest 2;16
|
||||
0005000E-10198F00;4;WUP;00GT;WUP-P-BTXP;BTXPGT;Terraria;17,32
|
||||
0005000E-10199000;1;WUP;0001;WUP-P-AVXJ;AVXJ01;Mario Tennis: Ultra Smash;16,32
|
||||
0005000E-1019AD00;2;WUP;011A;WUP-P-BEQE;BEQE1A;Elliot Quest;16,32,48,64,80,96,114
|
||||
0005000E-1019B200;4;WUP;009Y;WUP-P-BTCP;BTCP9Y;Tachyon Project;16
|
||||
0005000E-1019C300;2;WUP;00GT;WUP-P-BTXE;BTXEGT;Terraria;16,32
|
||||
0005000E-1019C800;1;WUP;0001;WUP-U-AZAJ;AZAJ01;THE LEGEND OF ZELDA Twilight Princess HD;82
|
||||
0005000E-1019E500;2;WUP;0001;WUP-U-AZAE;AZAE01;THE LEGEND OF ZELDA Twilight Princess HD;81
|
||||
0005000E-101A1B00;2;WUP;00RG;WUP-U-BS2E;BS2ERG;Swords & Soldiers II;16
|
||||
0005000E-101A2600;1;WUP;00W4;WUP-U-WKFJ;WKFJW4;Kung Fu Rabbit;16
|
||||
0005000E-101A2E00;1;WUP;00TF;WUP-P-WEXJ;WEXJTF;XType+;16
|
||||
0005000E-101A3500;2;WUP;0001;WUP-P-AVXE;AVXE01;Mario Tennis: Ultra Smash;16,32
|
||||
0005000E-101A3600;4;WUP;0001;WUP-P-AVXP;AVXP01;Mario Tennis: Ultra Smash;32
|
||||
0005000E-101A3B00;2;WUP;00LY;WUP-P-BLPE;BLPELY;Life of Pixel;16
|
||||
0005000E-101B9000;2;WUP;0041;WUP-P-AJ6E;AJ6E41;JUST DANCE® 2016;16,32
|
||||
0005000E-101B9800;4;WUP;0041;WUP-P-AJ6P;AJ6P41;JUST DANCE® 2016;16,32
|
||||
0005000E-101B0400;2;WUP;0001;WUP-U-AFXE;AFXE01;Star Fox Zero;16
|
||||
0005000E-101BA400;2;WUP;0052;WUP-P-AGNE;AGNE52;Guitar Hero Live;16,32,48,64,80,96
|
||||
0005000E-101BB800;4;WUP;011A;WUP-P-BEQP;BEQP1A;Elliot Quest;16,32,48,64,80,97
|
||||
0005000E-101BEC00;2;WUP;0001;WUP-U-BWFE;BWFE01;Star Fox Guard;16
|
||||
0005000E-101BFC00;4;WUP;0052;WUP-P-BS5P;BS5P52;Skylanders SuperChargers;16,32,48,64,80,97
|
||||
0005000E-101A4800;2;WUP;00AF;WUP-P-APHE;APHEAF;LOST REAVERS;16
|
||||
0005000E-101A4900;4;WUP;00LY;WUP-U-BLPP;BLPPLY;Life of Pixel;16
|
||||
0005000E-101A4C00;2;WUP;011F;WUP-P-BSVE;BSVE1F;Stone Shire;18,32
|
||||
0005000E-101A5C00;4;WUP;00WR;WUP-U-ALJP;ALJPWR;LEGO® Jurassic World™;16
|
||||
0005000E-101A5E00;4;WUP;00UB;WUP-U-ALLP;ALLPUB;OlliOlli;16
|
||||
0005000E-101A5F00;2;WUP;00WY;WUP-U-BSXE;BSXEWY;Shantae and the Pirate's Curse;16
|
||||
0005000E-101A6200;2;WUP;00WR;WUP-U-ALJE;ALJEWR;LEGO® Jurassic World™;16
|
||||
0005000E-101A6300;4;WUP;00YR;WUP-U-ACUP;ACUPYR;Cube Life: Island Survival;16,32
|
||||
0005000E-101A6400;2;WUP;00YR;WUP-U-ACUE;ACUEYR;Cube Life: Island Survival;16,33
|
||||
0005000E-101ABC00;2;WUP;0001;WUP-U-AXYE;AXYE01;Kirby and the Rainbow Curse;16
|
||||
0005000E-10191800;4;WUP;00UP;WUP-U-WAEP;WAEPUP;Rock 'N Racing Off Road;16
|
||||
0005000E-10193400;2;WUP;006V;WUP-P-BLKE;BLKE6V;Legend of Kay Anniversary;16
|
||||
0005000E-10197800;4;WUP;011S;WUP-P-ACQP;ACQP1S;Costume Quest 2;16
|
||||
0005000E-10199000;1;WUP;0001;WUP-P-AVXJ;AVXJ01;Mario Tennis: Ultra Smash;16,32
|
||||
0005000E-1019C800;1;WUP;0001;WUP-U-AZAJ;AZAJ01;THE LEGEND OF ZELDA Twilight Princess HD;82
|
||||
0005000E-10182C00;4;WUP;00XT;WUP-U-AJTP;AJTPXT;Jett Tailfin;16
|
||||
0005000E-10183000;2;WUP;010P;WUP-P-ARNE;ARNE0P;Runbow;16,33,49,64,80
|
||||
0005000E-10188C00;4;WUP;004Q;WUP-P-ADRP;ADRP4Q;Disney Infinity [2.0];16,32,64,80
|
||||
0005000E-1018C400;1;WUP;00AF;WUP-P-BSFJ;BSFJAF;藤子・F・不二雄キャラクターズ 大集合!SFドタバタパーティー!!;16
|
||||
0005000E-1018DC00;2;WUP;0001;WUP-U-AMAE;AMAE01;Super Mario Maker;16,32,48,64,80,96,113,128,144,160,176,192,208
|
||||
0005000E-101F7400;4;WUP;008V;WUP-P-AHZP;AHZP8V;Hot Rod Racer;16
|
||||
0005000E-101E9400;4;WUP;010C;WUP-U-BGGP;BGGP0C;Gear Gauntlet;16
|
||||
0005000E-101E3400;2;WUP;011A;WUP-P-AR7E;AR7E1A;Olympia Rising;16
|
||||
0005000E-101E9C00;1;WUP;00S6;WUP-U-ACUJ;ACUJS6;Cube Life: Island Survival;17
|
||||
0005000E-101EA000;1;WUP;00WR;WUP-P-BLGJ;BLGJWR;LEGO® STAR WARS™ The Force Awakens;16
|
||||
0005000E-101ED800;2;WUP;0001;WUP-U-ASEE;ASEE01;Tokyo Mirage Sessions #FE;16
|
||||
0005000E-101D2C00;1;WUP;00SA;WUP-P-ATXJ;ATXJSA;Bike Rider UltraDX WORLD TOUR;16,32
|
||||
0005000E-101D7400;4;WUP;010C;WUP-U-ATTP;ATTP0C;Totem Topple;16,33
|
||||
0005000E-101D3000;1;WUP;00AF;WUP-P-BT3J;BT3JAF;Taiko no Tatsujin Atsumete★ TomodachiDaisakusen!;16
|
||||
0005000E-101D6000;4;WUP;00JX;WUP-P-WFSP;WFSPJX;FAST Racing NEO;16,34,48,65
|
||||
0005000E-101DDC00;1;WUP;00AF;WUP-P-BD3J;BD3JAF;ディズニーインフィニティ3.0;17,33,48
|
||||
0005000E-101DF400;2;WUP;0001;WUP-P-APKE;APKE01;POKKÉN TOURNAMENT;16,32,48,64
|
||||
0005000E-101DB800;2;WUP;017D;WUP-P-AVME;AVME7D;VoxelMaker;17
|
||||
0005000E-101C0C00;4;WUP;00UB;WUP-P-BS7P;BS7PUB;The Swindle;16
|
||||
0005000E-101C4C00;4;WUP;0001;WUP-P-AX5D;AX5D01;Xenoblade Chronicles X;16
|
||||
0005000E-101C5800;1;WUP;002P;WUP-P-APKJ;APKJ2P;POKKÉN TOURNAMENT;16,32,48,64
|
||||
0005000E-10132400;4;WUP;00WR;WUP-U-ALMP;ALMPWR;LEGO® MARVEL Super Heroes;16,32,48
|
||||
0005000E-10132800;2;WUP;00UP;WUP-U-WEPE;WEPEUP;Unepic EnjoyUp Games;16,32
|
||||
0005000E-10137000;4;WUP;004Q;WUP-U-ADSZ;ADSZ4Q;Disney Infinity;16,32,49
|
||||
0005000E-10137C00;2;WUP;00WR;WUP-U-AZEE;AZEEWR;Batman™: Arkham Origins;16
|
||||
0005000E-10136C00;4;WUP;00WR;WUP-U-AZEP;AZEPWR;Batman™: Arkham Origins;16
|
||||
0005000E-10138800;4;WUP;0041;WUP-U-ASBP;ASBP41;Assassin's Creed® IV Black Flag;16,32
|
||||
0005000E-10128800;2;WUP;0069;WUP-U-ANSE;ANSE69;Need for Speed™ Most Wanted U;16,32
|
||||
0005000E-1012BC00;1;WUP;0001;WUP-U-AC3J;AC3J01;PIKMIN 3;17,48,64,80,96
|
||||
0005000E-10128400;4;WUP;0069;WUP-U-ANSP;ANSP69;Need for Speed™ Most Wanted U;16,32
|
||||
0005000E-10129000;2;WUP;0008;WUP-U-WDKE;WDKE08;DuckTales: Remastered;16,32
|
||||
0005000E-1012AC00;4;WUP;0041;WUP-U-AS9P;AS9P41;Splinter Cell Blacklist;16,32,48
|
||||
0005000E-1012DC00;2;WUP;0001;WUP-U-ACME;ACME01;The Wonderful 101;16
|
||||
0005000E-1012F000;2;WUP;00JX;WUP-P-WFSE;WFSEJX;FAST Racing NEO;33,48,65
|
||||
0005000E-1012B400;4;WUP;0008;WUP-U-ABHP;ABHP08;RESIDENT EVIL REVELATIONS;16
|
||||
0005000E-10113000;1;WUP;0013;WUP-U-AMEJ;AMEJ13;Mass Effect™ 3 Special Edition;16
|
||||
0005000E-10110000;2;WUP;00AF;WUP-U-AKNE;AKNEAF;TEKKEN TAG TOURNAMENT 2 Wii U EDITION;32
|
||||
0005000E-10111C00;1;WUP;00C8;WUP-U-AG9J;AG9JC8;Romance of the Three Kingdoms 12;16,33
|
||||
0005000E-10110800;4;WUP;0041;WUP-U-AMVP;AMVP41;Marvel Avengers™: Battle for Earth;16
|
||||
0005000E-10113400;4;WUP;0052;WUP-U-AECP;AECP52;Call of Duty: Black Ops II;16,32,48,64,80,96,112,128
|
||||
0005000E-10113800;4;WUP;00Y4;WUP-U-WBAP;WBAPY4;Zen Pinball 2;17,32,48,65,80,96
|
||||
0005000E-10113C00;2;WUP;00GT;WUP-U-AFBE;AFBEGT;Funky Barn;16
|
||||
0005000E-10112000;2;WUP;00G9;WUP-U-ACRE;ACREG9;THE CROODS;16
|
||||
0005000E-10112400;1;WUP;0041;WUP-U-ASSJ;ASSJ41;Assassin's Creed® III;16,32,48,64,80
|
||||
0005000E-10112800;1;WUP;0041;WUP-U-AS9J;AS9J41;Splinter Cell Blacklist;17,32,48
|
||||
0005000E-10118400;4;WUP;00GT;WUP-U-AFBP;AFBPGT;Funky Barn;16
|
||||
0005000E-1011B400;1;WUP;00GD;WUP-U-AECJ;AECJGD;Call of Duty: Black Ops II;16,32,48,64,80,96
|
||||
0005000E-1011C000;2;WUP;00TJ;WUP-U-WCAE;WCAETJ;Chasing Aurora;16
|
||||
0005000E-1010B000;2;WUP;0041;WUP-U-ARBE;ARBE41;Rabbids Land;16
|
||||
0005000E-1010B400;2;WUP;0041;WUP-U-ASPE;ASPE41;ESPN Sports Connection;16,33
|
||||
0005000E-10101C00;1;WUP;0001;WUP-U-ARPJ;ARPJ01;New SUPER MARIO BROS. U;32,48,65
|
||||
0005000E-10102000;2;WUP;0001;WUP-U-ALCE;ALCE01;Nintendo Land;32
|
||||
0005000E-10102400;4;WUP;0001;WUP-U-ASTP;ASTP01;Wii Fit U;16,48,64,81
|
||||
0005000E-1010DC00;2;WUP;0069;WUP-U-AMEE;AMEE69;Mass Effect™ 3 Special Edition;16
|
||||
0005000E-1010C800;4;WUP;0001;WUP-U-AURP;AURP01;Mario & Sonic at the Sochi 2014 Olympic Winter Games;16,32
|
||||
0005000E-1010FC00;4;WUP;0041;WUP-U-ARBP;ARBP41;Rabbids Land;16
|
||||
0005000E-1010F800;4;WUP;00AF;WUP-U-AKNP;AKNPAF;TEKKEN TAG TOURNAMENT 2 Wii U EDITION;32
|
||||
0005000E-1010F000;4;WUP;0041;WUP-U-AJDP;AJDP41;JUST DANCE 4;16,32
|
||||
0005000E-1010EC00;2;WUP;0001;WUP-P-AMKE;AMKE01;MARIO KART 8;16,32,48,64
|
||||
0005000E-10177800;4;WUP;008P;WUP-P-BSSP;BSSP8P;Sonic Boom: Rise of Lyric;16
|
||||
0005000E-1017E000;4;WUP;00XQ;WUP-P-WK8P;WK8PXQ;Turtle Tale;16
|
||||
0005000E-1017D800;2;WUP;0001;WUP-U-BWPE;BWPE01;Hyrule Warriors;16,32,48,64,80,96,112,128,144,160,176,192
|
||||
0005000E-1016A400;4;WUP;00WR;WUP-P-BTMP;BTMPWR;LEGO® Batman™ 3 Beyond Gotham;16,32,48
|
||||
0005000E-1016AC00;2;WUP;009T;WUP-U-WMLE;WMLE9T;Armillo;16
|
||||
0005000E-1016E800;4;WUP;009V;WUP-U-WMRP;WMRP9V;Master Reboot;16
|
||||
0005000E-1016D800;1;WUP;0041;WUP-P-ACLJ;ACLJ41;CHILD of LIGHT;16
|
||||
0005000E-1016DC00;2;WUP;004Q;WUP-P-ADRE;ADRE4Q;Disney Infinity [2.0];16,32,64,80
|
||||
0005000E-10159800;1;WUP;0001;WUP-U-AFCJ;AFCJ01;Wii Fit U (Free);48,64,81
|
||||
0005000E-10145800;4;WUP;00UP;WUP-U-WEPP;WEPPUP;Unepic EnjoyUp Games;16,32
|
||||
0005000E-10140400;4;WUP;0052;WUP-U-ASFP;ASFP52;Skylanders SWAP Force;16
|
||||
0005000E-10142C00;2;WUP;0001;WUP-P-AA9E;AA9E01;Art Academy: SketchPad;16
|
||||
0005000E-10144000;2;WUP;00G9;WUP-U-ADVE;ADVEG9;Adventure Time: Explore the Dungeon Because I Don't Know!;16
|
||||
0005000E-10145000;4;WUP;0001;WUP-P-AXFP;AXFP01;Super Smash Bros. for Wii U;32,48,64,80,96,112,128,144,160,176,192,208,224,288
|
||||
0005000E-10144800;1;WUP;0001;WUP-P-ARKJ;ARKJ01;Donkey Kong Country Tropical Freeze;17
|
||||
0005000E-10146000;2;WUP;0001;WUP-P-WMGE;WMGE01;NES REMIX;16
|
||||
0005000E-10146800;2;WUP;0052;WUP-P-ACPE;ACPE52;Call of Duty: Ghosts;16,32,48,64,80,96,112
|
||||
0005000E-10148000;1;WUP;00AF;WUP-P-AUNJ;AUNJAF;ONE PIECE UNLIMITED WORLD R;16
|
||||
0005000E-1014C800;1;WUP;0041;WUP-U-ASBJ;ASBJ41;Assassin's Creed® IV Black Flag;16
|
||||
0005000E-1014E000;4;WUP;00WR;WUP-U-ALAP;ALAPWR;The LEGO® Movie Videogame;18
|
||||
0005000E-101B3D00;4;WUP;004Q;WUP-P-BD3P;BD3P4Q;DISNEY INFINITY 3.0: PLAY WITHOUT LIMITS;16,32,49,64,80
|
||||
0005000E-101B8500;2;WUP;0052;WUP-P-BS5E;BS5E52;Skylanders SuperChargers;16,32,48,64,80,96
|
||||
0005000E-101B9900;4;WUP;00AF;WUP-P-APHP;APHPAF;LOST REAVERS;16
|
||||
0005000E-101BE900;4;WUP;00WR;WUP-P-ALRP;ALRPWR;LEGO® MARVEL's Avengers;16,33,48,64
|
||||
0005000E-101BED00;4;WUP;0001;WUP-U-BWFP;BWFP01;Star Fox Guard;16
|
||||
0005000E-101A4900;4;WUP;00LY;WUP-U-BLPP;BLPPLY;Life of Pixel;16
|
||||
0005000E-101A3500;2;WUP;0001;WUP-P-AVXE;AVXE01;Mario Tennis: Ultra Smash;16,32
|
||||
0005000E-101A6500;2;WUP;00VZ;WUP-P-BKFE;BKFEVZ;Kung Fu Panda Showdown of Legendary Legends;16
|
||||
0005000E-101A6900;2;WUP;00UB;WUP-P-ALLE;ALLEUB;OlliOlli;17
|
||||
0005000E-101A9500;4;WUP;00WY;WUP-U-BSXP;BSXPWY;Shantae and the Pirate's Curse;16
|
||||
0005000E-101A9F00;2;WUP;0147;WUP-P-BDAE;BDAE47;Dot Arcade;16
|
||||
0005000E-101AA200;2;WUP;014K;WUP-U-APJE;APJE4K;Vector Assault;18
|
||||
0005000E-101AA500;4;WUP;00VZ;WUP-P-BKFP;BKFPVZ;Kung Fu Panda Showdown of Legendary Legends;16,32
|
||||
0005000E-101ABC00;2;WUP;0001;WUP-U-AXYE;AXYE01;Kirby and the Rainbow Curse;16
|
||||
0005000E-101AC700;2;WUP;00VZ;WUP-P-BFNE;BFNEVZ;Adventure Time Finn and Jake Investigations;16
|
||||
0005000E-101AC900;2;WUP;004Q;WUP-P-BD3E;BD3E4Q;DISNEY INFINITY 3.0 EDITION;16,32,49,65,80
|
||||
0005000E-101AFE00;4;WUP;00VZ;WUP-P-BFNP;BFNPVZ;Adventure Time Finn and Jake Investigations;16
|
||||
0005000E-101AFF00;1;WUP;0001;WUP-U-AFXJ;AFXJ01;Star Fox Zero;16
|
||||
0005000E-101B0400;2;WUP;0001;WUP-U-AFXE;AFXE01;Star Fox Zero;16
|
||||
0005000E-101B3D00;4;WUP;004Q;WUP-P-BD3P;BD3P4Q;DISNEY INFINITY 3.0: PLAY WITHOUT LIMITS;16,32,49,64,80
|
||||
0005000E-101B3E00;4;WUP;004Q;WUP-P-BD3Z;BD3Z4Q;DISNEY INFINITY 3.0: PLAY WITHOUT LIMITS;16,32,49,64,80
|
||||
0005000E-101B8500;2;WUP;0052;WUP-P-BS5E;BS5E52;Skylanders SuperChargers;16,32,48,64,80,96
|
||||
0005000E-101B9000;2;WUP;0041;WUP-P-AJ6E;AJ6E41;JUST DANCE® 2016;16,32
|
||||
0005000E-101B9800;4;WUP;0041;WUP-P-AJ6P;AJ6P41;JUST DANCE® 2016;16,32
|
||||
0005000E-101B9900;4;WUP;00AF;WUP-P-APHP;APHPAF;LOST REAVERS;16
|
||||
0005000E-101BA400;2;WUP;0052;WUP-P-AGNE;AGNE52;Guitar Hero Live;16,32,48,64,80,96
|
||||
0005000E-101BAA00;2;WUP;010C;WUP-U-ATTE;ATTE0C;Totem Topple;16,33
|
||||
0005000E-101BB300;4;WUP;008V;WUP-P-WLSP;WLSP8V;ZaciSa: Defense of the Crayon Dimension!;16
|
||||
0005000E-101BB800;4;WUP;011A;WUP-P-BEQP;BEQP1A;Elliot Quest;16,32,48,64,80,97
|
||||
0005000E-101BC600;4;WUP;0052;WUP-P-AGNP;AGNP52;Guitar Hero Live;18,32,48,64,80,96
|
||||
0005000E-101BE900;4;WUP;00WR;WUP-P-ALRP;ALRPWR;LEGO® MARVEL's Avengers;16,33,48,64
|
||||
0005000E-101BEC00;2;WUP;0001;WUP-U-BWFE;BWFE01;Star Fox Guard;16
|
||||
0005000E-101BED00;4;WUP;0001;WUP-U-BWFP;BWFP01;Star Fox Guard;16
|
||||
0005000E-101BEF00;2;WUP;00WR;WUP-P-ALRE;ALREWR;LEGO® MARVEL's Avengers;16,32,48,64
|
||||
0005000E-101BFC00;4;WUP;0052;WUP-P-BS5P;BS5P52;Skylanders SuperChargers;16,32,48,64,80,97
|
||||
0005000E-101C0700;4;WUP;00UB;WUP-U-AN3P;AN3PUB;Nova-111;16
|
||||
0005000E-101C0A00;2;WUP;00UB;WUP-U-AN3E;AN3EUB;Nova-111;16
|
||||
0005000E-101C0B00;2;WUP;00UB;WUP-P-BS7E;BS7EUB;The Swindle;16
|
||||
0005000E-101C0C00;4;WUP;00UB;WUP-P-BS7P;BS7PUB;The Swindle;16
|
||||
0005000E-101C3100;2;WUP;0167;WUP-U-AFEE;AFEE67;Freedom Planet;17
|
||||
0005000E-10195D00;4;WUP;00WR;WUP-P-APZP;APZPWR;LEGO® DIMENSIONS™;32,48,64,80,96,112,128,144,160,176,192
|
||||
0005000E-1019AD00;2;WUP;011A;WUP-P-BEQE;BEQE1A;Elliot Quest;16,32,48,64,80,96,114
|
||||
0005000E-1019E500;2;WUP;0001;WUP-U-AZAE;AZAE01;THE LEGEND OF ZELDA Twilight Princess HD;81
|
||||
0005000E-10187100;4;WUP;00LW;WUP-U-BUGP;BUGPLW;Underground;16,32
|
||||
0005000E-10183900;2;WUP;00UP;WUP-U-BMVE;BMVEUP;99Moves;16,32
|
||||
0005000E-10180500;1;WUP;0001;WUP-P-AKBJ;AKBJ01;Captain Toad: Treasure Tracker;16
|
||||
0005000E-10184D00;2;WUP;0001;WUP-U-AYCE;AYCE01;Yoshi's Woolly World;17
|
||||
0005000E-10188D00;4;WUP;004Q;WUP-P-ADRZ;ADRZ4Q;Disney Infinity [2.0];16,32,64,80
|
||||
0005000E-1018D900;1;WUP;00AF;WUP-P-APHJ;APHJAF;LOST REAVERS;17,32,48
|
||||
0005000E-1018DD00;4;WUP;0001;WUP-U-AMAP;AMAP01;Super Mario Maker;32,48,64,80,96,113,128,144,160,176,192,208
|
||||
0005000E-1018ED00;2;WUP;00NK;WUP-U-ATCE;ATCENK;Tetrobot and Co.;16
|
||||
0005000E-101F5D00;2;WUP;017D;WUP-P-AHYE;AHYE7D;PixelMaker;16
|
||||
0005000E-101E0100;2;WUP;00TL;WUP-N-BMTE;BMTETL;Minecraft: Story Mode;16
|
||||
0005000E-101E4100;1;WUP;00JF;WUP-P-WFSJ;WFSJJF;FAST Racing NEO;33,49
|
||||
0005000E-101EA100;1;WUP;00WR;WUP-P-ALRJ;ALRJWR;LEGO® MARVEL's Avengers;18
|
||||
0005000E-101D6100;4;WUP;00FV;WUP-U-AGWP;AGWPFV;Gunman Clive HD Collection;16
|
||||
0005000E-101D5100;4;WUP;011F;WUP-P-BSVP;BSVP1F;Stone Shire;32,49,64
|
||||
0005000E-101D0900;2;WUP;00FV;WUP-U-AGWE;AGWEFV;Gunman Clive HD Collection;16
|
||||
0005000E-101D3900;4;WUP;017D;WUP-P-AQCP;AQCP7D;The Quiet Collection;16
|
||||
0005000E-101D6D00;4;WUP;010P;WUP-P-ARNP;ARNP0P;Runbow;17,33,48,65
|
||||
0005000E-101D7500;4;WUP;00DU;WUP-P-AUMP;AUMPDU;Minecraft: Wii U Edition;16,32,48,64,80,96,112,128,144,161,176,192,208,224
|
||||
0005000E-101DAD00;2;WUP;016D;WUP-P-AT7E;AT7E6D;Tumblestone;16
|
||||
0005000E-101DC100;4;WUP;016E;WUP-P-AD5P;AD5P6E;Octodad: Dadliest Catch;16
|
||||
0005000E-101DD900;1;WUP;0091;WUP-P-AMQJ;AMQJ91;Mighty No. 9;16
|
||||
0005000E-101DCD00;2;WUP;0001;WUP-U-BWGE;BWGE01;Star Fox Guard Special Demo;16
|
||||
0005000E-101DF500;4;WUP;0001;WUP-P-APKP;APKP01;POKKÉN TOURNAMENT;16,32,48,64
|
||||
0005000E-101D9D00;2;WUP;00DU;WUP-P-AUME;AUMEDU;Minecraft: Wii U Edition;16,32,48,64,80,96,112,128,144,160,176,192,208,224
|
||||
0005000E-101C3900;4;WUP;015G;WUP-P-AWBP;AWBP5G;Word Search by POWGI;16
|
||||
0005000E-101C4C00;4;WUP;0001;WUP-P-AX5D;AX5D01;Xenoblade Chronicles X;16
|
||||
0005000E-101C3100;2;WUP;0167;WUP-U-AFEE;AFEE67;Freedom Planet;17
|
||||
0005000E-101C4D00;2;WUP;0001;WUP-P-AX5E;AX5E01;Xenoblade Chronicles X;16,32,48
|
||||
0005000E-101C5800;1;WUP;002P;WUP-P-APKJ;APKJ2P;POKKÉN TOURNAMENT;16,32,48,64
|
||||
0005000E-101CC900;4;WUP;0167;WUP-U-AFEP;AFEP67;Freedom Planet;16
|
||||
0005000E-101CE100;2;WUP;0175;WUP-U-ACHE;ACHE75;Canvaleon;16,32
|
||||
0005000E-10132900;2;WUP;004Q;WUP-U-ADSE;ADSE4Q;Disney INFINITY;16,32,49
|
||||
0005000E-10132500;1;WUP;0001;WUP-U-WB9J;WB9J01;Wii Fit U Quick Check;16,64,81
|
||||
0005000E-10131D00;1;WUP;0001;WUP-P-ASEJ;ASEJ01;幻影異聞録♯FE;17,32
|
||||
0005000E-10139900;2;WUP;0041;WUP-P-AJ5E;AJ5E41;JUST DANCE® 2014;16
|
||||
0005000E-10139500;2;WUP;0041;WUP-U-WB7E;WB7E41;Rayman Legends Challenges App;16
|
||||
0005000E-1012BD00;2;WUP;0001;WUP-U-AC3E;AC3E01;PIKMIN 3;33,48,64,80,96
|
||||
0005000E-1012C500;4;WUP;00AF;WUP-U-ACRP;ACRPAF;THE CROODS;16
|
||||
0005000E-1012F100;1;WUP;0001;WUP-U-AWSJ;AWSJ01;Wii Sports Club;16,32,48,64,80,96,112
|
||||
0005000E-1012B100;4;WUP;008P;WUP-U-ASNP;ASNP8P;SONIC LOST WORLD;16,32,48
|
||||
0005000E-10113100;1;WUP;0008;WUP-U-ABHJ;ABHJ08;BIOHAZARD REVELATIONS Unveiled Edition;16
|
||||
0005000E-10111D00;4;WUP;0041;WUP-U-ASPP;ASPP41;Sports Connection;16
|
||||
0005000E-10110100;2;WUP;00JX;WUP-U-WASE;WASEJX;Nano Assault Neo;17
|
||||
0005000E-10110900;1;WUP;00C8;WUP-U-ANGJ;ANGJC8;NINJA GAIDEN 3: Razor's Edge;16,32,48,64
|
||||
0005000E-10113500;4;WUP;0052;WUP-U-AECI;AECI52;Call of Duty: Black Ops II;16,32,48,64,80,96,112,144
|
||||
0005000E-10112100;4;WUP;0041;WUP-U-AKFP;AKFP41;Know Your Friends;16
|
||||
0005000E-10112500;1;WUP;0041;WUP-U-ASPJ;ASPJ41;Sports Connection;17
|
||||
0005000E-10116100;1;WUP;0001;WUP-P-AX5J;AX5J01;XenobladeX;16,32,48
|
||||
0005000E-10116500;4;WUP;00TW;WUP-U-WAAP;WAAPTW;Toki Tori 2+;16,32
|
||||
0005000E-10102100;4;WUP;0001;WUP-U-ALCP;ALCP01;Nintendo Land;32
|
||||
0005000E-10101D00;2;WUP;0001;WUP-U-ARPE;ARPE01;New SUPER MARIO BROS. U;32,48,64
|
||||
0005000E-10104D00;1;WUP;0008;WUP-U-AHDJ;AHDJ08;MONSTER HUNTER 3(tri-)G HD Ver.;16,32,48,65,80,96
|
||||
0005000E-10106900;1;WUP;0001;WUP-U-AURJ;AURJ01;Mario & Sonic at the Sochi 2014 Olympic Winter Games;16,32
|
||||
0005000E-1010DD00;2;WUP;0041;WUP-U-AZUE;AZUE41;ZombiU;16,32
|
||||
0005000E-1010F500;4;WUP;0069;WUP-U-AMEP;AMEP69;Mass Effect™ 3 Special Edition;16
|
||||
0005000E-1010ED00;4;WUP;0001;WUP-P-AMKP;AMKP01;MARIO KART 8;16,32,48,64
|
||||
0005000E-10175D00;4;WUP;00AF;WUP-P-AUNP;AUNPAF;ONE PIECE Unlimited World Red;16
|
||||
0005000E-10176500;2;WUP;00UB;WUP-U-WCGE;WCGEUB;Stealth Inc 2 A Game of Clones;16
|
||||
0005000E-10176900;2;WUP;0001;WUP-P-AGME;AGME01;Splatoon;16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272
|
||||
0005000E-1017CD00;1;WUP;00C8;WUP-U-BWPJ;BWPJC8;Hyrule Warriors;32,49,64,80,98,112,113,128,144,160,176,192,208,224,240,256,272
|
||||
0005000E-1017D900;4;WUP;0001;WUP-U-BWPP;BWPP01;Hyrule Warriors;16,33,48,64,80,96,112,128,144,160,176,192,208
|
||||
0005000E-10179100;2;WUP;0041;WUP-P-BJDE;BJDE41;JUST DANCE® 2015;16
|
||||
0005000E-10162D00;2;WUP;0001;WUP-U-ABAE;ABAE01;Mario Party 10;16
|
||||
0005000E-1016AD00;2;WUP;00WR;WUP-P-BTME;BTMEWR;LEGO® Batman™ 3 Beyond Gotham;16,32,48
|
||||
0005000E-1016D500;4;WUP;009Y;WUP-P-WCTP;WCTP9Y;Super Toy Cars;22
|
||||
0005000E-1016E100;2;WUP;00AY;WUP-P-WKNE;WKNEAY;Shovel Knight;16,32,48,64,80
|
||||
0005000E-10156100;4;WUP;0052;WUP-P-ACPP;ACPP52;Call of Duty: Ghosts;16,32,48,64,80,96,112
|
||||
0005000E-10154D00;4;WUP;00BU;WUP-U-WC3P;WC3PBU;The Mysterious Cities of Gold: Secret Paths;16
|
||||
0005000E-10156500;2;WUP;00BU;WUP-U-WC3E;WC3EBU;The Mysterious Cities of Gold: Secret Paths;16
|
||||
0005000E-10157900;1;WUP;00GD;WUP-P-ACPJ;ACPJGD;Call of Duty: Ghosts;16,32,48,64,80,97,112
|
||||
0005000E-10159900;2;WUP;0001;WUP-U-AFCE;AFCE01;Wii Fit U (Free);48,64,81
|
||||
0005000E-10144D00;2;WUP;0001;WUP-U-AWSE;AWSE01;Wii Sports Club;16,33,48,64,80,96,112
|
||||
0005000E-10145900;4;WUP;00HL;WUP-U-WCDP;WCDPHL;Coaster Crazy Deluxe;16
|
||||
0005000E-10146100;4;WUP;0001;WUP-P-WMGP;WMGP01;NES REMIX;16
|
||||
0005000E-10149500;2;WUP;00CS;WUP-P-WKTE;WKTECS;Scram Kitty and his Buddy on Rails;16,32
|
||||
0005000E-1014D100;4;WUP;00CS;WUP-U-WKTP;WKTPCS;Scram Kitty and his Buddy on Rails;17,32
|
||||
0005000E-1014D900;1;WUP;008P;WUP-P-APTJ;APTJ8P;PUYOPUYOTETRIS;16,32
|
||||
0005000E-1014E100;4;WUP;00AF;WUP-U-ADVP;ADVPAF;Adventure Time: Explore the Dungeon Because I Don't Know!;16
|
||||
0005000E-10200900;4;WUP;00SS;WUP-P-BM7P;BM7PSS;MAHJONG;16
|
||||
0005000E-101B3E00;4;WUP;004Q;WUP-P-BD3Z;BD3Z4Q;DISNEY INFINITY 3.0: PLAY WITHOUT LIMITS;16,32,49,64,80
|
||||
0005000E-101BAA00;2;WUP;010C;WUP-U-ATTE;ATTE0C;Totem Topple;16,33
|
||||
0005000E-101BC600;4;WUP;0052;WUP-P-AGNP;AGNP52;Guitar Hero Live;18,32,48,64,80,96
|
||||
0005000E-101A2600;1;WUP;00W4;WUP-U-WKFJ;WKFJW4;Kung Fu Rabbit;16
|
||||
0005000E-101A2E00;1;WUP;00TF;WUP-P-WEXJ;WEXJTF;XType+;16
|
||||
0005000E-101A3600;4;WUP;0001;WUP-P-AVXP;AVXP01;Mario Tennis: Ultra Smash;32
|
||||
0005000E-101A5E00;4;WUP;00UB;WUP-U-ALLP;ALLPUB;OlliOlli;16
|
||||
0005000E-101A6200;2;WUP;00WR;WUP-U-ALJE;ALJEWR;LEGO® Jurassic World™;16
|
||||
0005000E-101AA200;2;WUP;014K;WUP-U-APJE;APJE4K;Vector Assault;18
|
||||
0005000E-101AFE00;4;WUP;00VZ;WUP-P-BFNP;BFNPVZ;Adventure Time Finn and Jake Investigations;16
|
||||
0005000E-10192200;1;WUP;00AF;WUP-P-BRSJ;BRSJAF;KAMEN RIDER SUMMON RIDE!;16,33,48,64,80
|
||||
0005000E-10194200;2;WUP;00WR;WUP-P-APZE;APZEWR;LEGO® DIMENSIONS™;16,32,48,64,80,96,112,128,144,160
|
||||
0005000E-1019B200;4;WUP;009Y;WUP-P-BTCP;BTCP9Y;Tachyon Project;16
|
||||
0005000E-10180600;2;WUP;0001;WUP-P-AKBE;AKBE01;Captain Toad: Treasure Tracker;16
|
||||
0005000E-10189200;2;WUP;011C;WUP-P-BSPE;BSPE1C;Sportsball;16
|
||||
0005000E-1018DE00;4;WUP;00NK;WUP-U-ATCP;ATCPNK;Tetrobot and Co.;16
|
||||
0005000E-101F9A00;4;WUP;00VA;WUP-P-BECP;BECPVA;Citadale;17
|
||||
0005000E-101E1200;4;WUP;015D;WUP-P-BPHP;BPHP5D;PixelJunk Monsters;16
|
||||
0005000E-101E3200;2;WUP;0190;WUP-P-AJQE;AJQE90;Jewel Quest;16
|
||||
0005000E-101EAA00;4;WUP;0041;WUP-P-BJ7P;BJ7P41;JUST DANCE® 2017;16
|
||||
0005000E-101EB200;2;WUP;0041;WUP-P-BJ7E;BJ7E41;JUST DANCE® 2017;16
|
||||
0005000E-101D4200;2;WUP;00DV;WUP-P-ABPE;ABPEDV;Brunswick Pro Bowling;16
|
||||
0005000E-101D9600;4;WUP;00UP;WUP-U-ARXP;ARXPUP;Rock 'N Racing Off Road DX;16
|
||||
0005000E-101DAA00;4;WUP;00WR;WUP-P-BLGP;BLGPWR;LEGO® STAR WARS™ The Force Awakens;17,32
|
||||
0005000E-101DCA00;4;WUP;017D;WUP-P-AVMP;AVMP7D;VoxelMaker;16
|
||||
0005000E-101DCE00;4;WUP;0001;WUP-U-BWGP;BWGP01;Star Fox Guard: Special Demo Version;16
|
||||
0005000E-101DBE00;1;WUP;0188;WUP-P-AUMJ;AUMJ88;Minecraft: Wii U Edition;16,32,48,64,80,96,112,128,144,161,176,192,208,224
|
||||
0005000E-101C5A00;4;WUP;00KM;WUP-P-AMQP;AMQPKM;Mighty No. 9;16
|
||||
0005000E-101C0A00;2;WUP;00UB;WUP-U-AN3E;AN3EUB;Nova-111;16
|
||||
0005000E-101C6200;2;WUP;0001;WUP-P-AP5E;AP5E01;Mini Mario & Friends amiibo Challenge;16
|
||||
0005000E-101C6300;4;WUP;0001;WUP-P-AP5P;AP5P01;Mini Mario & Friends amiibo Challenge;16
|
||||
0005000E-101C6A00;2;WUP;016E;WUP-P-AD5E;AD5E6E;Octodad: Dadliest Catch;16
|
||||
0005000E-101C6E00;4;WUP;00RG;WUP-U-BS2P;BS2PRG;Swords & Soldiers II;16
|
||||
0005000E-101C8200;2;WUP;0164;WUP-P-AMPE;AMPE64;Momonga Pinball Adventures;16
|
||||
0005000E-101C8B00;4;WUP;00YT;WUP-P-AWMP;AWMPYT;WICKED MONSTERS BLAST! HD PLUS;16
|
||||
0005000E-101C9600;2;WUP;00JJ;WUP-P-AMQE;AMQEJJ;Mighty No. 9;16
|
||||
0005000E-101CC900;4;WUP;0167;WUP-U-AFEP;AFEP67;Freedom Planet;16
|
||||
0005000E-101CE100;2;WUP;0175;WUP-U-ACHE;ACHE75;Canvaleon;16,32
|
||||
0005000E-101D0700;4;WUP;0175;WUP-U-ACHP;ACHP75;Canvaleon;16,32
|
||||
0005000E-101D0900;2;WUP;00FV;WUP-U-AGWE;AGWEFV;Gunman Clive HD Collection;16
|
||||
0005000E-101D2C00;1;WUP;00SA;WUP-P-ATXJ;ATXJSA;Bike Rider UltraDX WORLD TOUR;16,32
|
||||
0005000E-101D3000;1;WUP;00AF;WUP-P-BT3J;BT3JAF;Taiko no Tatsujin Atsumete★ TomodachiDaisakusen!;16
|
||||
0005000E-101D3900;4;WUP;017D;WUP-P-AQCP;AQCP7D;The Quiet Collection;16
|
||||
0005000E-101D4200;2;WUP;00DV;WUP-P-ABPE;ABPEDV;Brunswick Pro Bowling;16
|
||||
0005000E-101D5100;4;WUP;011F;WUP-P-BSVP;BSVP1F;Stone Shire;32,49,64
|
||||
0005000E-101D6000;4;WUP;00JX;WUP-P-WFSP;WFSPJX;FAST Racing NEO;16,34,48
|
||||
0005000E-101D6100;4;WUP;00FV;WUP-U-AGWP;AGWPFV;Gunman Clive HD Collection;16
|
||||
0005000E-101D6D00;4;WUP;010P;WUP-P-ARNP;ARNP0P;Runbow;17,33,48,65
|
||||
0005000E-101D7400;4;WUP;010C;WUP-U-ATTP;ATTP0C;Totem Topple;16,33
|
||||
0005000E-101D7500;4;WUP;00DU;WUP-P-AUMP;AUMPDU;Minecraft: Wii U Edition;16,32,48,64,80,96,112,128,144,161,176,192,208
|
||||
0005000E-101D8300;4;WUP;00TJ;WUP-U-AEJP;AEJPTJ;Electronic Super Joy;16
|
||||
0005000E-101D9300;1;WUP;0001;WUP-P-WKNJ;WKNJ01;Shovel Knight;16
|
||||
0005000E-101D9600;4;WUP;00UP;WUP-U-ARXP;ARXPUP;Rock 'N Racing Off Road DX;16
|
||||
0005000E-101D9D00;2;WUP;00DU;WUP-P-AUME;AUMEDU;Minecraft: Wii U Edition;16,32,48,64,80,96,112,128,144,160,176,192,208
|
||||
0005000E-101DAA00;4;WUP;00WR;WUP-P-BLGP;BLGPWR;LEGO® STAR WARS™ The Force Awakens;17,32
|
||||
0005000E-101DAB00;2;WUP;00WR;WUP-P-BLGE;BLGEWR;LEGO® STAR WARS™ The Force Awakens;16,32
|
||||
0005000E-101DB800;2;WUP;017D;WUP-P-AVME;AVME7D;VoxelMaker;17
|
||||
0005000E-101DBE00;1;WUP;0188;WUP-P-AUMJ;AUMJ88;Minecraft: Wii U Edition;16,32,48,64,80,96,112,128,144,161,176,192,208
|
||||
0005000E-101DC100;4;WUP;016E;WUP-P-AD5P;AD5P6E;Octodad: Dadliest Catch;16
|
||||
0005000E-101DCA00;4;WUP;017D;WUP-P-AVMP;AVMP7D;VoxelMaker;16
|
||||
0005000E-101DCD00;2;WUP;0001;WUP-U-BWGE;BWGE01;Star Fox Guard Special Demo;16
|
||||
0005000E-101DCE00;4;WUP;0001;WUP-U-BWGP;BWGP01;Star Fox Guard: Special Demo Version;16
|
||||
0005000E-101DD700;1;WUP;013P;WUP-P-ARNJ;ARNJ3P;Runbow;16,17,32,49
|
||||
0005000E-101DD900;1;WUP;0091;WUP-P-AMQJ;AMQJ91;Mighty No. 9;16
|
||||
0005000E-101DDC00;1;WUP;00AF;WUP-P-BD3J;BD3JAF;ディズニーインフィニティ3.0;17,33,48
|
||||
0005000E-101DF400;2;WUP;0001;WUP-P-APKE;APKE01;POKKÉN TOURNAMENT;16,32,48,64
|
||||
0005000E-101DF500;4;WUP;0001;WUP-P-APKP;APKP01;POKKÉN TOURNAMENT;16,32,48,64
|
||||
0005000E-101E0100;2;WUP;00TL;WUP-N-BMTE;BMTETL;Minecraft: Story Mode;16
|
||||
0005000E-101E1200;4;WUP;015D;WUP-P-BPHP;BPHP5D;PixelJunk Monsters;16
|
||||
0005000E-101E3200;2;WUP;0190;WUP-P-AJQE;AJQE90;Jewel Quest;16
|
||||
0005000E-10132A00;4;WUP;00Y4;WUP-U-WA2P;WA2PY4;Star Wars Pinball;17,32,48
|
||||
0005000E-10132600;2;WUP;0001;WUP-U-WB9E;WB9E01;Wii Fit U Quick Check;16,64,81
|
||||
0005000E-10135200;2;WUP;00Y4;WUP-U-WA2E;WA2EY4;Star Wars Pinball;16,33,48
|
||||
0005000E-10139200;2;WUP;0052;WUP-U-ASFE;ASFE52;Skylanders SWAP Force;16
|
||||
0005000E-10138E00;4;WUP;0041;WUP-U-WB7P;WB7P41;Rayman Legends Challenges App;16
|
||||
0005000E-10128A00;2;WUP;00FZ;WUP-U-WBDE;WBDEFZ;Trine 2 Director's Cut;16
|
||||
0005000E-10129200;4;WUP;0008;WUP-U-WDKP;WDKP08;DuckTales: Remastered;16,32
|
||||
0005000E-1012BE00;4;WUP;0001;WUP-U-AC3P;AC3P01;PIKMIN 3;17,48,64,80,96
|
||||
0005000E-10110A00;2;WUP;0001;WUP-U-ANGE;ANGE01;NINJA GAIDEN 3: Razor's Edge;16,32,48,64,80
|
||||
0005000E-10110600;4;WUP;00JX;WUP-U-WASP;WASPJX;Nano Assault Neo;17
|
||||
0005000E-10111A00;4;WUP;00WR;WUP-U-AJSP;AJSPWR;Injustice: Gods Among Us;16
|
||||
0005000E-10110200;2;WUP;00C8;WUP-U-AHBE;AHBEC8;WARRIORS OROCHI 3 Hyper(NA);16,32
|
||||
0005000E-10110E00;1;WUP;0001;WUP-P-AXFJ;AXFJ01;Super Smash Bros. for Wii U;16,49,64,80,96,112,128,144,160,176,192,208,224,288
|
||||
0005000E-10112200;4;WUP;00FZ;WUP-U-WBDP;WBDPFZ;Trine 2 Director's Cut;16
|
||||
0005000E-10115E00;1;WUP;00GD;WUP-U-ADQJ;ADQJGD;Dragon Quest X;16,80,128,144,160,192,208,224,240,256,272,288,304,336,368,384,400,416,432,448,464,480,496,512,528,544,560,624,640,656,672,688,704,736,752,784,800,816,832,848,960,976,992,1008,1024,1040,1056,1072,1088,1104,1120,1136,1152,1168,1184,1200,1216,1232,1248,1264,1280,1296,1312,1328,1344,1360,1376,1392,1408,1424,1440,1456,1472,1488,1504,1520,1536,1552,1568,1584,1600,1616,1632,1648,1664,1680,1696,1712,1728,1744,1760,1776,1792,1808,1824,1840,1856,1872,1888,1904,1920,1936,1952,1968,1984,2000,2016,2032,2048,2064,2080,2096,2112,2128,2144,2160,2176,2192,2208,2224,2240,2256,2272,2288,2304,2320,2336,2352,2384,2400,2416,2432,2448,2464,2480,2496,2512,2528,2544,2560,2576,2592,2608,2624,2640,2656,2672,2688,2704,2720,2736,2752,2768,2784,2800,2816,2832,2848
|
||||
0005000E-10117200;4;WUP;0008;WUP-U-AHDP;AHDP08;MONSTER HUNTER 3 ULTIMATE;16,32
|
||||
0005000E-10116600;1;WUP;00C8;WUP-U-AH9J;AH9JC8;Fist of the North Star: Ken's Rage 2;17
|
||||
0005000E-1011B600;1;WUP;00GD;WUP-U-AQDJ;AQDJGD;Dragon Quest X Beta test;16,32,48,64,96
|
||||
0005000E-1011BA00;2;WUP;0041;WUP-U-WLAE;WLAE41;Uplay;16,33,48,64
|
||||
0005000E-1010B600;2;WUP;0041;WUP-U-AYSE;AYSE41;Your Shape® Fitness Evolved 2013;16,32
|
||||
0005000E-10101E00;4;WUP;0001;WUP-U-ARPP;ARPP01;New SUPER MARIO BROS. U;32,48,64,80
|
||||
0005000E-10100600;1;WUP;00AF;WUP-U-AKNJ;AKNJAF;TEKKEN TAG TOURNAMENT 2 Wii U EDITION;16
|
||||
0005000E-10102200;1;WUP;0001;WUP-U-ASTJ;ASTJ01;Wii Fit U;32,48,64,81
|
||||
0005000E-1010AE00;2;WUP;0041;WUP-U-AJDE;AJDE41;JUST DANCE 4;16,32
|
||||
0005000E-1010DA00;2;WUP;0054;WUP-U-ANBE;ANBE54;NBA 2K13;16,32
|
||||
0005000E-1010F600;4;WUP;0041;WUP-U-ASSP;ASSP41;Assassin's Creed® III;16,32,48,64,80
|
||||
0005000E-1010EA00;1;WUP;00C8;WUP-U-AHBJ;AHBJC8;WARRIORS OROCHI 3 Hyper;16,32,48,64
|
||||
0005000E-1010EE00;4;WUP;0069;WUP-U-AF3P;AF3P69;FIFA 13 ;16
|
||||
0005000E-10176600;1;WUP;00R5;WUP-P-WG8J;WG8JR5;GREAT RACE;16
|
||||
0005000E-10170600;1;WUP;00AF;WUP-U-APWJ;APWJAF;KAMEN RIDER BATTRIDE WAR Ⅱ PREMIUM TV&MOVIE SOUND ED.;16
|
||||
0005000E-10170200;2;WUP;007Z;WUP-U-WGAE;WGAE7Z;Pier Solar and the Great Architects;16,33
|
||||
0005000E-10172A00;2;WUP;009Z;WUP-N-HRLE;HRLE9Z;Crunchyroll;16
|
||||
0005000E-10176A00;4;WUP;0001;WUP-P-AGMP;AGMP01;Splatoon;32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272
|
||||
0005000E-10177600;2;WUP;0001;WUP-U-ADNE;ADNE01;Devil's Third;16
|
||||
0005000E-1017BE00;1;WUP;0001;WUP-U-BXAJ;BXAJ01;Art Academy: Home Studio;48
|
||||
0005000E-1017C600;2;WUP;0052;WUP-P-BK7E;BK7E52;Skylanders Trap Team;16
|
||||
0005000E-1017E200;4;WUP;0102;WUP-P-WTSP;WTSP02;3Souls;16
|
||||
0005000E-1017DA00;2;WUP;011S;WUP-P-ACQE;ACQE1S;Costume Quest 2;16
|
||||
0005000E-1016A200;4;WUP;00SS;WUP-U-WBXP;WBXPSS;Bombing Bastards;16
|
||||
0005000E-1016A600;1;WUP;00TF;WUP-P-WB6J;WB6JTF;わいわい!みんなでチャレンジ;17
|
||||
0005000E-10169600;4;WUP;00UP;WUP-U-WEPS;WEPSUP;Unepic EnjoyUp Games;16,32
|
||||
0005000E-1016B200;2;WUP;009V;WUP-U-WMRE;WMRE9V;Master Reboot;16
|
||||
0005000E-1016CE00;2;WUP;00YR;WUP-U-WCZE;WCZEYR;Color Zen;16
|
||||
0005000E-1016EA00;4;WUP;0041;WUP-P-ACLP;ACLP41;CHILD of LIGHT;16
|
||||
0005000E-1016DE00;2;WUP;009Y;WUP-P-WCTE;WCTE9Y;Super Toy Cars;16
|
||||
0005000E-10154600;1;WUP;00WR;WUP-U-AZEJ;AZEJWR;Batman™: Arkham Origins;16
|
||||
0005000E-10157600;4;WUP;0052;WUP-P-ACPI;ACPI52;Call of Duty: Ghosts;16,32,48,64,80,96,112
|
||||
0005000E-10159A00;4;WUP;0001;WUP-U-AFCP;AFCP01;Wii Fit U (promo);48,64,81
|
||||
0005000E-1015B200;2;WUP;0041;WUP-P-ACLE;ACLE41;CHILD of LIGHT;16
|
||||
0005000E-10147600;4;WUP;00DZ;WUP-P-WEVP;WEVPDZ;EvoFish;17
|
||||
0005000E-10144E00;4;WUP;0001;WUP-U-AWSP;AWSP01;Wii Sports Club;16,33,48,64,80,96,112
|
||||
0005000E-10145600;7;WUP;0001;WUP-U-ADBA;ADBA01;Animal Crossing Plaza;16
|
||||
0005000E-10142A00;2;WUP;005G;WUP-U-AZBE;AZBE5G;Zumba Fitness World Party;16
|
||||
0005000E-10149200;4;WUP;00SS;WUP-U-WDFP;WDFPSS;Spot The Differences: Party!;16,32
|
||||
0005000E-10148200;2;WUP;00UP;WUP-U-WAEE;WAEEUP;Rock 'N Racing Off Road;16
|
||||
0005000E-1014DA00;1;WUP;0008;WUP-U-AMFJ;AMFJ08;Monster Hunter Frontier G;80,96,112,128,144,160,176,192,208,224,240,256,288,304,320,336,352,368,400,432,448,464,480,496,512,528,544,560,576,592,608,624,640,656,672,688,704,720,736,752,768,784,800,816,832,848,864,880,896,912,928,944,960,976,992,1008,1024,1040,1056,1072,1088,1104,1120,1136,1152,1168,1184,1200,1216,1232,1248,1264,1280,1296,1312,1328,1344,1360,1376,1392,1408,1424,1440,1456,1472,1488,1504,1520,1536,1552,1568,1584,1600,1616
|
||||
0005000E-1014DE00;2;WUP;00WR;WUP-U-ALAE;ALAEWR;The LEGO® Movie Videogame;16
|
||||
0005000E-1014C600;4;WUP;00CX;WUP-U-WGSP;WGSPCX;Giana Sisters Twisted Dreams;16
|
||||
0005000E-10200A00;4;WUP;00SS;WUP-U-BB2P;BB2PSS;BRICK BREAKER;32
|
||||
0005000E-1F600900;1;WUP;0001;WUP-U-CNFJ;CNFJ01;PAPER MARIO Color Splash;16
|
||||
0005000E-101BB300;4;WUP;008V;WUP-P-WLSP;WLSP8V;ZaciSa: Defense of the Crayon Dimension!;16
|
||||
0005000E-101BEF00;2;WUP;00WR;WUP-P-ALRE;ALREWR;LEGO® MARVEL's Avengers;16,32,48,64
|
||||
0005000E-101A3B00;2;WUP;00LY;WUP-P-BLPE;BLPELY;Life of Pixel;16
|
||||
0005000E-101A5F00;2;WUP;00WY;WUP-U-BSXE;BSXEWY;Shantae and the Pirate's Curse;16
|
||||
0005000E-101A1B00;2;WUP;00RG;WUP-U-BS2E;BS2ERG;Swords & Soldiers II;16
|
||||
0005000E-101A6300;4;WUP;00YR;WUP-U-ACUP;ACUPYR;Cube Life: Island Survival;16,32
|
||||
0005000E-101A9F00;2;WUP;0147;WUP-P-BDAE;BDAE47;Dot Arcade;16
|
||||
0005000E-101AC700;2;WUP;00VZ;WUP-P-BFNE;BFNEVZ;Adventure Time Finn and Jake Investigations;16
|
||||
0005000E-101AFF00;1;WUP;0001;WUP-U-AFXJ;AFXJ01;Star Fox Zero;16
|
||||
0005000E-10190300;1;WUP;0001;WUP-U-ABJJ;ABJJ01;M & S at the Rio 2016 Olympic Games;48
|
||||
0005000E-10191700;4;WUP;00UP;WUP-U-BMVP;BMVPUP;99Moves;16,32
|
||||
0005000E-10193300;4;WUP;006V;WUP-P-BLKP;BLKP6V;Legend of Kay Anniversary;16
|
||||
0005000E-10198F00;4;WUP;00GT;WUP-P-BTXP;BTXPGT;Terraria;17,32
|
||||
0005000E-1019C300;2;WUP;00GT;WUP-P-BTXE;BTXEGT;Terraria;16,32
|
||||
0005000E-10180700;4;WUP;0001;WUP-P-AKBP;AKBP01;Captain Toad: Treasure Tracker;16
|
||||
0005000E-10181F00;4;WUP;0052;WUP-P-BK7P;BK7P52;Skylanders Trap Team;16
|
||||
0005000E-10188B00;1;WUP;0001;WUP-U-AXYJ;AXYJ01;Kirby and the Rainbow Curse;16
|
||||
0005000E-1018DB00;1;WUP;0001;WUP-U-AMAJ;AMAJ01;Super Mario Maker;16,32,48,64,80,96,113,128,144,160,176,192,208
|
||||
0005000E-101F2700;4;WUP;017P;WUP-P-BY2P;BY2P7P;Star Sky 2;16,32
|
||||
0005000E-101F5F00;2;WUP;008V;WUP-P-AHZE;AHZE8V;Hot Rod Racer;16
|
||||
0005000E-101F7700;4;WUP;017D;WUP-P-AHYP;AHYP7D;PixelMaker;16,32
|
||||
0005000E-101FFB00;2;WUP;00SS;WUP-U-BB2E;BB2ESS;BRICK BREAKER;16
|
||||
0005000E-101E3300;4;WUP;011A;WUP-P-AR7P;AR7P1A;Olympia Rising;16,32,48,64
|
||||
0005000E-101E3400;2;WUP;011A;WUP-P-AR7E;AR7E1A;Olympia Rising;16
|
||||
0005000E-101E4100;1;WUP;00JF;WUP-P-WFSJ;WFSJJF;FAST Racing NEO;33,49
|
||||
0005000E-101E4300;1;WUP;00TF;WUP-P-AMPJ;AMPJTF;モモンガ ピンボール アドベンチャー;16
|
||||
0005000E-101E5300;2;WUP;0001;WUP-U-ABJE;ABJE01;M & S at the Rio 2016 Olympic Games;16
|
||||
0005000E-101E9300;2;WUP;010C;WUP-U-BGGE;BGGE0C;Gear Gauntlet;16
|
||||
0005000E-101E9400;4;WUP;010C;WUP-U-BGGP;BGGP0C;Gear Gauntlet;16
|
||||
0005000E-101E9C00;1;WUP;00S6;WUP-U-ACUJ;ACUJS6;Cube Life: Island Survival;17
|
||||
0005000E-101EA000;1;WUP;00WR;WUP-P-BLGJ;BLGJWR;LEGO® STAR WARS™ The Force Awakens;16
|
||||
0005000E-101EA100;1;WUP;00WR;WUP-P-ALRJ;ALRJWR;LEGO® MARVEL's Avengers;18
|
||||
0005000E-101EAA00;4;WUP;0041;WUP-P-BJ7P;BJ7P41;JUST DANCE® 2017;16
|
||||
0005000E-101ED800;2;WUP;0001;WUP-U-ASEE;ASEE01;Tokyo Mirage Sessions #FE;16
|
||||
0005000E-101F2700;4;WUP;017P;WUP-P-BY2P;BY2P7P;Star Sky 2;16,32
|
||||
0005000E-101F5D00;2;WUP;017D;WUP-P-AHYE;AHYE7D;PixelMaker;16
|
||||
0005000E-101F5F00;2;WUP;008V;WUP-P-AHZE;AHZE8V;Hot Rod Racer;16
|
||||
0005000E-101F7400;4;WUP;008V;WUP-P-AHZP;AHZP8V;Hot Rod Racer;16
|
||||
0005000E-101F7700;4;WUP;017D;WUP-P-AHYP;AHYP7D;PixelMaker;16,32
|
||||
0005000E-101F9A00;4;WUP;00VA;WUP-P-BECP;BECPVA;Citadale;17
|
||||
0005000E-101D0700;4;WUP;0175;WUP-U-ACHP;ACHP75;Canvaleon;16,32
|
||||
0005000E-101D8300;4;WUP;00TJ;WUP-U-AEJP;AEJPTJ;Electronic Super Joy;16
|
||||
0005000E-101DAB00;2;WUP;00WR;WUP-P-BLGE;BLGEWR;LEGO® STAR WARS™ The Force Awakens;16,32
|
||||
0005000E-101DD700;1;WUP;013P;WUP-P-ARNJ;ARNJ3P;Runbow;16,17,32,49
|
||||
0005000E-101D9300;1;WUP;0001;WUP-P-WKNJ;WKNJ01;Shovel Knight;16
|
||||
0005000E-101C0700;4;WUP;00UB;WUP-U-AN3P;AN3PUB;Nova-111;16
|
||||
0005000E-101C0B00;2;WUP;00UB;WUP-P-BS7E;BS7EUB;The Swindle;16
|
||||
0005000E-101C6300;4;WUP;0001;WUP-P-AP5P;AP5P01;Mini Mario & Friends amiibo Challenge;16
|
||||
0005000E-101C8B00;4;WUP;00YT;WUP-P-AWMP;AWMPYT;WICKED MONSTERS BLAST! HD PLUS;16
|
||||
0005000E-10135300;4;WUP;0001;WUP-U-ACMP;ACMP01;The Wonderful 101;16
|
||||
0005000E-10131F00;1;WUP;0001;WUP-U-AYCJ;AYCJ01;yoshi's woolly world;32
|
||||
0005000E-10132700;4;WUP;0001;WUP-U-WB9P;WB9P01;Wii Fit U Quick Check;16,64,81
|
||||
0005000E-10132B00;2;WUP;00WR;WUP-P-ALME;ALMEWR;LEGO® MARVEL Super Heroes;16,32
|
||||
0005000E-10135700;1;WUP;008P;WUP-U-ASNJ;ASNJ8P;SONIC LOST WORLD;16,32,48
|
||||
0005000E-10137F00;2;WUP;0001;WUP-P-ARKE;ARKE01;Donkey Kong Country Tropical Freeze;16
|
||||
0005000E-10136300;4;WUP;00XY;WUP-U-WBTP;WBTPXY;BIT.TRIP Presents... Runner2: Future Legend of Rhythm Alien;17
|
||||
0005000E-10136F00;4;WUP;004Q;WUP-U-ADSP;ADSP4Q;Disney Infinity;16,32,49
|
||||
0005000E-10138300;4;WUP;0001;WUP-P-ARKP;ARKP01;Donkey Kong Country Tropical Freeze;17
|
||||
0005000E-10138700;4;WUP;00YV;WUP-P-WB6P;WB6PYV;Spin the Bottle: Bumpie's Party;16,33
|
||||
0005000E-10138B00;2;WUP;0041;WUP-U-ASBE;ASBE41;Assassin's Creed® IV Black Flag;16,32
|
||||
0005000E-10138F00;1;WUP;0001;WUP-U-ADNJ;ADNJ01;Devil's Third;16
|
||||
0005000E-10128700;2;WUP;00TW;WUP-U-WAAE;WAAETW;Toki Tori 2+;16,32
|
||||
0005000E-10128F00;2;WUP;008P;WUP-U-ASNE;ASNE8P;SONIC LOST WORLD;16,32,48
|
||||
0005000E-1012CF00;2;WUP;0008;WUP-U-ABHE;ABHE08;RESIDENT EVIL REVELATIONS;16
|
||||
0005000E-1012B700;1;WUP;0013;WUP-U-ANSJ;ANSJ13;Need for Speed™ Most Wanted U;16,32
|
||||
0005000E-10112300;1;WUP;0041;WUP-U-AZUJ;AZUJ41;ZombiU;16,32
|
||||
0005000E-10113700;4;WUP;0052;WUP-U-AECD;AECD52;Call of Duty: Black Ops II;16,32,48,64,80,96,112,144
|
||||
0005000E-10110B00;4;WUP;0001;WUP-U-ANGP;ANGP01;NINJA GAIDEN 3: Razor's Edge;17,32,48
|
||||
0005000E-10111F00;4;WUP;008P;WUP-U-AS2P;AS2P8P;Sonic & All-Stars Racing Transformed;32,48
|
||||
0005000E-10111700;2;WUP;00WR;WUP-U-AJSE;AJSEWR;Injustice: Gods Among Us;16
|
||||
0005000E-10112B00;4;WUP;00C8;WUP-U-AHBP;AHBPC8;WARRIORS OROCHI 3 Hyper(EU);16,32
|
||||
0005000E-10112F00;4;WUP;0054;WUP-U-ANBP;ANBP54;NBA 2K13;32
|
||||
0005000E-10115F00;2;WUP;00Y4;WUP-U-WBAE;WBAEY4;Zen Pinball 2;16,32,48,65,80,96
|
||||
0005000E-10117700;4;WUP;00TJ;WUP-U-WCAP;WCAPTJ;Chasing Aurora;17
|
||||
0005000E-10116300;1;WUP;0001;WUP-U-ACMJ;ACMJ01;The Wonderful 101;16
|
||||
0005000E-10118300;2;WUP;0008;WUP-U-AHDE;AHDE08;MONSTER HUNTER 3 ULTIMATE;16,32
|
||||
0005000E-1011A700;4;WUP;0041;WUP-U-AZUD;AZUD41;ZombiU;16,32
|
||||
0005000E-1011B300;4;WUP;00TZ;WUP-U-AFBZ;AFBZTZ;Funky Barn (Download Version);16
|
||||
0005000E-1011B700;4;WUP;0041;WUP-U-WLAP;WLAP41;Uplay;16,32,33,48,64
|
||||
0005000E-1011AF00;2;WUP;00XY;WUP-U-WBTE;WBTEXY;BIT.TRIP Presents... Runner2: Future Legend of Rhythm Alien;16,33
|
||||
0005000E-10106B00;2;WUP;0041;WUP-U-ASSE;ASSE41;Assassin's Creed® III;16,32,48,64,80
|
||||
0005000E-10101B00;4;WUP;0001;WUP-U-APLP;APLP01;LEGO® CITY UNDERCOVER;16
|
||||
0005000E-10101F00;1;WUP;0001;WUP-U-ALCJ;ALCJ01;Nintendo Land;32
|
||||
0005000E-10102300;2;WUP;0001;WUP-U-ASTE;ASTE01;Wii Fit U;16,48,64,81
|
||||
0005000E-1010B300;2;WUP;008P;WUP-U-AS2E;AS2E8P;Sonic & All-Stars Racing Transformed;16,32,48
|
||||
0005000E-1010AF00;2;WUP;0041;WUP-U-AMVE;AMVE41;Marvel Avengers™: Battle for Earth;16
|
||||
0005000E-1010C700;2;WUP;0001;WUP-U-AURE;AURE01;Mario & Sonic at the Sochi 2014 Olympic Winter Games;16,32
|
||||
0005000E-1010CF00;2;WUP;0052;WUP-U-AECE;AECE52;Call of Duty: Black Ops II;16,32,48,64,80,96,112,128
|
||||
0005000E-1010E300;2;WUP;0041;WUP-U-AS9E;AS9E41;Splinter Cell Blacklist;16,32,48
|
||||
0005000E-1010FF00;4;WUP;00WR;WUP-U-AGPP;AGPPWR;Game Party Champions;16
|
||||
0005000E-1010FB00;4;WUP;00NK;WUP-U-WDLP;WDLPNK;Puddle;16
|
||||
0005000E-1010F700;4;WUP;0041;WUP-U-AYSP;AYSP41;Your Shape® Fitness Evolved 2013;16,33
|
||||
0005000E-1010EB00;1;WUP;0001;WUP-P-AMKJ;AMKJ01;MARIO KART 8;17,33,48,64
|
||||
0005000E-1010EF00;4;WUP;0041;WUP-U-AZUP;AZUP41;ZombiU;16,32
|
||||
0005000E-10172B00;4;WUP;009Z;WUP-N-HRLP;HRLP9Z;Crunchyroll;17
|
||||
0005000E-10175B00;2;WUP;008P;WUP-P-BSSE;BSSE8P;Sonic Boom: Rise of Lyric;16
|
||||
0005000E-10170700;1;WUP;00AF;WUP-U-ABWJ;ABWJAF;KAMEN RIDER BATTRIDE WAR Ⅱ;17
|
||||
0005000E-10173300;4;WUP;00UB;WUP-U-WCGP;WCGPUB;Stealth Inc 2 A Game of Clones;16,32
|
||||
0005000E-10176F00;4;WUP;0041;WUP-P-BJDP;BJDP41;JUST DANCE® 2015;16
|
||||
0005000E-10178F00;4;WUP;00AY;WUP-P-WKNP;WKNPAY;Shovel Knight;16,32,48
|
||||
0005000E-1017BF00;2;WUP;0001;WUP-U-BXAE;BXAE01;Art Academy: Home Studio;17
|
||||
0005000E-1017E700;2;WUP;0102;WUP-P-WTSE;WTSE02;3Souls;16
|
||||
0005000E-10162300;4;WUP;00YR;WUP-U-WCZP;WCZPYR;Color Zen;17
|
||||
0005000E-10161F00;1;WUP;0001;WUP-U-ABAJ;ABAJ01;Mario Party 10;16
|
||||
0005000E-10162B00;1;WUP;0001;WUP-P-AGMJ;AGMJ01;Splatoon;16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272
|
||||
0005000E-1016AB00;2;WUP;00SS;WUP-U-WBXE;WBXESS;Bombing Bastards;16
|
||||
0005000E-1016C700;4;WUP;009T;WUP-U-WMLP;WMLP9T;Armillo;16
|
||||
0005000E-1016FF00;2;WUP;00NT;WUP-P-WFWE;WFWENT;Flowerworks HD Follie's Adventure;16
|
||||
0005000E-1016E300;2;WUP;008S;WUP-P-WGRE;WGRE8S;GravBlocks+ From Nothing Game Studios;16
|
||||
0005000E-1015A300;1;WUP;00AF;WUP-U-ADSJ;ADSJAF;Disney INFINITY;17
|
||||
0005000E-1015D300;2;WUP;00AS;WUP-P-WLCE;WLCEAS;Lucadian Chronicles;16,32
|
||||
0005000E-1015EB00;1;WUP;00R7;WUP-U-WHYJ;WHYJR7;Mighty Switch Force!™ Hyper Drive Edition;18
|
||||
0005000E-10145F00;1;WUP;0001;WUP-P-WMGJ;WMGJ01;NES REMIX;16
|
||||
0005000E-10147F00;2;WUP;00YV;WUP-P-WB6E;WB6EYV;Spin the Bottle: Bumpie's Party;16,32
|
||||
0005000E-10140700;1;WUP;00WR;WUP-U-AJSJ;AJSJWR;Injustice: Gods Among Us;16
|
||||
0005000E-10142700;4;WUP;0001;WUP-P-AA9P;AA9P01;Art Academy: SketchPad;16
|
||||
0005000E-10142B00;1;WUP;0001;WUP-P-AA9J;AA9J01;Art Academy: SketchPad;16
|
||||
0005000E-10143F00;4;WUP;0041;WUP-P-AJ5P;AJ5P41;JUST DANCE® 2014;16
|
||||
0005000E-10144F00;2;WUP;0001;WUP-P-AXFE;AXFE01;Super Smash Bros. for Wii U;32,48,64,80,96,112,128,144,160,176,192,208,224,288
|
||||
0005000E-10149700;1;WUP;0001;WUP-P-WAUJ;WAUJ01;役満 鳳凰;34,48,64
|
||||
0005000E-10148F00;1;WUP;0041;WUP-U-WLAJ;WLAJ41;Uplay;16
|
||||
0005000E-1014CB00;2;WUP;00CX;WUP-P-WGSE;WGSECX;Giana Sisters Twisted Dreams;16
|
||||
0005000E-1014CF00;2;WUP;00HL;WUP-U-WCDE;WCDEHL;Coaster Crazy Deluxe;16,32
|
||||
0005000E-1014E300;4;WUP;00GT;WUP-U-AZBP;AZBPGT;Zumba Fitness World Party;16
|
||||
0005000E-10200B00;4;WUP;00SS;WUP-P-BT6P;BT6PSS;TETRAMINOS;16
|
||||
|
|
BIN
release.zip
BIN
release.zip
Binary file not shown.
@ -70,7 +70,7 @@ public class Content {
|
||||
Logger.log("Downloading Content: " + String.format("%08X", ID));
|
||||
Downloader.getInstance().downloadContent(tmd.titleID,ID,tmpPath,progress);
|
||||
}
|
||||
if ((type & 0x02) == 0x02){
|
||||
if ((type & 0x2003) == 0x2003){
|
||||
f = new File(tmpPath + "/" + String.format("%08X", ID ) + ".h3");
|
||||
if(!f.exists()){
|
||||
Logger.log("Downloading H3: " + String.format("%08X.h3", ID));
|
||||
|
@ -2,17 +2,20 @@ package de.mas.jnustool;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import de.mas.jnustool.util.Decryption;
|
||||
import de.mas.jnustool.util.Downloader;
|
||||
import de.mas.jnustool.util.HashUtil;
|
||||
import de.mas.jnustool.util.Settings;
|
||||
import de.mas.jnustool.util.Util;
|
||||
|
||||
public class FEntry implements IHasName{
|
||||
private FST fst;
|
||||
|
||||
public static int DIR_FLAG = 1;
|
||||
|
||||
public static int DIR_FLAG = 1;
|
||||
public static int NOT_IN_NUSTITLE_FLAG = 0x80;
|
||||
public static int EXTRACT_WITH_HASH_FLAG = 0x440;
|
||||
public static int CHANGE_OFFSET_FLAG = 0x04;
|
||||
@ -25,13 +28,16 @@ public class FEntry implements IHasName{
|
||||
private String path = "";
|
||||
private long fileOffset = 0L;
|
||||
private long fileLength = 0;
|
||||
private byte[] hash;
|
||||
private int contentID = 0;
|
||||
private int NUScontentID = 0;
|
||||
private List<String> pathList;
|
||||
|
||||
private Content content = null;
|
||||
|
||||
|
||||
public FEntry(String path, String filename, int contentID,int NUScontentID, long fileOffset, long fileLength, boolean dir,
|
||||
boolean in_nus_title, boolean extract_withHash, List<String> pathList,FST fst) {
|
||||
boolean in_nus_title, boolean extract_withHash, List<String> pathList,FST fst,byte[] hash,Content content) {
|
||||
setPath(path);
|
||||
setFileName(filename);
|
||||
setContentID(contentID);
|
||||
@ -42,6 +48,7 @@ public class FEntry implements IHasName{
|
||||
setExtractWithHash(extract_withHash);
|
||||
setNUScontentID(NUScontentID);
|
||||
setPathList(pathList);
|
||||
setHash(hash);
|
||||
this.fst = fst;
|
||||
}
|
||||
|
||||
@ -139,45 +146,90 @@ public class FEntry implements IHasName{
|
||||
return folder;
|
||||
}
|
||||
|
||||
public boolean localValidDecryptedFileFound(){
|
||||
boolean result = false;
|
||||
File f = new File(fst.getTmd().getNUSTitle().getTargetPath() + getFullPath());
|
||||
if(f.exists()){
|
||||
if(f.length() == getFileLength()){
|
||||
result = true;
|
||||
if(Settings.deepHashCheck){
|
||||
byte[] fileHash = null;
|
||||
String [] path = getFullPath().split("/");
|
||||
if(!path[1].equals("code") && isExtractWithHash()){
|
||||
fileHash = Arrays.copyOfRange(getHash(),0,0x14); //Little cheat at already hash files.
|
||||
}else{
|
||||
fileHash = HashUtil.hashSHA1(f, 0x8000);
|
||||
}
|
||||
|
||||
byte[] expectedHash = Arrays.copyOfRange(getHash(), 0, 0x14);
|
||||
if(Arrays.equals(fileHash, expectedHash)){
|
||||
result = true;
|
||||
}else{
|
||||
Logger.log(this.fileName + ": decrypted file is invalid. Hash mismatch");
|
||||
Logger.log(this.fileName + " Hash:" + Util.ByteArrayToString(fileHash));
|
||||
Logger.log(this.fileName + " Excpected: " + Util.ByteArrayToString(expectedHash));
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(result){
|
||||
Logger.log("Skipping: " + String.format("%8.2f MB ",getFileLength()/1024.0/1024.0) + getFullPath());
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public boolean localValidEncryptedFileFound() throws IOException{
|
||||
boolean result = false;
|
||||
File f = new File(getContentPath());
|
||||
if(f.exists()){
|
||||
result = true;
|
||||
if(f.length() == fst.getTmd().contents[this.getContentID()].size){
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public void downloadAndDecrypt(Progress progress) {
|
||||
Util.createSubfolder(fst.getTmd().getNUSTitle().getTargetPath() + getFullPath());
|
||||
|
||||
File f = new File(fst.getTmd().getNUSTitle().getTargetPath() + getFullPath());
|
||||
if(f.exists()){
|
||||
if(f.length() == getFileLength()){
|
||||
Logger.log("Skipping: " + String.format("%8.2f MB ",getFileLength()/1024.0/1024.0) + getFullPath());
|
||||
if(progress != null){
|
||||
progress.finish();
|
||||
}
|
||||
return;
|
||||
}
|
||||
if(localValidDecryptedFileFound()){
|
||||
if(progress != null){
|
||||
progress.finish();
|
||||
}
|
||||
return;
|
||||
}
|
||||
try {
|
||||
if(Settings.useCachedFiles){
|
||||
f = new File(getContentPath());
|
||||
if(f.exists()){
|
||||
if(f.length() == fst.getTmd().contents[this.getContentID()].size){
|
||||
Logger.log("Decrypting: " + String.format("%8.2f MB ", getFileLength()/1024.0/1024.0) + getFullPath());
|
||||
Decryption decrypt = new Decryption(fst.getTmd().getNUSTitle().getTicket());
|
||||
decrypt.setProgressListener(progress);
|
||||
decrypt.decrypt(this,getDownloadPath());
|
||||
return;
|
||||
}else{
|
||||
if(!Settings.downloadWhenCachedFilesMissingOrBroken){
|
||||
Logger.log("Cached content has the wrong size! Please check your: "+ getContentPath() + " Downloading not allowed");
|
||||
if(!Settings.skipBrokenFiles){
|
||||
System.err.println("File broken!");
|
||||
System.exit(2);
|
||||
}else{
|
||||
Logger.log("Ignoring the missing file: " + this.getFileName());
|
||||
}
|
||||
}else{
|
||||
if(fst.getTmd().contents[this.getContentID()].error_output_done.addAndGet(1) == 1){
|
||||
Logger.log("Content " + String.format("%08X",getContentID()) + " missing. Downloading the files from the server");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
boolean localCopyValid = localValidEncryptedFileFound();
|
||||
if(localCopyValid){
|
||||
File f = new File(getContentPath());
|
||||
if(f.length() == fst.getTmd().contents[this.getContentID()].size){
|
||||
Logger.log("Decrypting: " + String.format("%8.2f MB ", getFileLength()/1024.0/1024.0) + getFullPath());
|
||||
Decryption decrypt = new Decryption(fst.getTmd().getNUSTitle().getTicket());
|
||||
decrypt.setProgressListener(progress);
|
||||
decrypt.decrypt(this,getDownloadPath());
|
||||
return;
|
||||
}else{
|
||||
|
||||
if(!Settings.downloadWhenCachedFilesMissingOrBroken){
|
||||
Logger.log("Cached content has the wrong size or hash! Please check your: "+ getContentPath() + " re-downloading not allowed");
|
||||
if(!Settings.skipBrokenFiles){
|
||||
System.err.println("File broken!");
|
||||
System.exit(2);
|
||||
}else{
|
||||
Logger.log("Ignoring the missing file: " + this.getFileName());
|
||||
}
|
||||
}else{
|
||||
if(fst.getTmd().contents[this.getContentID()].error_output_done.addAndGet(1) == 1){
|
||||
Logger.log("Content " + String.format("%08X",getContentID()) + " missing. Downloading the files from the server");
|
||||
}
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(!Settings.downloadWhenCachedFilesMissingOrBroken){
|
||||
Logger.log("Content missing. Downloading not allowed");
|
||||
@ -202,13 +254,10 @@ public class FEntry implements IHasName{
|
||||
System.err.println(this.fst.getTmd().getNUSTitle().getLongNameFolder() + " connection failed.");
|
||||
}
|
||||
|
||||
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
System.exit(2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public List<String> getPathList() {
|
||||
@ -222,6 +271,9 @@ public class FEntry implements IHasName{
|
||||
public String getContentPath() {
|
||||
return fst.getTmd().getContentPath() + "/" + String.format("%08X", getNUScontentID()) + ".app";
|
||||
}
|
||||
public String getH3Path() {
|
||||
return fst.getTmd().getContentPath() + "/" + String.format("%08X", getNUScontentID()) + ".h3";
|
||||
}
|
||||
|
||||
public long getTitleID() {
|
||||
return fst.getTmd().titleID;
|
||||
@ -244,8 +296,53 @@ public class FEntry implements IHasName{
|
||||
return getFileName();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public byte[] getHash() {
|
||||
return Arrays.copyOfRange(hash,0,20);
|
||||
}
|
||||
|
||||
public void setHash(byte[] hash) {
|
||||
this.hash = hash;
|
||||
}
|
||||
|
||||
public Content getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
public void setContent(Content content) {
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public FST getFst() {
|
||||
return fst;
|
||||
}
|
||||
|
||||
public byte[] getAsByteArray() throws IOException {
|
||||
boolean localCopyValid = localValidEncryptedFileFound();
|
||||
if(localCopyValid){
|
||||
Logger.log("Decrypting meta.xml");
|
||||
Decryption decrypt = new Decryption(fst.getTmd().getNUSTitle().getTicket());
|
||||
return decrypt.decryptAsByte(this,getDownloadPath());
|
||||
}else{
|
||||
Logger.log("Downloading meta.xml");
|
||||
return downloadAsByteArray();
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] getH3() throws IOException {
|
||||
byte[] h3 = new byte[0x14];
|
||||
File h3_file = new File(getH3Path());
|
||||
if(h3_file.exists()){
|
||||
h3 = Files.readAllBytes(h3_file.toPath());
|
||||
}else{
|
||||
h3 = Downloader.getInstance().downloadContentH3AsByte(getFst().getTmd().getNUSTitle().getTitleID(), getNUScontentID());
|
||||
}
|
||||
if(!Arrays.equals(HashUtil.hashSHA1(h3),getHash())){
|
||||
System.out.println(".h3 file checksum failed");
|
||||
System.out.println("real hash :" + Util.ByteArrayToString(HashUtil.hashSHA1(h3)));
|
||||
System.out.println("expected hash:" + Util.ByteArrayToString(getHash()));
|
||||
System.exit(-2);
|
||||
}
|
||||
return h3;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package de.mas.jnustool;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@ -94,6 +95,18 @@ public class FST {
|
||||
int[] LEntry = new int[16];
|
||||
int[] Entry = new int[16];
|
||||
|
||||
/*
|
||||
for(int i = 0;i<totalContentCount;i++){
|
||||
int my_offset = 0x20 + (i* 0x20);
|
||||
int address = Util.getIntFromBytes(decrypteddata, my_offset+ 0) ;
|
||||
long parentid = Util.getLongFromBytes(decrypteddata, my_offset+ 8) ;
|
||||
int groupid = Util.getIntFromBytes(decrypteddata, my_offset+ 16) ;
|
||||
int size = Util.getIntFromBytes(decrypteddata, my_offset+ 4);
|
||||
byte hashmode = decrypteddata[my_offset+ 20];
|
||||
System.out.print(String.format("Content %02X: ", i) + " offset " + String.format("%08X", address)+ " size " + String.format("%08X", size) +" ");
|
||||
System.out.println(String.format("parent(?) %016X: ", parentid) + " groupid " + String.format("%08X", groupid)+ " hashmode " + String.format("%01X", hashmode) +" ");
|
||||
}*/
|
||||
|
||||
for(int i = 0;i<this.totalEntries;i++){
|
||||
boolean dir = false;
|
||||
boolean in_nus_title = true;
|
||||
@ -146,13 +159,17 @@ public class FST {
|
||||
//grabbing flags
|
||||
offset+=4;
|
||||
int flags = Util.getShortFromBytes(decrypteddata, offset);
|
||||
if((flags & FEntry.EXTRACT_WITH_HASH_FLAG) > 0) extract_withHash = true;
|
||||
//if((flags & FEntry.EXTRACT_WITH_HASH_FLAG) > 0) extract_withHash = true;
|
||||
|
||||
if((flags & FEntry.CHANGE_OFFSET_FLAG) == 0) fileOffset <<=5;
|
||||
|
||||
//grabbing contentid
|
||||
offset+=2;
|
||||
contentID = Util.getShortFromBytes(decrypteddata, offset) ;
|
||||
|
||||
|
||||
if((tmd.contents[contentID].type & 0x2003) == 0x2003){
|
||||
extract_withHash = true;
|
||||
}
|
||||
|
||||
//remember total size
|
||||
this.totalContentSize += fileLength;
|
||||
@ -162,6 +179,7 @@ public class FST {
|
||||
|
||||
List<String> pathList = new ArrayList<>();
|
||||
//getting the full path of entry
|
||||
|
||||
if(dir)
|
||||
{
|
||||
dirEntries++;
|
||||
@ -171,7 +189,20 @@ public class FST {
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
if(in_nus_title){
|
||||
System.out.println("Dirname: " + filename);
|
||||
System.out.println("ID: " + i);
|
||||
System.out.println("ParentOffset: " + parentOffset);
|
||||
System.out.println(" NextOffset: " + nextOffset);
|
||||
}*/
|
||||
}else{
|
||||
/*
|
||||
if(in_nus_title){
|
||||
System.out.println("FILE : " + filename);
|
||||
System.out.println("ID: " + i);
|
||||
}*/
|
||||
StringBuilder sb = new StringBuilder();
|
||||
int k = 0;
|
||||
int nameoffoff,nameoff_entrypath;
|
||||
@ -195,9 +226,9 @@ public class FST {
|
||||
}
|
||||
path = sb.toString();
|
||||
}
|
||||
|
||||
byte[] hash = tmd.contents[contentID].SHA2;
|
||||
//add this to the List!
|
||||
FEntry tmp = new FEntry(path,filename,contentID,tmd.contents[contentID].ID,fileOffset,fileLength,dir,in_nus_title,extract_withHash,pathList,this);
|
||||
FEntry tmp = new FEntry(path,filename,contentID,tmd.contents[contentID].ID,fileOffset,fileLength,dir,in_nus_title,extract_withHash,pathList,this,hash,tmd.contents[contentID]);
|
||||
fileEntries.add(tmp);
|
||||
if(filename.equals("meta.xml")){
|
||||
metaFENtry = tmp;
|
||||
@ -205,7 +236,7 @@ public class FST {
|
||||
if(metafolder){
|
||||
metaFolder.add(tmp);
|
||||
}
|
||||
//Logger.log(fileEntries.get(i));
|
||||
//Logger.log(tmd.contents[contentID].ID + " " + filename);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package de.mas.jnustool;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Files;
|
||||
@ -182,11 +183,15 @@ public class NUSTitle {
|
||||
}
|
||||
tmd.setNUSTitle(this);
|
||||
|
||||
FileOutputStream fw = new FileOutputStream ("fst.dec");
|
||||
fw.write(decryptedFST);
|
||||
fw.close();
|
||||
|
||||
setTargetPath(String.format("%016X", getTitleID()));
|
||||
setLongNameFolder(String.format("%016X", getTitleID()));
|
||||
|
||||
if(fst != null && fst.metaFENtry != null){
|
||||
byte[] metaxml = fst.metaFENtry.downloadAsByteArray();
|
||||
byte[] metaxml = fst.metaFENtry.getAsByteArray();
|
||||
if(metaxml != null){
|
||||
try{
|
||||
InputStream bis = new ByteArrayInputStream(metaxml);
|
||||
@ -236,7 +241,7 @@ public class NUSTitle {
|
||||
Downloader.getInstance().downloadTicket(titleID,getContentPath());
|
||||
Logger.log("Downloaded title.tik");
|
||||
}catch(Exception e){
|
||||
Logger.log("!!!Missing file: title.tik. You need to add it manually before you can install this title.!!!");
|
||||
|
||||
}
|
||||
}else{
|
||||
Logger.log("Skipped title.tik");
|
||||
|
@ -1,10 +1,6 @@
|
||||
package de.mas.jnustool;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -16,24 +12,24 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import de.mas.jnustool.gui.NUSGUI;
|
||||
import de.mas.jnustool.gui.UpdateChooser;
|
||||
import de.mas.jnustool.util.Downloader;
|
||||
import de.mas.jnustool.util.NUSTitleInformation;
|
||||
import de.mas.jnustool.util.Settings;
|
||||
import de.mas.jnustool.util.UpdateListManager;
|
||||
import de.mas.jnustool.util.Util;
|
||||
|
||||
public class Starter {
|
||||
|
||||
private static String updateCSVPath;
|
||||
|
||||
public static void main(String[] args) {
|
||||
Logger.log("JNUSTool 0.0.8c - alpha - by Maschell");
|
||||
Logger.log("JNUSTool 0.2 - by Maschell");
|
||||
Logger.log("");
|
||||
try {
|
||||
readConfig();
|
||||
Settings.readConfig();
|
||||
} catch (IOException e) {
|
||||
System.err.println("Error while reading config! Needs to be:");
|
||||
System.err.println("DOWNLOAD URL BASE");
|
||||
System.err.println("COMMONKEY");
|
||||
System.err.println("updateinfos.csv");
|
||||
System.err.println("UPDATELIST VERSION URL");
|
||||
System.err.println("UPDATELIST URL PATTERN");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -87,8 +83,20 @@ public class Starter {
|
||||
m.setVisible(true);
|
||||
}
|
||||
}else{
|
||||
for(final NUSTitleInformation nus : getTitleID()){
|
||||
|
||||
List<NUSTitleInformation> updatelist = UpdateListManager.getTitles();
|
||||
List<NUSTitleInformation> result = new ArrayList<>();
|
||||
if(updatelist != null){
|
||||
UpdateChooser.createAndShowGUI(updatelist,result);
|
||||
synchronized (result) {
|
||||
try {
|
||||
result.wait();
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
for(final NUSTitleInformation nus : result){
|
||||
final long tID = nus.getTitleID();
|
||||
new Thread(new Runnable() {
|
||||
|
||||
@ -101,103 +109,6 @@ public class Starter {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static List<NUSTitleInformation> getTitleID() {
|
||||
List<NUSTitleInformation> updatelist = readUpdateCSV();
|
||||
List<NUSTitleInformation> result = null;
|
||||
if(updatelist != null){
|
||||
result = new ArrayList<>();
|
||||
UpdateChooser.createAndShowGUI(updatelist,result);
|
||||
synchronized (result) {
|
||||
try {
|
||||
result.wait();
|
||||
} catch (InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}else{
|
||||
Logger.messageBox("Updatefile is missing or not in config?");
|
||||
System.exit(2);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@SuppressWarnings("resource")
|
||||
private static List<NUSTitleInformation> readUpdateCSV() {
|
||||
if(updateCSVPath == null) return null;
|
||||
BufferedReader in = null;
|
||||
List<NUSTitleInformation> list = new ArrayList<>();
|
||||
try {
|
||||
in = new BufferedReader(new InputStreamReader(new FileInputStream(new File(updateCSVPath)), "UTF-8"));
|
||||
String line;
|
||||
while((line = in.readLine()) != null){
|
||||
String[] infos = line.split(";");
|
||||
if(infos.length != 8) {
|
||||
Logger.messageBox("Updatelist is broken!");
|
||||
Logger.log("Updatelist is broken!");
|
||||
return null;
|
||||
}
|
||||
long titleID = Util.StringToLong(infos[0].replace("-", ""));
|
||||
int region = Integer.parseInt(infos[1]);
|
||||
String content_platform = infos[2];
|
||||
String company_code = infos[3];
|
||||
String product_code = infos[4];
|
||||
String ID6 = infos[5];
|
||||
String longnameEN = infos[6];
|
||||
String[] versions = infos[7].split(",");
|
||||
NUSTitleInformation info = new NUSTitleInformation(titleID, longnameEN, ID6, product_code, content_platform, company_code, region,versions);
|
||||
|
||||
list.add(info);
|
||||
}
|
||||
in.close();
|
||||
} catch (IOException | NumberFormatException e) {
|
||||
try {
|
||||
if(in != null)in.close();
|
||||
} catch (IOException e1) {
|
||||
}
|
||||
Logger.messageBox("Updatelist is broken or missing");
|
||||
Logger.log("Updatelist is broken!");
|
||||
return null;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void readConfig() throws IOException {
|
||||
BufferedReader in = new BufferedReader(new FileReader(new File("config")));
|
||||
Downloader.URL_BASE = in.readLine();
|
||||
String commonkey = in.readLine();
|
||||
if(commonkey.length() != 32){
|
||||
Logger.messageBox("CommonKey length is wrong");
|
||||
Logger.log("Commonkey length is wrong");
|
||||
System.exit(1);
|
||||
}
|
||||
Util.commonKey = Util.hexStringToByteArray(commonkey);
|
||||
updateCSVPath = in.readLine();
|
||||
in.close();
|
||||
|
||||
}
|
||||
|
||||
public static boolean deleteFolder(File element) {
|
||||
if (element.isDirectory()) {
|
||||
for (File sub : element.listFiles()) {
|
||||
if(sub.isFile()){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (File sub : element.listFiles()) {
|
||||
if(!deleteFolder(sub)) return false;
|
||||
}
|
||||
}
|
||||
element.delete();
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void downloadMeta(List<NUSTitleInformation> output_, final Progress totalProgress) {
|
||||
ForkJoinPool pool = ForkJoinPool.commonPool();
|
||||
@ -209,10 +120,9 @@ public class Starter {
|
||||
@Override
|
||||
public Boolean call() throws Exception {
|
||||
NUSTitle nusa = new NUSTitle(tID,nus.getSelectedVersion(),Util.ByteArrayToString(nus.getKey()));
|
||||
Progress childProgress = new Progress();
|
||||
|
||||
Progress childProgress = new Progress();
|
||||
totalProgress.add(childProgress);
|
||||
deleteFolder(new File(nusa.getLongNameFolder() + "/updates"));
|
||||
Util.deleteFolder(new File(nusa.getLongNameFolder() + "/updates"));
|
||||
nusa.setTargetPath(nusa.getLongNameFolder());
|
||||
nusa.decryptFEntries(nusa.getFst().getMetaFolder(),childProgress);
|
||||
return true;
|
||||
@ -303,6 +213,7 @@ public class Starter {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -205,7 +205,6 @@ public class TitleMetaData {
|
||||
* @throws IOException
|
||||
*/
|
||||
public void downloadContents(Progress progress) throws IOException{
|
||||
|
||||
String tmpPath = getContentPath();
|
||||
File f = new File(tmpPath);
|
||||
if(!f.exists())f.mkdir();
|
||||
|
@ -1,11 +1,14 @@
|
||||
package de.mas.jnustool.util;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.file.Files;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.MessageDigest;
|
||||
@ -20,6 +23,7 @@ import javax.crypto.spec.IvParameterSpec;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
import de.mas.jnustool.FEntry;
|
||||
import de.mas.jnustool.Logger;
|
||||
import de.mas.jnustool.Progress;
|
||||
import de.mas.jnustool.TIK;
|
||||
|
||||
@ -107,60 +111,93 @@ public class Decryption {
|
||||
this.IV = Arrays.copyOfRange(blockBuffer,BLOCKSIZE-16, BLOCKSIZE);
|
||||
return output;
|
||||
}
|
||||
|
||||
byte[] hash = new byte[20];
|
||||
byte[] h0 = new byte[20];
|
||||
|
||||
public byte[] decryptFileChunkHash(byte[] blockBuffer, int BLOCKSIZE, int block, int contentID){
|
||||
if(BLOCKSIZE != 0x10000) throw new IllegalArgumentException("Blocksize not supported");
|
||||
IV = new byte[16];
|
||||
IV[1] = (byte)contentID;
|
||||
|
||||
public byte[] decryptFileChunkHash(byte[] blockBuffer, int block, int contentID,byte[] h3_hashes){
|
||||
IV = ByteBuffer.allocate(16).putShort((short) contentID).array();
|
||||
|
||||
byte[] hashes = decryptFileChunk(blockBuffer,0x0400,IV);
|
||||
|
||||
System.arraycopy(hashes, (int) (0x14*block), IV, 0, 16);
|
||||
System.arraycopy(hashes, (int) (0x14*block), h0, 0, 20);
|
||||
hashes[1] ^= (byte)contentID;
|
||||
|
||||
if( block == 0 )
|
||||
IV[1] ^= (byte)contentID;
|
||||
//System.out.println("block : " + String.format("%04d", block) +":" +Util.ByteArrayToString(hashes));
|
||||
|
||||
int H0_start = (block % 16) * 20;
|
||||
int H1_start = (16 + (block / 16) % 16) * 20;
|
||||
int H2_start = (32 + (block / 256) % 16) * 20;
|
||||
int H3_start = ((block / 4096) % 16) * 20;
|
||||
|
||||
IV = Arrays.copyOfRange(hashes,H0_start,H0_start + 16);
|
||||
|
||||
byte[] output = decryptFileChunk(blockBuffer,0x400,0xFC00,IV);
|
||||
|
||||
hash = hash(output);
|
||||
if(block == 0)
|
||||
hash[1] ^= contentID;
|
||||
|
||||
if(!Arrays.equals(hash, h0)){
|
||||
System.out.println("checksum failed");
|
||||
System.out.println(Util.ByteArrayToString(hash));
|
||||
System.out.println(Util.ByteArrayToString(h0));
|
||||
throw new IllegalArgumentException("checksumfail");
|
||||
byte[] real_h0_hash = HashUtil.hashSHA1(output);
|
||||
byte[] expected_h0_hash = Arrays.copyOfRange(hashes,H0_start,H0_start + 20);
|
||||
|
||||
if(!Arrays.equals(real_h0_hash,expected_h0_hash)){
|
||||
System.out.println("h0 checksum failed");
|
||||
System.out.println("real hash :" + Util.ByteArrayToString(real_h0_hash));
|
||||
System.out.println("expected hash:" + Util.ByteArrayToString(expected_h0_hash));
|
||||
System.exit(2);
|
||||
throw new IllegalArgumentException("h0 checksumfail");
|
||||
}else{
|
||||
//System.out.println("checksum right!");
|
||||
//System.out.println("h0 checksum right!");
|
||||
}
|
||||
|
||||
if ((block % 16) == 0){
|
||||
byte[] expected_h1_hash = Arrays.copyOfRange(hashes,H1_start,H1_start + 20);
|
||||
byte[] real_h1_hash = HashUtil.hashSHA1(Arrays.copyOfRange(hashes,H0_start,H0_start + (16*20)));
|
||||
//System.out.println("Using h1 for :" + Util.ByteArrayToString(Arrays.copyOfRange(hashes,H0_start,H0_start + (16*20))));
|
||||
if(!Arrays.equals(expected_h1_hash, real_h1_hash)){
|
||||
System.out.println("h1 checksum failed");
|
||||
System.out.println("real hash :" + Util.ByteArrayToString(real_h1_hash));
|
||||
System.out.println("expected hash:" + Util.ByteArrayToString(expected_h1_hash));
|
||||
System.exit(2);
|
||||
throw new IllegalArgumentException("h1 checksumfail");
|
||||
}else{
|
||||
//System.out.println("h1 checksum right!");
|
||||
}
|
||||
}
|
||||
|
||||
if ((block % 256) == 0){
|
||||
byte[] expected_h2_hash = Arrays.copyOfRange(hashes,H2_start,H2_start + 20);
|
||||
byte[] real_h2_hash = HashUtil.hashSHA1(Arrays.copyOfRange(hashes,H1_start,H1_start + (16*20)));
|
||||
|
||||
if(!Arrays.equals(expected_h2_hash, real_h2_hash)){
|
||||
System.out.println("h2 checksum failed");
|
||||
System.out.println("real hash :" + Util.ByteArrayToString(real_h2_hash));
|
||||
System.out.println("expected hash:" + Util.ByteArrayToString(expected_h2_hash));
|
||||
System.exit(2);
|
||||
throw new IllegalArgumentException("h2 checksumfail");
|
||||
|
||||
}else{
|
||||
//System.out.println("h2 checksum right!");
|
||||
}
|
||||
}
|
||||
|
||||
if ((block % 4096) == 0){
|
||||
byte[] expected_h3_hash = Arrays.copyOfRange(h3_hashes,H3_start,H3_start + 20);
|
||||
byte[] real_h3_hash = HashUtil.hashSHA1(Arrays.copyOfRange(hashes,H2_start,H2_start + (16*20)));
|
||||
|
||||
if(!Arrays.equals(expected_h3_hash, real_h3_hash)){
|
||||
System.out.println("h3 checksum failed");
|
||||
System.out.println("real hash :" + Util.ByteArrayToString(real_h3_hash));
|
||||
System.out.println("expected hash:" + Util.ByteArrayToString(expected_h3_hash));
|
||||
System.exit(2);
|
||||
throw new IllegalArgumentException("h3 checksumfail");
|
||||
}else{
|
||||
//System.out.println("h3 checksum right!");
|
||||
}
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
public static byte[] hash(byte[] hashThis) {
|
||||
try {
|
||||
byte[] hash = new byte[20];
|
||||
MessageDigest md = MessageDigest.getInstance("SHA-1");
|
||||
hash = md.digest(hashThis);
|
||||
return hash;
|
||||
} catch (NoSuchAlgorithmException nsae) {
|
||||
System.err.println("SHA-1 algorithm is not available...");
|
||||
System.exit(2);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public void decryptFile(InputStream inputStream, OutputStream outputStream,FEntry toDownload) throws IOException{
|
||||
|
||||
public boolean decryptFile(InputStream inputStream, OutputStream outputStream,FEntry toDownload) throws IOException{
|
||||
int BLOCKSIZE = 0x8000;
|
||||
long dlFileLength = toDownload.getFileLength();
|
||||
if(dlFileLength > (dlFileLength/BLOCKSIZE)*BLOCKSIZE){
|
||||
dlFileLength = ((dlFileLength/BLOCKSIZE)*BLOCKSIZE) +BLOCKSIZE;
|
||||
}
|
||||
}
|
||||
|
||||
byte[] IV = new byte[16];
|
||||
IV[1] = (byte)toDownload.getContentID();
|
||||
@ -176,41 +213,72 @@ public class Decryption {
|
||||
progressListener.setTotal(toDownload.getFileLength());
|
||||
progressListener.resetCurrent();
|
||||
}
|
||||
|
||||
|
||||
MessageDigest sha1 = null;
|
||||
try {
|
||||
sha1 = MessageDigest.getInstance("SHA1");
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
do{
|
||||
inBlockBuffer = getChunkFromStream(inputStream,blockBuffer,overflow,BLOCKSIZE);
|
||||
if(first){
|
||||
first = false;
|
||||
}else{
|
||||
IV = null;
|
||||
}
|
||||
|
||||
byte[] output = decryptFileChunk(blockBuffer,BLOCKSIZE,IV);
|
||||
|
||||
if((wrote + inBlockBuffer) > toDownload.getFileLength()){
|
||||
inBlockBuffer = (int) (toDownload.getFileLength()- wrote);
|
||||
}
|
||||
if(progressListener != null){
|
||||
progressListener.addCurrent(inBlockBuffer);
|
||||
}
|
||||
wrote += inBlockBuffer;
|
||||
outputStream.write(output, 0, inBlockBuffer);
|
||||
inBlockBuffer = Util.getChunkFromStream(inputStream,blockBuffer,overflow,BLOCKSIZE);
|
||||
if(first){
|
||||
first = false;
|
||||
}else{
|
||||
IV = null;
|
||||
}
|
||||
|
||||
byte[] output = decryptFileChunk(blockBuffer,BLOCKSIZE,IV);
|
||||
|
||||
if(sha1 != null){
|
||||
sha1.update(output);
|
||||
}
|
||||
|
||||
if((wrote + inBlockBuffer) > toDownload.getFileLength()){
|
||||
inBlockBuffer = (int) (toDownload.getFileLength()- wrote);
|
||||
}
|
||||
if(progressListener != null){
|
||||
progressListener.addCurrent(inBlockBuffer);
|
||||
}
|
||||
wrote += inBlockBuffer;
|
||||
outputStream.write(output, 0, inBlockBuffer);
|
||||
}while(inBlockBuffer == BLOCKSIZE);
|
||||
|
||||
|
||||
byte[] hash = sha1.digest();
|
||||
byte[] real_hash = toDownload.getHash();
|
||||
|
||||
boolean result = true;
|
||||
if(!Arrays.equals(hash, real_hash)){
|
||||
Logger.messageBox("Checksum fail for: " + toDownload.getFileName() + " =(. Content " + String.format("%08X.app", toDownload.getContentID()) + " likely is broken. Please re-download it!");
|
||||
System.out.println(Util.ByteArrayToString(hash));
|
||||
System.out.println(Util.ByteArrayToString(real_hash));
|
||||
System.exit(-1);
|
||||
//throw new IllegalArgumentException("Checksum fail for: " + toDownload.getFileName());
|
||||
}else{
|
||||
Logger.log("Checksum okay for: " + toDownload.getFileName());
|
||||
}
|
||||
|
||||
outputStream.close();
|
||||
inputStream.close();
|
||||
return result;
|
||||
}
|
||||
public void decryptFileHash(InputStream inputStream, OutputStream outputStream,FEntry toDownload) throws IOException{
|
||||
public boolean decryptFileHash(InputStream inputStream, OutputStream outputStream,FEntry toDownload,byte[] h3) throws IOException{
|
||||
int BLOCKSIZE = 0x10000;
|
||||
int HASHBLOCKSIZE = 0xFC00;
|
||||
|
||||
long writeSize = HASHBLOCKSIZE;
|
||||
long block = (toDownload.getFileOffset() / HASHBLOCKSIZE) & 0xF;
|
||||
long soffset = toDownload.getFileOffset() - (toDownload.getFileOffset() / HASHBLOCKSIZE * HASHBLOCKSIZE);
|
||||
long size = toDownload.getFileLength();
|
||||
long block = (toDownload.getFileOffset() / HASHBLOCKSIZE);
|
||||
|
||||
long soffset = toDownload.getFileOffset() - (toDownload.getFileOffset() / HASHBLOCKSIZE * HASHBLOCKSIZE);
|
||||
|
||||
long size = toDownload.getFileLength();
|
||||
|
||||
if( soffset+size > writeSize )
|
||||
writeSize = writeSize - soffset;
|
||||
|
||||
|
||||
|
||||
byte[] encryptedBlockBuffer = new byte[BLOCKSIZE];
|
||||
ByteArrayBuffer overflow = new ByteArrayBuffer(BLOCKSIZE);
|
||||
|
||||
@ -222,14 +290,14 @@ public class Decryption {
|
||||
progressListener.resetCurrent();
|
||||
}
|
||||
do{
|
||||
inBlockBuffer = getChunkFromStream(inputStream,encryptedBlockBuffer,overflow,BLOCKSIZE);
|
||||
inBlockBuffer = Util.getChunkFromStream(inputStream,encryptedBlockBuffer,overflow,BLOCKSIZE);
|
||||
if(progressListener != null){
|
||||
progressListener.addCurrent(inBlockBuffer);
|
||||
}
|
||||
if( writeSize > size )
|
||||
writeSize = size;
|
||||
|
||||
byte[] output = decryptFileChunkHash(encryptedBlockBuffer, BLOCKSIZE, (int) block,toDownload.getContentID());
|
||||
byte[] output = decryptFileChunkHash(encryptedBlockBuffer, (int) block,toDownload.getContentID(),h3);
|
||||
|
||||
if((wrote + writeSize) > toDownload.getFileLength()){
|
||||
writeSize = (int) (toDownload.getFileLength()- wrote);
|
||||
@ -238,9 +306,7 @@ public class Decryption {
|
||||
outputStream.write(output, (int)(0+soffset), (int)writeSize);
|
||||
wrote +=writeSize;
|
||||
|
||||
block++;
|
||||
if( block >= 16 )
|
||||
block = 0;
|
||||
block++;
|
||||
|
||||
if( soffset > 0)
|
||||
{
|
||||
@ -251,63 +317,54 @@ public class Decryption {
|
||||
|
||||
outputStream.close();
|
||||
inputStream.close();
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public byte[] decryptAsByte(FEntry fileEntry,String outputPath) throws IOException {
|
||||
InputStream input = new FileInputStream(fileEntry.getContentPath());
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
|
||||
decryptStream(input,bos,fileEntry);
|
||||
|
||||
byte[] result = bos.toByteArray();
|
||||
bos.close();
|
||||
return result;
|
||||
}
|
||||
|
||||
public void decrypt(FEntry fileEntry,String outputPath) throws IOException {
|
||||
String [] path = fileEntry.getFullPath().split("/");
|
||||
boolean decryptWithHash = false;
|
||||
if(!path[1].equals("code") && fileEntry.isExtractWithHash()){
|
||||
decryptWithHash = true;
|
||||
}
|
||||
|
||||
long fileOffset = fileEntry.getFileOffset();
|
||||
if(decryptWithHash){
|
||||
int BLOCKSIZE = 0x10000;
|
||||
int HASHBLOCKSIZE = 0xFC00;
|
||||
fileOffset = ((fileEntry.getFileOffset() / HASHBLOCKSIZE) * BLOCKSIZE);
|
||||
}
|
||||
|
||||
|
||||
InputStream input = new FileInputStream(fileEntry.getContentPath());
|
||||
FileOutputStream outputStream = new FileOutputStream(outputPath + "/" + fileEntry.getFileName());
|
||||
|
||||
input.skip(fileOffset);
|
||||
|
||||
if(!decryptWithHash){
|
||||
decryptFile(input, outputStream, fileEntry);
|
||||
}else{
|
||||
decryptFileHash(input, outputStream, fileEntry);
|
||||
}
|
||||
decryptStream(input,outputStream,fileEntry);
|
||||
}
|
||||
|
||||
|
||||
private int getChunkFromStream(InputStream inputStream,byte[] output, ByteArrayBuffer overflowbuffer,int BLOCKSIZE) throws IOException {
|
||||
int bytesRead = -1;
|
||||
int inBlockBuffer = 0;
|
||||
do{
|
||||
bytesRead = inputStream.read(overflowbuffer.buffer,overflowbuffer.getLengthOfDataInBuffer(),overflowbuffer.getSpaceLeft());
|
||||
if(bytesRead <= 0) break;
|
||||
|
||||
overflowbuffer.addLengthOfDataInBuffer(bytesRead);
|
||||
|
||||
if(inBlockBuffer + overflowbuffer.getLengthOfDataInBuffer() > BLOCKSIZE){
|
||||
int tooMuch = (inBlockBuffer + bytesRead) - BLOCKSIZE;
|
||||
int toRead = BLOCKSIZE - inBlockBuffer;
|
||||
|
||||
System.arraycopy(overflowbuffer.buffer, 0, output, inBlockBuffer, toRead);
|
||||
inBlockBuffer += toRead;
|
||||
|
||||
System.arraycopy(overflowbuffer.buffer, toRead, overflowbuffer.buffer, 0, tooMuch);
|
||||
overflowbuffer.setLengthOfDataInBuffer(tooMuch);
|
||||
}else{
|
||||
System.arraycopy(overflowbuffer.buffer, 0, output, inBlockBuffer, overflowbuffer.getLengthOfDataInBuffer());
|
||||
inBlockBuffer +=overflowbuffer.getLengthOfDataInBuffer();
|
||||
overflowbuffer.resetLengthOfDataInBuffer();
|
||||
}
|
||||
}while(inBlockBuffer != BLOCKSIZE);
|
||||
return inBlockBuffer;
|
||||
}
|
||||
public void decryptStream(InputStream input,OutputStream outputStream,FEntry fileEntry) throws IOException {
|
||||
String [] path = fileEntry.getFullPath().split("/");
|
||||
boolean decryptWithHash = false;
|
||||
if(/*!path[1].equals("code") && */fileEntry.isExtractWithHash()){
|
||||
decryptWithHash = true;
|
||||
}
|
||||
long fileOffset = fileEntry.getFileOffset();
|
||||
if(decryptWithHash){
|
||||
int BLOCKSIZE = 0x10000;
|
||||
int HASHBLOCKSIZE = 0xFC00;
|
||||
fileOffset = ((fileEntry.getFileOffset() / HASHBLOCKSIZE) * BLOCKSIZE);
|
||||
}
|
||||
|
||||
input.skip(fileOffset);
|
||||
|
||||
boolean result = false;
|
||||
if(!decryptWithHash){
|
||||
result = decryptFile(input, outputStream, fileEntry);
|
||||
}else{
|
||||
byte[] h3 = fileEntry.getH3();
|
||||
result = decryptFileHash(input, outputStream, fileEntry,h3);
|
||||
}
|
||||
if(!result){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private Progress progressListener = null;
|
||||
|
||||
@ -315,6 +372,93 @@ public class Decryption {
|
||||
this.progressListener = progressOfFile;
|
||||
|
||||
}
|
||||
|
||||
/* Checking encrypted files is just a pain. Maybe I'll add it later ~
|
||||
public byte[] getHashEncryptedFile(File f, List<FEntry> list) throws IOException {
|
||||
if(list == null || list.size() > 1){
|
||||
return new byte[0x14];
|
||||
}else{
|
||||
}
|
||||
FEntry fentry = list.get(0);
|
||||
String [] path = fentry.getFullPath().split("/");
|
||||
boolean decryptWithHash = false;
|
||||
if(path.length < 2) return new byte[0x14];
|
||||
if(!path[1].equals("code") && fentry.isExtractWithHash()){
|
||||
decryptWithHash = true;
|
||||
}
|
||||
|
||||
long fileOffset = fentry.getFileOffset();
|
||||
if(decryptWithHash){
|
||||
int BLOCKSIZE = 0x10000;
|
||||
int HASHBLOCKSIZE = 0xFC00;
|
||||
fileOffset = ((fentry.getFileOffset() / HASHBLOCKSIZE) * BLOCKSIZE);
|
||||
}
|
||||
|
||||
InputStream input = new FileInputStream(fentry.getContentPath());
|
||||
|
||||
input.skip(fileOffset);
|
||||
|
||||
byte[] result = new byte[0x14];
|
||||
if(!decryptWithHash){
|
||||
result = getHashEncryptedFileNormal(input, fentry);
|
||||
}else{
|
||||
result = getHashEncryptedFileHashed(input, fentry);
|
||||
}
|
||||
return Arrays.copyOfRange(result,0,0x14);
|
||||
}
|
||||
|
||||
private byte[] getHashEncryptedFileHashed(InputStream input, FEntry fileEntry) {
|
||||
return fileEntry.getHash(); //Ups.
|
||||
}
|
||||
|
||||
private byte[] getHashEncryptedFileNormal(InputStream inputStream, FEntry fileEntry) throws IOException {
|
||||
int BLOCKSIZE = 0x8000;
|
||||
|
||||
byte[] IV = new byte[16];
|
||||
IV[1] = (byte)fileEntry.getContentID();
|
||||
|
||||
byte[] blockBuffer = new byte[BLOCKSIZE];
|
||||
|
||||
int inBlockBuffer;
|
||||
|
||||
boolean first = true;
|
||||
ByteArrayBuffer overflow = new ByteArrayBuffer(BLOCKSIZE);
|
||||
|
||||
MessageDigest sha1 = null;
|
||||
try {
|
||||
sha1 = MessageDigest.getInstance("SHA1");
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
long proccessed = 0;
|
||||
do{
|
||||
inBlockBuffer = Util.getChunkFromStream(inputStream,blockBuffer,overflow,BLOCKSIZE);
|
||||
if(first){
|
||||
first = false;
|
||||
}else{
|
||||
IV = null;
|
||||
}
|
||||
|
||||
byte[] output = decryptFileChunk(blockBuffer,BLOCKSIZE,IV);
|
||||
|
||||
if(sha1 != null){
|
||||
sha1.update(output);
|
||||
}else{
|
||||
break;
|
||||
}
|
||||
proccessed += inBlockBuffer;
|
||||
}while(proccessed < fileEntry.getFileLength() && inBlockBuffer == BLOCKSIZE);
|
||||
|
||||
byte[] hash = new byte[0x14];
|
||||
if(sha1 != null){
|
||||
hash = sha1.digest();
|
||||
}
|
||||
|
||||
inputStream.close();
|
||||
return hash;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ public class Downloader {
|
||||
URL url = new URL(URL);
|
||||
String [] path = toDownload.getFullPath().split("/");
|
||||
boolean decryptWithHash = false;
|
||||
if(!path[1].equals("code") && toDownload.isExtractWithHash()){
|
||||
if(/*!path[1].equals("code") &&*/ toDownload.isExtractWithHash()){
|
||||
decryptWithHash = true;
|
||||
}
|
||||
HttpURLConnection connection =(HttpURLConnection) url.openConnection();
|
||||
@ -64,7 +64,8 @@ public class Downloader {
|
||||
if(!decryptWithHash){
|
||||
decryption.decryptFile(input, outputStream, toDownload);
|
||||
}else{
|
||||
decryption.decryptFileHash(input, outputStream, toDownload);
|
||||
byte[] h3 = toDownload.getH3();
|
||||
decryption.decryptFileHash(input, outputStream, toDownload,h3);
|
||||
}
|
||||
connection.disconnect();
|
||||
if(asByteArray){
|
||||
@ -138,7 +139,7 @@ public class Downloader {
|
||||
return downloadFileToByteArray(URL);
|
||||
}
|
||||
|
||||
private byte[] downloadFileToByteArray(String fileURL) throws IOException {
|
||||
public byte[] downloadFileToByteArray(String fileURL) throws IOException {
|
||||
|
||||
int BUFFER_SIZE = 0x800;
|
||||
URL url = new URL(fileURL);
|
||||
@ -172,6 +173,40 @@ public class Downloader {
|
||||
return file;
|
||||
}
|
||||
|
||||
public byte[] downloadHTTPSFileToByteArray(String fileURL) throws IOException {
|
||||
|
||||
int BUFFER_SIZE = 0x800;
|
||||
URL url = new URL(fileURL);
|
||||
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
|
||||
int responseCode = httpConn.getResponseCode();
|
||||
|
||||
// always check HTTP response code first
|
||||
byte[] file = null;
|
||||
|
||||
if (responseCode == HttpURLConnection.HTTP_OK) {
|
||||
int contentLength = httpConn.getContentLength();
|
||||
|
||||
file = new byte[contentLength];
|
||||
// always check HTTP response code first
|
||||
|
||||
InputStream inputStream = httpConn.getInputStream();
|
||||
|
||||
int bytesRead = -1;
|
||||
byte[] buffer = new byte[BUFFER_SIZE];
|
||||
int filePostion = 0;
|
||||
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
||||
System.arraycopy(buffer, 0, file, filePostion,bytesRead);
|
||||
filePostion+=bytesRead;
|
||||
|
||||
}
|
||||
inputStream.close();
|
||||
}else{
|
||||
Logger.log("File not found: " + fileURL);
|
||||
}
|
||||
httpConn.disconnect();
|
||||
return file;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public byte[] downloadTicketToByteArray(long titleID) throws IOException {
|
||||
@ -188,5 +223,10 @@ public class Downloader {
|
||||
downloadFile(URL, String.format("%08X", contentID) +".h3",tmpPath,progress);
|
||||
}
|
||||
|
||||
public byte[] downloadContentH3AsByte(long titleID, int contentID) throws IOException {
|
||||
String URL = URL_BASE + "/" + String.format("%016X", titleID) + "/" + String.format("%08X", contentID) + ".h3";
|
||||
return downloadFileToByteArray(URL);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
88
src/de/mas/jnustool/util/HashUtil.java
Normal file
88
src/de/mas/jnustool/util/HashUtil.java
Normal file
@ -0,0 +1,88 @@
|
||||
package de.mas.jnustool.util;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class HashUtil {
|
||||
public static byte[] hashSHA2(byte[] data){
|
||||
MessageDigest sha256;
|
||||
try {
|
||||
sha256 = MessageDigest.getInstance("SHA-256");
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
return new byte[0x20];
|
||||
}
|
||||
|
||||
return sha256.digest(data);
|
||||
}
|
||||
|
||||
public static byte[] hashSHA1(byte[] data){
|
||||
MessageDigest sha1;
|
||||
try {
|
||||
sha1 = MessageDigest.getInstance("SHA1");
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
return new byte[0x14];
|
||||
}
|
||||
|
||||
return sha1.digest(data);
|
||||
}
|
||||
|
||||
public static byte[] hashSHA1(File file) {
|
||||
return hashSHA1(file, 0);
|
||||
}
|
||||
|
||||
public static byte[] hashSHA1(File file,int aligmnent) {
|
||||
byte[] hash = new byte[0x14];
|
||||
MessageDigest sha1 = null;
|
||||
try {
|
||||
InputStream in = new FileInputStream(file);
|
||||
sha1 = MessageDigest.getInstance("SHA1");
|
||||
hash = hash(sha1,in,file.length(),0x8000,aligmnent);
|
||||
} catch (NoSuchAlgorithmException | FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
public static byte [] hash(MessageDigest digest, InputStream in,long inputSize, int bufferSize,int alignment) throws IOException {
|
||||
long target_size = alignment == 0 ? inputSize: Util.align(inputSize, alignment);
|
||||
long cur_position = 0;
|
||||
int inBlockBufferRead = 0;
|
||||
byte[] blockBuffer = new byte[bufferSize];
|
||||
ByteArrayBuffer overflow = new ByteArrayBuffer(bufferSize);
|
||||
do{
|
||||
if(cur_position + bufferSize > inputSize){
|
||||
int expectedSize = (int) (inputSize - cur_position);
|
||||
ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
|
||||
|
||||
inBlockBufferRead = Util.getChunkFromStream(in,blockBuffer,overflow,expectedSize);
|
||||
buffer.put(Arrays.copyOfRange(blockBuffer, 0, inBlockBufferRead));
|
||||
blockBuffer = buffer.array();
|
||||
inBlockBufferRead = bufferSize;
|
||||
}else{
|
||||
int expectedSize = bufferSize;
|
||||
inBlockBufferRead = Util.getChunkFromStream(in,blockBuffer,overflow,expectedSize);
|
||||
}
|
||||
digest.update(blockBuffer, 0, inBlockBufferRead);
|
||||
cur_position += inBlockBufferRead;
|
||||
|
||||
}while(cur_position < target_size && (inBlockBufferRead == bufferSize));
|
||||
|
||||
in.close();
|
||||
|
||||
return digest.digest();
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -41,6 +41,19 @@ public class NUSTitleInformation implements Comparable<NUSTitleInformation>, Ser
|
||||
}
|
||||
}
|
||||
|
||||
public void addVersion(int version){
|
||||
this.versions.add(version);
|
||||
}
|
||||
public void addVersion(String version){
|
||||
addVersion(Integer.parseInt(version));
|
||||
}
|
||||
|
||||
public int getVersion(){
|
||||
if(!versions.isEmpty()){
|
||||
return versions.get(versions.size()-1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
public NUSTitleInformation() {
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
@ -122,8 +135,15 @@ public class NUSTitleInformation implements Comparable<NUSTitleInformation>, Ser
|
||||
@Override
|
||||
public String toString(){
|
||||
String result = getTitleIDAsString() + ";" + region +";" + getContent_platform() + ";" + getCompany_code() + ";"+ getProduct_code()+ ";" + getID6() + ";" + getLongnameEN();
|
||||
boolean first = true;
|
||||
for(Integer i :versions){
|
||||
result += ";" + i;
|
||||
if(first){
|
||||
result += ";" + i;
|
||||
first = false;
|
||||
}else{
|
||||
result += "," + i;
|
||||
}
|
||||
|
||||
}
|
||||
//result += ";" + getSelectedVersion();
|
||||
return result;
|
||||
|
@ -1,5 +1,11 @@
|
||||
package de.mas.jnustool.util;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
|
||||
import de.mas.jnustool.Logger;
|
||||
|
||||
public class Settings {
|
||||
public static boolean downloadContent = false;
|
||||
@ -11,4 +17,25 @@ public class Settings {
|
||||
public static boolean DL_ALL_VERSIONS = false;
|
||||
public static String FILELIST_NAME = "filelist.txt";
|
||||
public static boolean logToPrintLn = true;
|
||||
public static String updateCSVPath = "updateinfos.csv";
|
||||
public static boolean updateCSVFromServer = true;
|
||||
public static String updateListVersionURL = "";
|
||||
public static String updateListURL = "%d";
|
||||
public static boolean deepHashCheck = true;
|
||||
|
||||
public static void readConfig() throws IOException {
|
||||
BufferedReader in = new BufferedReader(new FileReader(new File("config")));
|
||||
Downloader.URL_BASE = in.readLine();
|
||||
String commonkey = in.readLine();
|
||||
if(commonkey.length() != 32){
|
||||
Logger.messageBox("CommonKey length is wrong");
|
||||
Logger.log("Commonkey length is wrong");
|
||||
System.exit(1);
|
||||
}
|
||||
Util.commonKey = Util.hexStringToByteArray(commonkey);
|
||||
Settings.updateCSVPath = in.readLine();
|
||||
Settings.updateListVersionURL = in.readLine();
|
||||
Settings.updateListURL = in.readLine();
|
||||
in.close();
|
||||
}
|
||||
}
|
||||
|
285
src/de/mas/jnustool/util/UpdateListManager.java
Normal file
285
src/de/mas/jnustool/util/UpdateListManager.java
Normal file
@ -0,0 +1,285 @@
|
||||
package de.mas.jnustool.util;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.security.SecureRandom;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.ForkJoinPool;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
import javax.net.ssl.SSLContext;
|
||||
import javax.net.ssl.TrustManager;
|
||||
import javax.net.ssl.X509TrustManager;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import de.mas.jnustool.FEntry;
|
||||
import de.mas.jnustool.Logger;
|
||||
import de.mas.jnustool.NUSTitle;
|
||||
|
||||
public class UpdateListManager {
|
||||
public static List<NUSTitleInformation> getTitles() {
|
||||
boolean preSettings = Settings.logToPrintLn;
|
||||
Logger.log("Loading "+ Settings.updateCSVPath);
|
||||
List<NUSTitleInformation> updatelist = readUpdateCSV();
|
||||
if(Settings.updateCSVFromServer){
|
||||
Logger.log("Getting a new updatelist from the server");
|
||||
trustAllCerts();
|
||||
int version = getUpdateListVersion();
|
||||
Logger.log("Downloading updatelist v" + version);
|
||||
List<NUSTitleInformation> newupdatelist = getUpdateList(version);
|
||||
Settings.logToPrintLn = false;
|
||||
updatelist = new ArrayList<>(checkUpdateList(updatelist,newupdatelist));
|
||||
Settings.logToPrintLn = preSettings;
|
||||
|
||||
if(newVersions.get() + newTitle.get() > 0){
|
||||
Logger.log("Got " + (newVersions.get() + newTitle.get()) + " new updates.");
|
||||
Logger.log("New versions: "+ newVersions.get());
|
||||
Logger.log("New titles : "+ newTitle.get());
|
||||
try {
|
||||
Writer fr = new BufferedWriter(new OutputStreamWriter(
|
||||
new FileOutputStream(Settings.updateCSVPath), "UTF-8"));
|
||||
BufferedWriter bw = new BufferedWriter(fr);
|
||||
for(NUSTitleInformation title : updatelist){
|
||||
bw.write(title.toString() +"\r\n");
|
||||
}
|
||||
bw.close();
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
Logger.log("Wrote them to " + Settings.updateCSVPath);
|
||||
Logger.messageBox("Updated the " + Settings.updateCSVPath + "!");
|
||||
}else{
|
||||
Logger.log("Everything is up to date!");
|
||||
}
|
||||
}
|
||||
return updatelist;
|
||||
}
|
||||
static AtomicInteger count = new AtomicInteger(0);
|
||||
static AtomicInteger newVersions = new AtomicInteger(0);
|
||||
static AtomicInteger newTitle = new AtomicInteger(0);
|
||||
|
||||
private static Collection<NUSTitleInformation> checkUpdateList(List<NUSTitleInformation> oldList,List<NUSTitleInformation> newList){
|
||||
Map<Long,NUSTitleInformation> csvListMap = new HashMap<>();
|
||||
for(NUSTitleInformation n : oldList){
|
||||
if(!csvListMap.containsKey(n.getTitleID())){
|
||||
csvListMap.put(n.getTitleID(),n);
|
||||
}
|
||||
}
|
||||
|
||||
List<NUSTitleInformation> needsDownload = new ArrayList<>();
|
||||
for(NUSTitleInformation newTitleInfo : newList){
|
||||
if((newTitleInfo.getTitleID()| 0x0000000E00000000L) != newTitleInfo.getTitleID())continue;
|
||||
if(csvListMap.containsKey(newTitleInfo.getTitleID()| 0x0000000E00000000L)){
|
||||
NUSTitleInformation existing = csvListMap.get(newTitleInfo.getTitleID()| 0x0000000E00000000L);
|
||||
int existingVersion = existing.getVersion();
|
||||
int newVersion = newTitleInfo.getVersion();
|
||||
if(newVersion > existingVersion){
|
||||
existing.addVersion(newVersion);
|
||||
newVersions.incrementAndGet();
|
||||
System.out.println("Found new update: " + newTitleInfo.getTitleIDAsString() + " now v" + newVersion + " instead of v" + existingVersion);
|
||||
}else{
|
||||
//System.out.println("No new version for" + existing.getLongnameEN());
|
||||
}
|
||||
}else{
|
||||
newTitle.incrementAndGet();
|
||||
System.out.println("Found new update: " + newTitleInfo.getTitleIDAsString()+ " v" + newTitleInfo.getVersion());
|
||||
needsDownload.add(newTitleInfo);
|
||||
}
|
||||
}
|
||||
ForkJoinPool pool = ForkJoinPool.commonPool();
|
||||
List<Callable<NUSTitleInformation>> tasks = new ArrayList<>();
|
||||
final int size = needsDownload.size();
|
||||
|
||||
for(NUSTitleInformation n : needsDownload){
|
||||
final NUSTitleInformation test = n;
|
||||
|
||||
tasks.add(new Callable<NUSTitleInformation>() {
|
||||
@Override
|
||||
public NUSTitleInformation call() throws Exception {
|
||||
NUSTitleInformation newinformation = null;
|
||||
NUSTitle foo = new NUSTitle(test.getTitleID()| 0x0000000E00000000L, -1, null);
|
||||
FEntry testa = foo.getFst().metaFENtry;
|
||||
byte[] metaxml = null;
|
||||
|
||||
if(testa != null){
|
||||
try {
|
||||
metaxml = testa.downloadAsByteArray();
|
||||
InputStream stream = new ByteArrayInputStream(metaxml);
|
||||
newinformation = foo.readMeta(stream);
|
||||
newinformation.setTitleID(newinformation.getTitleID() | 0x0000000E00000000L); //Force update
|
||||
newinformation.addVersion(test.getVersion());
|
||||
System.out.println(String.format("( %03d of %03d) ", count.incrementAndGet(),size) +"Downloaded information for " + test.getTitleIDAsString());
|
||||
stream.close();
|
||||
} catch (IOException e) {
|
||||
System.out.println("Downloading information for " + test.getTitleIDAsString() + " failed");
|
||||
}
|
||||
}
|
||||
return newinformation;
|
||||
}
|
||||
});
|
||||
}
|
||||
for(Future<NUSTitleInformation> future :pool.invokeAll(tasks)){
|
||||
NUSTitleInformation newinfo = null;
|
||||
try {
|
||||
newinfo = future.get();
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
System.out.println("Downloading information failed");
|
||||
continue;
|
||||
}
|
||||
if(newinfo != null){
|
||||
csvListMap.put(newinfo.getTitleID(), newinfo);
|
||||
}
|
||||
}
|
||||
return csvListMap.values();
|
||||
|
||||
|
||||
}
|
||||
private static void trustAllCerts() {
|
||||
//Lets ignore the cert warning.
|
||||
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager(){
|
||||
public X509Certificate[] getAcceptedIssuers(){return null;}
|
||||
public void checkClientTrusted(X509Certificate[] certs, String authType){}
|
||||
public void checkServerTrusted(X509Certificate[] certs, String authType){}
|
||||
}};
|
||||
|
||||
// Install the all-trusting trust manager
|
||||
try {
|
||||
SSLContext sc = SSLContext.getInstance("TLS");
|
||||
sc.init(null, trustAllCerts, new SecureRandom());
|
||||
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
|
||||
} catch (Exception e) {
|
||||
;
|
||||
}
|
||||
}
|
||||
private static int getUpdateListVersion(){
|
||||
try {
|
||||
byte[] version_xml = Downloader.getInstance().downloadHTTPSFileToByteArray(Settings.updateListVersionURL);
|
||||
InputStream stream = new ByteArrayInputStream(version_xml);
|
||||
int version = readVersionNumber(stream);
|
||||
stream.close();
|
||||
return version;
|
||||
} catch (IOException e1) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
private static List<NUSTitleInformation> getUpdateList(int version) {
|
||||
List<NUSTitleInformation> list = new ArrayList<>();
|
||||
try {
|
||||
byte[] update_list = Downloader.getInstance().downloadHTTPSFileToByteArray(String.format(Settings.updateListURL, version));
|
||||
if(update_list == null){
|
||||
return list;
|
||||
}
|
||||
InputStream stream = new ByteArrayInputStream(update_list);
|
||||
list = parseUpdateListXML(stream);
|
||||
stream.close();
|
||||
} catch (IOException e1) {
|
||||
System.err.println("Error while downloading the updatelist!");
|
||||
e1.printStackTrace();
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public static List<NUSTitleInformation> parseUpdateListXML(InputStream bis) {
|
||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder builder;
|
||||
List<NUSTitleInformation> list = new ArrayList<>();
|
||||
try {
|
||||
builder = factory.newDocumentBuilder();
|
||||
Document document = builder.parse(bis);
|
||||
NodeList titles = document.getElementsByTagName("title");
|
||||
for(int i = 0;i<titles.getLength();i++){
|
||||
Node title = titles.item(i);
|
||||
if(title.getChildNodes().getLength() < 2) continue;
|
||||
String titleID = title.getChildNodes().item(0).getTextContent();
|
||||
String version = title.getChildNodes().item(1).getTextContent();
|
||||
NUSTitleInformation nusTitle = new NUSTitleInformation();
|
||||
nusTitle.setTitleID(Util.StringToLong(titleID));
|
||||
nusTitle.addVersion(version);
|
||||
list.add(nusTitle);
|
||||
}
|
||||
|
||||
} catch (ParserConfigurationException | SAXException | IOException e) {
|
||||
Logger.log("Error while parsing the updatelist");
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public static int readVersionNumber(InputStream bis) {
|
||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder builder;
|
||||
try {
|
||||
builder = factory.newDocumentBuilder();
|
||||
Document document = builder.parse(bis);
|
||||
return Integer.parseInt(document.getElementsByTagName("version").item(0).getTextContent());
|
||||
} catch (ParserConfigurationException | SAXException | IOException e) {
|
||||
Logger.log("Error while parsing the meta files");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@SuppressWarnings("resource")
|
||||
private static List<NUSTitleInformation> readUpdateCSV() {
|
||||
if(Settings.updateCSVPath == null) return null;
|
||||
BufferedReader in = null;
|
||||
List<NUSTitleInformation> list = new ArrayList<>();
|
||||
try {
|
||||
in = new BufferedReader(new InputStreamReader(new FileInputStream(new File(Settings.updateCSVPath)), "UTF-8"));
|
||||
String line;
|
||||
while((line = in.readLine()) != null){
|
||||
String[] infos = line.split(";");
|
||||
if(infos.length != 8) {
|
||||
Logger.messageBox("Updatelist is broken! A new updatelist will be created.");
|
||||
Logger.log("Updatelist is broken! A new updatelist will be created.");
|
||||
return list;
|
||||
}
|
||||
long titleID = Util.StringToLong(infos[0].replace("-", ""));
|
||||
int region = Integer.parseInt(infos[1]);
|
||||
String content_platform = infos[2];
|
||||
String company_code = infos[3];
|
||||
String product_code = infos[4];
|
||||
String ID6 = infos[5];
|
||||
String longnameEN = infos[6];
|
||||
String[] versions = infos[7].split(",");
|
||||
NUSTitleInformation info = new NUSTitleInformation(titleID, longnameEN, ID6, product_code, content_platform, company_code, region,versions);
|
||||
|
||||
list.add(info);
|
||||
}
|
||||
in.close();
|
||||
} catch (IOException | NumberFormatException e) {
|
||||
try {
|
||||
if(in != null)in.close();
|
||||
} catch (IOException e1) {
|
||||
}
|
||||
Logger.messageBox("Updatelist is broken or missing. A new updatelist will be created.");
|
||||
Logger.log("Updatelist is broken! A new updatelist will be created.");
|
||||
return new ArrayList<>();
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
@ -4,6 +4,7 @@ import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.math.BigInteger;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Arrays;
|
||||
@ -35,6 +36,9 @@ public class Util {
|
||||
public static int getIntFromBytes(byte[] input,int offset){
|
||||
return ByteBuffer.wrap(Arrays.copyOfRange(input,offset, offset+4)).getInt();
|
||||
}
|
||||
public static long getLongFromBytes(byte[] input,int offset){
|
||||
return ByteBuffer.wrap(Arrays.copyOfRange(input,offset, offset+8)).getLong();
|
||||
}
|
||||
public static long getIntAsLongFromBytes(byte[] input,int offset){
|
||||
long result = 0 ;
|
||||
if((int)input[offset]+128 > 0 && (int)input[offset]+128 < 128){
|
||||
@ -64,6 +68,21 @@ public class Util {
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean deleteFolder(File element) {
|
||||
if (element.isDirectory()) {
|
||||
for (File sub : element.listFiles()) {
|
||||
if(sub.isFile()){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (File sub : element.listFiles()) {
|
||||
if(!deleteFolder(sub)) return false;
|
||||
}
|
||||
}
|
||||
element.delete();
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void createSubfolder(String folder){
|
||||
|
||||
String [] path = folder.split("/");
|
||||
@ -137,4 +156,40 @@ public class Util {
|
||||
byte [] ticket = Downloader.getInstance().downloadTicketToByteArray(0x000500101000400AL); //Downloading cetk from OSv10
|
||||
return Arrays.copyOfRange(ticket, 0x350, 0x350+0x300);
|
||||
}
|
||||
|
||||
public static int getChunkFromStream(InputStream inputStream,byte[] output, ByteArrayBuffer overflowbuffer,int BLOCKSIZE) throws IOException {
|
||||
int bytesRead = -1;
|
||||
int inBlockBuffer = 0;
|
||||
do{
|
||||
bytesRead = inputStream.read(overflowbuffer.buffer,overflowbuffer.getLengthOfDataInBuffer(),overflowbuffer.getSpaceLeft());
|
||||
if(bytesRead <= 0) break;
|
||||
|
||||
overflowbuffer.addLengthOfDataInBuffer(bytesRead);
|
||||
|
||||
if(inBlockBuffer + overflowbuffer.getLengthOfDataInBuffer() > BLOCKSIZE){
|
||||
int tooMuch = (inBlockBuffer + bytesRead) - BLOCKSIZE;
|
||||
int toRead = BLOCKSIZE - inBlockBuffer;
|
||||
|
||||
System.arraycopy(overflowbuffer.buffer, 0, output, inBlockBuffer, toRead);
|
||||
inBlockBuffer += toRead;
|
||||
|
||||
System.arraycopy(overflowbuffer.buffer, toRead, overflowbuffer.buffer, 0, tooMuch);
|
||||
overflowbuffer.setLengthOfDataInBuffer(tooMuch);
|
||||
}else{
|
||||
System.arraycopy(overflowbuffer.buffer, 0, output, inBlockBuffer, overflowbuffer.getLengthOfDataInBuffer());
|
||||
inBlockBuffer +=overflowbuffer.getLengthOfDataInBuffer();
|
||||
overflowbuffer.resetLengthOfDataInBuffer();
|
||||
}
|
||||
}while(inBlockBuffer != BLOCKSIZE);
|
||||
return inBlockBuffer;
|
||||
}
|
||||
|
||||
public static long align(long input, int alignment){
|
||||
long newSize = (input/alignment);
|
||||
if(newSize * alignment != input){
|
||||
newSize++;
|
||||
}
|
||||
newSize = newSize * alignment;
|
||||
return newSize;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user