Pliki dll

0

Witam Forumowiczów.
Mam pewnien problem .. Problem polega na tym ze mam za pomoca textBox'ow podmienic w pliku dll wybrane ciagi ktore sa zapisane w systemie szesnastkowym .
Czy ktos mógłby podpowiedziec jak to zrobic ?
Napisze jeszcze ze mam dwa textboxy . W Jeden wpisuje wartosc ktora obecnie sie znajduje a w drugim natomiast wpisuje wartosc na jaka ma go edytowac .

0
  1. załadowanie dllki jako stream bajtów
  2. konwersja stringów z tekstboxów na ciąg bajtów
  3. replace załadowanej dll z pierwszego stringa na drugi
  4. zapis zmienionego streama do nowego pliku .dll
    ?
0

Zależy czy chcesz dynamicznie czy statycznie to zrobić.

Jak dll będzie zawsze ta sama, to możesz w hexedytorze wyszukać string, zapamiętaj offset pierwszego znaku stringa i 00 zera kończącego stringa, czyli długość, bo wielkość jak zmienisz, to może pozmieniać położenia innych tekstów.

Teraz otwierasz tą dll jako binary i ustawiasz na offsecie tego stringa co pobrałeś lub wyszukaj sobie ten offset tekstu dopiero dynamicznie.

Potem możesz tam wpisać co chcesz, ale ograniczone do wielkości tego bloku, który tam już był czyli od offsetu do zera kończącego, po tym zerze mogą być inne dane.

0

a może da się do tego użyć Mono.cecil ?

0

Encoding enc = Encoding.GetEncoding("us-ascii",
new EncoderExceptionFallback(),
new DecoderExceptionFallback());
nazwaPliku = textEditNazwaPliku.Text;
sciezkaDoPliku = textEditSciezka.Text;
adresHex = textEditAdresHEX.Text;
zmianaZ = textEditZmianaZ.Text;
zmianaNa = textEditZmianaNa.Text;
wpis = memoEditWpisy.Text;

            BinaryWriter writer = new BinaryWriter(File.Open(sciezkaDoPliku, FileMode.Open));
            
            
            long adresH = long.Parse(adresHex);
            byte zmianaByte = Convert.ToByte(zmianaNa);

            //byte[] zmianaNaByte = Encoding.ASCII.GetBytes(zmianaNa);
            byte[] zmianaNaByte = new Byte[zmianaByte];
            
            try
            {
                writer.BaseStream.Position = adresH;
                writer.Write(zmianaNaByte);
                
            }
            catch (Exception de)
            {
                DXBox.pokazBlad("Bład podczas dodawanie wpisu do tabeli plików", de);
            }
            finally
            {
                writer.Close();
            }

taki kod napisalem . Nie moge wpisywac wartosci wiekszych do textEditZmianaNa niz 3 cyfrowa a chcialbym na 4 cyfrowa np 3090.
po drugie adres hex moge wpisywac tylko liczbowy a chcialbym np wpisac FBD19 ... Mogłby ktos pomoc ?

0

Wtf, przecież w stringu się nie trzyma liczb...

0

To to ja wiem , duzo pomogles -.- ...

0

To trzeba z crackować funkcję, która to wypisuje bo tekst jest w sekcji read-only.

Musisz hook na funkcję zrobić, która potencjalnie używa tej zmiennej i jak ustawiasz hook na miejscu instrukcji pobierania z podanego adresu stringa,
allokujesz gdzieś w binarce nowy string i adres tego stringa względem początku binarki wpisujesz w miejsce tej funkcji obliczającej adres do stringa.

Może to być mov, albo lea nie wiadomo, jest kilka możliwych sposobów osiągnięcia takiego czegoś, to zwykle zależy od kompilatora, który to budował.

A tego hexa możesz pobrać, zamienić na inta, a potem tą liczbę na string i zapisać.

0

mozesz pokazac na przykladzie mojego kodu ? bo nie za bardzo kminie co piszesz ?

0

Masz kod tej dll?

Możesz jeszcze zrobić coś takiego, że jak masz zmienną i ona przechowuje stringa, akurat na obiektowym będzie to obiekt.
To możesz zmienną obiektu, która przechowuje adres zmienić, ale to będziesz musiał w konstruktorze zmienić żeby za każdym odpaleniem budowało stringa.
A tego stringa gdzieś dopisz na końcu pliku i daj adres (wielkość całego pliku) - (długość stringa).

0

Zawartosc dll otwieram w programie hexeditor . Pokaz na przykladzie mojego kodu jak mozesz ?

0

To zależy jak jest ta dll zbudowana, musisz do ida wrzucić i to ogarniesz, ale podstawy assemblera musisz znać.

0

Ja to pisze w c# ....

0

Albo taki myk możesz zrobić, że zakładając, że każda funkcja wrzuca sobie na stos ten adres stringa.

zamienić push offset, na call funkcja_twoja

gdzie funkcja twoja
Będzie zdejmować adres powrotu, wrzuci twój offset twojego stringa i skoczy pod zdjęty adres.

lub

zamienisz push offset na push twój_offset.

i musisz tak cały plik przeskanować dll i się modlić żeby takiej drugiej kombinacji bajtów nie było.

0

Człowieku czy widzisz co ja pisze ?
Zamiast napisac jak najprosciej potrafisz to piszesz cos czego nie rozumiem . Pokazac na przykladzie jakims to nie

0

To zrób takie coś, a nóż się uda.

Masz ten offset, na którym znajduje się string w binarce.
Zapisz go do zmiennej 4 bajtowej i przeszukaj tą zmienną 4 bajtową np. intem cały plik dll i jak znajdzie miejsca występowania tej liczby, to wpisz w te miejsce offset końca pliku i zapisz ten plik dopisując na koniec twój string z zerem.

Może się udać.

0

juz zrobilem po swojemu :d

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