Pliki DLL odczyt i nadpisanie wartosci

0

Siemka , mam mały problem . Dzialam sobie na plikach dll . Otwieram je w programie takim jak hexeditor ale jest maly problem . Mianowiscie mam zamieniac wartosci np:
z 3402 na 3090 nie podmienia tak jak powinno i nie wiem w czym jest problem .
Czy mogly ktos pokazac na przykladzie mojego kodu jak to zrobic i opisac abym zrozumial w miare . Mecze sie z tym od paru dni robiac na miliony sposob chociaz i tak nic to nie daje .
Sa dwa zalaczniki tzn zdjecia ukazujace moj problem ;d
Przykladowo mam 66 8B 70 FE 83 E8 02 66 3B 34 02 75 11 49 79 F0 . Chce zamienic 3402 na 3090 i oto wynik :66 8B 70 FE 83 E8 02 66 3B 33 30 39 30 49 79 F0

Oto moj kod:

String nazwaPliku = textEditNazwaPliku.Text;
String sciezkaDoPliku = textEditSciezka.Text;
String adresHex = textEditAdresHex.Text;
String zmianaZ = textEditZmienZ.Text;
String zmianaNa = textEditZmienNa.Text;

        byte[] zmianaNaByte = Encoding.ASCII.GetBytes(zmianaNa);
        BinaryWriter writer = new BinaryWriter(File.Open(sciezkaDoPliku, FileMode.Open));
        try
        {
            int i = Convert.ToInt32(adresHex, 16);
            writer.BaseStream.Position = i;
            writer.Write(zmianaNaByte);
        }
       catch (Exception )
        {
            MessageBox.Show("Nie mozna zamienic wartosci", "", MessageBoxButtons.OK, MessageBoxIcon.Error );
        }
        finally
        {
            writer.Close();
            
        }
0

Po co zakładasz nowy wątek? W tamtym napisałem Ci kod, który działa wystarczyło go odpowiednio wykorzystać,ale skoro nie umiałeś to w takim razie piszesz że nie wiesz co z tym zrobić, że nie działa i wtedy myśli się dalej. Tu jest to samo co tam opakowane w metodę ConvertStringToByteArray, i dodatkowo jak z tego skorzystać

byte[] ConvertStringToByteArray(string zmiana)
        {
            if (zmiana.Contains("0x"))
            {
                zmiana = new String(zmiana.Skip(2).ToArray());
            }

            int bytesCount = zmiana.Length / 2; //każdemu bajtowi odpowiadają dwie cyfry stąd też dzielenie przez dwa żeby policzyć ile masz bajtów
            int zmianaH = Convert.ToInt32(zmiana, 16);

            int sizeOfType = System.Runtime.InteropServices.Marshal.SizeOf(zmianaH);//określenie ile bajtów zajmuje typ, mógłbyś mieć np. long itd., jest to potrzebne później do otrzymania końcowego wyniku, metoda GetBytes zwraca tablicę wielkości odpowiadającej wielkości przekazanego typu, jeżeli masz long to zwróci tablicę z 8 elementami, jeżeli int32 to z 4 itd.

            byte[] intBytes = BitConverter.GetBytes(zmianaH);
            if (BitConverter.IsLittleEndian)
                Array.Reverse(intBytes);
            byte[] result = intBytes.Skip(sizeOfType - bytesCount).ToArray();

            return result;
        }

        string sciezkaDoPliku = "binary.tmp";
        string zmianaNa = "0x3090";
        string adresHex = "0x09";

        private void button3_Click(object sender, EventArgs e)
        {
            byte[] zmianaNaByte = ConvertStringToByteArray(zmianaNa);
            using (BinaryWriter writer = new BinaryWriter(File.Open(sciezkaDoPliku, FileMode.Open)))
            {
                int index = Convert.ToInt32(adresHex, 16);
                writer.BaseStream.Position = index;
                writer.Write(zmianaNaByte);
            }            
        }

A tu jest wynik działania:

66 8B 70 FE 83 E8 02 66 3B 34 02 75 11 49 79 F0
66 8B 70 FE 83 E8 02 66 3B 30 90 75 11 49 79 F0

0

DZieki wielkie :D
juz wiem o co chodzi :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1