[C#] Write Hex to Binary File & Compare binary & hex

07/20/2014 18:10 Epanias#1
For those who like to make a binary hack (write hexadecimal to a specified adress in a binary file) and use a checkbox - checker if the hack has already been enabled or not, here are two usefull functions:

This code snippets require the IO namespace.

Code:
using System.IO;
To use this functions, you'll need 3 other ones that were not written by me, but unfortunatelly I couldn't find the original author of them again, sorry.

Code:
public static byte[] ConvertToByteArray(string value)
        {
            byte[] bytes = null;
            if (String.IsNullOrEmpty(value))
                bytes = Empty;
            else
            {
                int string_length = value.Length;
                int character_index = (value.StartsWith("0x", StringComparison.Ordinal)) ? 2 : 0; // Does the string define leading HEX indicator '0x'. Adjust starting index accordingly.               
                int number_of_characters = string_length - character_index;

                bool add_leading_zero = false;
                if (0 != (number_of_characters % 2))
                {
                    add_leading_zero = true;

                    number_of_characters += 1;  // Leading '0' has been striped from the string presentation.
                }

                bytes = new byte[number_of_characters / 2]; // Initialize our byte array to hold the converted string.

                int write_index = 0;
                if (add_leading_zero)
                {
                    bytes[write_index++] = FromCharacterToByte(value[character_index], character_index);
                    character_index += 1;
                }

                for (int read_index = character_index; read_index < value.Length; read_index += 2)
                {
                    byte upper = FromCharacterToByte(value[read_index], read_index, 4);
                    byte lower = FromCharacterToByte(value[read_index + 1], read_index + 1);

                    bytes[write_index++] = (byte)(upper | lower);
                }
            }

            return bytes;
        }

        private static byte FromCharacterToByte(char character, int index, int shift = 0)
        {
            byte value = (byte)character;
            if (((0x40 < value) && (0x47 > value)) || ((0x60 < value) && (0x67 > value)))
            {
                if (0x40 == (0x40 & value))
                {
                    if (0x20 == (0x20 & value))
                        value = (byte)(((value + 0xA) - 0x61) << shift);
                    else
                        value = (byte)(((value + 0xA) - 0x41) << shift);
                }
            }
            else if ((0x29 < value) && (0x40 > value))
                value = (byte)((value - 0x30) << shift);
            else
                throw new InvalidOperationException(String.Format("Character '{0}' at index '{1}' is not valid alphanumeric character.", character, index));

            return value;
        }

        private static readonly byte[] Empty = new byte[0];
To write from a hexadecimal string to a binary file, you can use this function:

Code:
        private void WriteToFile(string Filename, string Text, int Position)
        {
            byte[] ContentToWrite;
            ContentToWrite = ConvertToByteArray(Text);

            BinaryWriter BinW = new BinaryWriter(File.OpenWrite(Filename));
            BinW.BaseStream.Position = Position;
            BinW.Write(ContentToWrite);
            BinW.Close();
        }
To check if the hack is already enabled, you can use this function (Text=hex):

Code:
        private bool ReadNCompare(string Filename, string Text, int Position)
        {
            byte[] Readtext = { };
            string Content = "";
            byte[] Converted = ConvertToByteArray(Text);
            string Trimmed = "";
            int Comparation = 0;

            BinaryReader binRead = new BinaryReader(File.OpenRead(Filename));

            binRead.BaseStream.Position = Position;
            Readtext = binRead.ReadBytes(Converted.Length);
            binRead.Close();

            Content = BitConverter.ToString(Readtext);
            Trimmed = Content.Replace("-", "");
            Comparation = Trimmed.IndexOf(Text);

            if (Comparation != -1)
                return true;
            else
                return false;
        }
I hope this helps you. I haven't seen codesnippets for that here yet, if there is already a thread for it, than I apologize.

Greetings
Epanias