Posted April 11, 20205 yr Hi all. i am new to the patching. i want to make a patch in vb.net , which will replace multiple bytes of a program. like when i load the original & patched file in DUP , its comparision : there are many patterns how to make its patch in vb.net
April 11, 20205 yr I found a 2011 project made on VB.NET here is an simple example of how to patch data '>>>>>>>>>>>>patch OFFSETS Dim PatchOffsets As List(Of GenericArray) = //here create a new list of patch offsets //AddFilePatch.Item(i).Offsets Dim destStream As New FileStream(filePatch, FileMode.Open) ' destStream.Lock(0, destStream.Length) For k = 0 To PatchOffsets.Count - 1 destStream.Position = PatchOffsets.Item(k).var1 destStream.WriteByte("&H" & PatchOffsets.Item(k).var2) Next If PatchOffsets.Count > 0 Then txtInfo.Text = txtInfo.Text & " " & PatchOffsets.Count & " byte(s) patched!" & vbCrLf End If '>>>>>>>>>>>>patch OFFSETS the GenericArray class is like : Public Class GenericArray Dim _var1 As String //file position Dim _var2 As String //new value to compare two files and find the diffs C# example : byte[] flOrigin = System.IO.File.ReadAllBytes(textBox1.Text); byte[] flPatched = System.IO.File.ReadAllBytes(textBox2.Text); int startOFFSET = 0; int endOFFSET = flOrigin.Length; for (i = startOFFSET; i < endOFFSET; i++) { if (flOrigin[i] != flPatched[i]) { lstvItem = new ListViewItem(); lstvItem.Text = flOrigin[i].ToString("X2"); lstvItem.SubItems.Add(flPatched[i].ToString("X2")); lstvItem.SubItems.Add(i.ToString()); lstv.Items.Add(lstvItem); } } dont get confused : -an application with two textboxes contain the files -a button than find the diffs (using the 2nd example) -a button apply the changes (using the 1st example) Edited April 11, 20205 yr by whoknows
April 11, 20205 yr thank you for the code. but i am unable to use these codes , any tutorial how to use it
April 22, 20205 yr On 4/12/2020 at 2:48 AM, forum said: thank you for the code. but i am unable to use these codes , any tutorial how to use it yeah mee too can't able to use the code. it gives me lot of errors But hopefully he can have a time to share to us the correct code and project file also
April 23, 20205 yr On 4/11/2020 at 10:07 PM, whoknows said: I found a 2011 project made on VB.NET here is an simple example of how to patch data '>>>>>>>>>>>>patch OFFSETS Dim PatchOffsets As List(Of GenericArray) = //here create a new list of patch offsets //AddFilePatch.Item(i).Offsets Dim destStream As New FileStream(filePatch, FileMode.Open) ' destStream.Lock(0, destStream.Length) For k = 0 To PatchOffsets.Count - 1 destStream.Position = PatchOffsets.Item(k).var1 destStream.WriteByte("&H" & PatchOffsets.Item(k).var2) Next If PatchOffsets.Count > 0 Then txtInfo.Text = txtInfo.Text & " " & PatchOffsets.Count & " byte(s) patched!" & vbCrLf End If '>>>>>>>>>>>>patch OFFSETS the GenericArray class is like : Public Class GenericArray Dim _var1 As String //file position Dim _var2 As String //new value to compare two files and find the diffs C# example : byte[] flOrigin = System.IO.File.ReadAllBytes(textBox1.Text); byte[] flPatched = System.IO.File.ReadAllBytes(textBox2.Text); int startOFFSET = 0; int endOFFSET = flOrigin.Length; for (i = startOFFSET; i < endOFFSET; i++) { if (flOrigin[i] != flPatched[i]) { lstvItem = new ListViewItem(); lstvItem.Text = flOrigin[i].ToString("X2"); lstvItem.SubItems.Add(flPatched[i].ToString("X2")); lstvItem.SubItems.Add(i.ToString()); lstv.Items.Add(lstvItem); } } dont get confused : -an application with two textboxes contain the files -a button than find the diffs (using the 2nd example) -a button apply the changes (using the 1st example) This help me a lot to complete my personal tool/collection I was able to recode C# code to vb.net Here's the screenshot of final build This will help me a lot for my learning about patching using find and replace hex
April 23, 20205 yr nice shit mate! -- now, create 'the patcher app' this will read the embedded resource from itself (ex ikriv.com/blog/?p=1530), call it offsets.txt or whatever, this function to read the resource : public static string ReadASCIIfromResources(string filename) { byte[] Buffer; using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(filename)) { Buffer = new byte[stream.Length]; stream.Read(Buffer, 0, Buffer.Length); } return Encoding.ASCII.GetString(Buffer); } when user hit the PATCH button, read the offsets.txt, load the target file and patch it, will be good to store the original file SHA1 to make a checksum comparison (aka is the equal target and not a diff version) -- once the 'the patcher app' working as you expected, remove the offsets.txt resource &compile it. add the 'the patcher app' exe, to your app u posted^ as embedded resource. create a new button 'create patch', this will read the 'the patcher app' exe from resources byte[] byteTMP; using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("URnamespace.P.exe")) { byteTMP = new byte[stream.Length]; stream.Read(byteTMP, 0, byteTMP.Length); } use Mono.Cecil to add the embedded resource w/ the needed offsets AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(mStream); EmbeddedResource erTemp = null; //PATCHDATA string tmp = ";" + txtAppName.Text + "|" + txtAuthor.Text + "|" + txtURL.Text + "|" + txtDate.Text + "\r\n"; for (int i = 0; i < General.Patch.Count; i++) { tmp += (General.Patch[i]) + "\r\n"; } erTemp = new EmbeddedResource("URnamespace.offsets.txt", ManifestResourceAttributes.Public, Encoding.ASCII.GetBytes(tmp)); assembly.MainModule.Resources.Add(erTemp); save the assembly with Mono.Cecil assembly.Write(stream); this code parts taken from different ancient projects, just to give you an idea. ofc u can use dnlib to do the resources work, the result will be the same. Edited April 23, 20205 yr by whoknows
April 23, 20205 yr 1 hour ago, whoknows said: nice shit mate! -- now, create 'the patcher app' this will read the embedded resource from itself (ex ikriv.com/blog/?p=1530), call it offsets.txt or whatever, this function to read the resource : public static string ReadASCIIfromResources(string filename) { byte[] Buffer; using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(filename)) { Buffer = new byte[stream.Length]; stream.Read(Buffer, 0, Buffer.Length); } return Encoding.ASCII.GetString(Buffer); } when user hit the PATCH button, read the offsets.txt, load the target file and patch it, will be good to store the original file SHA1 to make a checksum comparison (aka is the equal target and not a diff version) -- once the 'the patcher app' working as you expected, remove the offsets.txt resource &compile it. add the 'the patcher app' exe, to your app u posted^ as embedded resource. create a new button 'create patch', this will read the 'the patcher app' exe from resources byte[] byteTMP; using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("URnamespace.P.exe")) { byteTMP = new byte[stream.Length]; stream.Read(byteTMP, 0, byteTMP.Length); } use Mono.Cecil to add the embedded resource w/ the needed offsets AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(mStream); EmbeddedResource erTemp = null; //PATCHDATA string tmp = ";" + txtAppName.Text + "|" + txtAuthor.Text + "|" + txtURL.Text + "|" + txtDate.Text + "\r\n"; for (int i = 0; i < General.Patch.Count; i++) { tmp += (General.Patch[i]) + "\r\n"; } erTemp = new EmbeddedResource("URnamespace.offsets.txt", ManifestResourceAttributes.Public, Encoding.ASCII.GetBytes(tmp)); assembly.MainModule.Resources.Add(erTemp); save the assembly with Mono.Cecil assembly.Write(stream); this code parts taken from different ancient projects, just to give you an idea. ofc u can use dnlib to do the resources work, the result will be the same. Wow I'm gonna explore this code too This is big help for me as a beginner
Create an account or sign in to comment