diff --git a/NUS Downloader/Form1.Designer.cs b/NUS Downloader/Form1.Designer.cs index 787afe0..defd3f7 100644 --- a/NUS Downloader/Form1.Designer.cs +++ b/NUS Downloader/Form1.Designer.cs @@ -91,7 +91,6 @@ this.button5 = new System.Windows.Forms.Button(); this.button6 = new System.Windows.Forms.Button(); this.button7 = new System.Windows.Forms.Button(); - this.label12 = new System.Windows.Forms.Label(); this.shamelessvariablelabel = new System.Windows.Forms.Label(); this.button3 = new System.Windows.Forms.Button(); this.contentsEdit = new System.Windows.Forms.ListBox(); @@ -695,16 +694,6 @@ this.button7.UseVisualStyleBackColor = true; this.button7.Click += new System.EventHandler(this.button7_Click); // - // label12 - // - this.label12.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.label12.Location = new System.Drawing.Point(239, 465); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(23, 15); - this.label12.TabIndex = 29; - this.label12.Text = resources.GetString("label12.Text"); - this.label12.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // // shamelessvariablelabel // this.shamelessvariablelabel.AutoSize = true; @@ -896,7 +885,6 @@ this.Controls.Add(this.button17); this.Controls.Add(this.button3); this.Controls.Add(this.shamelessvariablelabel); - this.Controls.Add(this.label12); this.Controls.Add(this.button1); this.Controls.Add(this.ticketgpbox); this.Controls.Add(this.button5); @@ -1007,7 +995,6 @@ private System.Windows.Forms.TextBox timelimitsecs; private System.Windows.Forms.Label label11; private System.Windows.Forms.Button button7; - private System.Windows.Forms.Label label12; private System.Windows.Forms.Label shamelessvariablelabel; private System.Windows.Forms.Button button3; private System.Windows.Forms.ListBox contentsEdit; diff --git a/NUS Downloader/Form1.cs b/NUS Downloader/Form1.cs index d4b0808..140323e 100644 --- a/NUS Downloader/Form1.cs +++ b/NUS Downloader/Form1.cs @@ -2287,7 +2287,7 @@ namespace NUS_Downloader private void button8_Click(object sender, EventArgs e) { // Move selected content upwards (down an index)... - if (contentsEdit.SelectedIndex < 0) + if (contentsEdit.SelectedIndex <= 0) return; int sel_idx = contentsEdit.SelectedIndex; @@ -2465,7 +2465,7 @@ namespace NUS_Downloader contents[c].Type[0] = 0x00; // Pad to be 16 byte aligned - contentbytes = AlignByteArray(contentbytes, 16); + contentbytes = PadToMultipleOf(contentbytes, 16); // Encrypt with correct index IV/titlekey byte[] ivindex = new byte[16]; @@ -2526,15 +2526,16 @@ namespace NUS_Downloader } byte[] decContent = Decrypt(contentbytes); - Array.Resize(ref decContent, int.Parse(tmdsizes[c], System.Globalization.NumberStyles.HexNumber)); + Array.Resize(ref decContent, int.Parse(tmdsizes[thiscontentidx], System.Globalization.NumberStyles.HexNumber)); if ((Convert.ToBase64String(ComputeSHA(decContent))) == Convert.ToBase64String(hash)) { - WriteStatus(" - Hash Check: Content is Unchanged..."); + WriteStatus(" - Hash Check: Content is Unchanged..."); contents[c].SHAHash = hash; + WriteStatus("HASH: " + DisplayBytes(hash, "")); } else { - WriteStatus(" - Hash Check: Content changed (probably REALLY BAD)..."); + WriteStatus(" - Hash Check: Content changed (probably REALLY BAD)..."); contents[c].SHAHash = ComputeSHA(decContent); } @@ -2549,7 +2550,8 @@ namespace NUS_Downloader ivindex[1] = (byte)c; // Pad back to 0x16 alignment - AlignByteArray(decContent, 0x16); + //AlignByteArray(decContent, 0x16 + decContent = PadToMultipleOf(decContent, 16); initCrypt(newiv, dtitlekey); @@ -2576,10 +2578,10 @@ namespace NUS_Downloader contents[c].ContentID[3] = byte.Parse(filename.Substring(6, 2), System.Globalization.NumberStyles.HexNumber); contents[c].Index = new byte[2]; - contents[c].Index = InttoByteArray(c, 2); // TODOTODOTODO + contents[c].Index = NewIntegertoByteArray(c, 2); contents[c].Type = new byte[2]; - contents[c].Type[0] = 0x01; + contents[c].Type[1] = 0x01; if (contentsEdit.Items[c].ToString().Contains(" [S]")) contents[c].Type[0] = 0x80; else @@ -2587,12 +2589,13 @@ namespace NUS_Downloader contents[c].Size = new byte[8]; // TODOCHECK THIS OVER - contents[c].Size = InttoByteArray(contentbytes.Length, 8); + contents[c].Size = NewIntegertoByteArray(contentbytes.Length, 8); } + } // Write all this stuff to the TMD... byte[] contentSection = new byte[contents.Length * 36]; - + //TODO: At some points we don't have a hash... see above? for (int h = 0; h < contents.Length; h++) { for (int i = 0; i < contents[h].ContentID.Length; i++) @@ -2612,12 +2615,12 @@ namespace NUS_Downloader for (int l = 0; l < contents[h].Size.Length; l++) { - contentSection[(h * 36) + (contents[h].ContentID.Length + contents[h].Index.Length + contents[h].Type.Length + l)] = contents[h].Type[l]; + contentSection[(h * 36) + (contents[h].ContentID.Length + contents[h].Index.Length + contents[h].Type.Length + l)] = contents[h].Size[l]; } for (int m = 0; m < contents[h].SHAHash.Length; m++) { - contentSection[(h * 36) + (contents[h].ContentID.Length + contents[h].Index.Length + contents[h].Type.Length + contents[h].Size.Length + m)] = contents[h].Type[m]; + contentSection[(h * 36) + (contents[h].ContentID.Length + contents[h].Index.Length + contents[h].Type.Length + contents[h].Size.Length + m)] = contents[h].SHAHash[m]; } } @@ -2633,30 +2636,46 @@ namespace NUS_Downloader FileStream testtmd = new FileStream(fileinfo[0] + fileinfo[1], FileMode.Open); testtmd.Write(tmd, 0, tmd.Length); testtmd.Close(); - } + } - // Pad Byte[] to specific alignment... + /* Pad Byte[] to specific alignment... private byte[] AlignByteArray(byte[] content, int alignto) { long thelength = content.Length - 1; - long remainder = 1; + long remainder = thelength % alignto; while (remainder != 0) { thelength += 1; remainder = thelength % alignto; } - + // DEBUG: + WriteStatus("Aligning by: " + alignto + " ... New Length: " + thelength); + WriteStatus(" Dif: " + (thelength - content.Length)); Array.Resize(ref content, (int)thelength); return content; + } */ + + private byte[] PadToMultipleOf(byte[] src, int pad) + { + int len = (src.Length + pad - 1) / pad * pad; + + // DEBUG: + WriteStatus("New Length: " + len); + WriteStatus("Dif: " + (len - src.Length)); + + Array.Resize(ref src, len); + return src; } + private void button17_Click(object sender, EventArgs e) { // Move groupbox to display title modder... contentModBox.Location = new Point(278, 12); contentModBox.Visible = true; + contentModBox.BringToFront(); } private void button13_Click(object sender, EventArgs e) @@ -2680,5 +2699,30 @@ namespace NUS_Downloader { return (Environment.OSVersion.VersionString.Contains("6.1") == true); } + + private byte[] NewIntegertoByteArray(int theInt, int arrayLen) + { + byte[] resultArray = new byte[arrayLen]; + + for(int i = arrayLen - 1 ; i >= 0; i--) + { + resultArray[i] = (byte)((theInt >> (8 * i)) & 0xFF); + + } + Array.Reverse(resultArray); + + // Fix duplication, rewrite extra to 0x00; + if (arrayLen > 4) + { + for (int i = 0; i < (arrayLen - 4); i++) + { + resultArray[i] = 0x00; + } + } + + // DEBUG + WriteStatus("byte[] result: " + DisplayBytes(resultArray, " ")); + return resultArray; + } } } diff --git a/NUS Downloader/Form1.resx b/NUS Downloader/Form1.resx index d63ad55..6ef1cbc 100644 --- a/NUS Downloader/Form1.resx +++ b/NUS Downloader/Form1.resx @@ -123,14 +123,6 @@ 159, 17 - - Notice: - -* Fake signed content requires an IOS with the fake signing bug to install/use. -* Be careful with Ticket values, they are best left alone. -* Enter values in decimal, not hexadecimal. Exception: Title ID. -* Always have a brick restoration method in place (BootMii boot2). - @@ -261,7 +253,7 @@ XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+ tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/ - 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALEAAACxABrSO9dQAAAntJREFUWEftl6GOgkEM + 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDwAACw8BkvkDpQAAAntJREFUWEftl6GOgkEM hHlwDAKHw+EwKCQWgcOikQjO8Ax795FMMtf0390EfsKRExsC2+3OtJ1umZRSJp+4PpIUiXorYrfb7QdT XkG1vexMF7Gv67Vo1cr2crmU8/k8CI6zAJQvgeXMarUqy+Wy7Pf7X+d973A4VH07tiYxHHOh1vF4TJ3z +2KxKPP5vGy329QG4iKAPwHdbDZlOp2W2Wx29+HBWa/Xg3u1IDeJEV1AcDErAw1g2QCOlQXgdDrd90SC @@ -322,7 +314,7 @@ XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+ tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/ - 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALEAAACxABrSO9dQAAAwJJREFUWEfdmNG1IUEQ + 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDwAACw8BkvkDpQAAAwJJREFUWEfdmNG1IUEQ hrEBIAIyQASIgI1giYCzASADIkAEiAARLBFgA1g874Ne3+ypuT013YN73Qf3Yc7M9HRX1V/1199NyhiT +orXlwRFoV4S2GazMcvl0hwOhysGN+NeCli/3zfFYvFajpRJp9PBnff5fB4D+DLA2u12AESuWq0WAdjp /oyAewlgVMoG1Ww2zeVyMeVyORxPpzJmtVqF4EJg+/3eYKDX6wX3wWAQPvOuL76Px2OzXq+9PHfxHz+T diff --git a/NUS Downloader/NUS Downloader.csproj b/NUS Downloader/NUS Downloader.csproj index da16609..23cf61e 100644 --- a/NUS Downloader/NUS Downloader.csproj +++ b/NUS Downloader/NUS Downloader.csproj @@ -63,15 +63,18 @@ Form + PreserveNewest Form1.cs + PreserveNewest Form1.cs Designer + PreserveNewest ResXFileCodeGenerator