Guest forum Posted April 11, 2020 Posted April 11, 2020 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
whoknows Posted April 11, 2020 Posted April 11, 2020 (edited) 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, 2020 by whoknows 1
Guest forum Posted April 11, 2020 Posted April 11, 2020 thank you for the code. but i am unable to use these codes , any tutorial how to use it
zackmark29 Posted April 22, 2020 Posted April 22, 2020 I've been looking for this too. I'm excited to try it
zackmark29 Posted April 22, 2020 Posted April 22, 2020 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 1
zackmark29 Posted April 23, 2020 Posted April 23, 2020 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 2
whoknows Posted April 23, 2020 Posted April 23, 2020 (edited) 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, 2020 by whoknows
zackmark29 Posted April 23, 2020 Posted April 23, 2020 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
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now