Autor Wątek: Bezpieczenstwo kodu.  (Przeczytany 12772 razy)

Offline zarius

  • Użytkownik

# Sierpień 01, 2006, 00:16:21
Kiedys natknolem sie gdzies ze aplikacje napisane w .NETowym jezyku beda zapewne tak latwe do dekompilacji jak reszta interpetowanych (np Java) i nabralem pewnych obaw.

Po prostu wyobrazmy sobie nawet banalna gre online i mozliwosc dowolnego przegladania kodu klienta co daje potencjalnie o wiele wieksze szanse na znalezienie luk i pisanie exploitow/hackow etc.
Taka masa hackow by zniszczyla kompletnie projekt bo nikt nie chcial by grac w wiecznie nekana gre "haxorami"

Wiec moje pytanie brzmi jak duza jest skutecznosc tych dekompilatorow i czy kod ma jakies bezpieczenstwo, ew czy mozna w jakis sposob chronic exe'ki przed dekompilacja ?

Pozdrawiam

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kot

  • Użytkownik

# Sierpień 01, 2006, 00:33:25
Tak, już kiedyś o tym słyszałem, ale póki nie zacząłem żadnego aż tak ambitnego projektu nie przejmowałem się za bardzo. W sumie miło by było się dowiedzieć, jakby ktoś miał już jakieś doświadczenia z tym związane.
btw, zobacz, nawet microsoft na swojej stronie daje linki do takich programów: http://msdn.microsoft.com/vcsharp/programming/tools (scroll down do Decompilers) :P.

Offline zarius

  • Użytkownik

# Sierpień 01, 2006, 00:53:03
No to pieknie :-/ sciagnalem pierwszy lepszy dekompilator i odtworzyl kompletnie caly kod ze wszystimi nazwami klasami etc bez problemu (niektore metody tylko zamiast kodu maja // trial ale to wiadom pewnie czemu)...

Mam takie pytanie, jesli C# i cale .NET jest taki latwy do dekompilacji to chyba cos nie tak ze strony MS ze w ogole nie dba o bezpieczenstwo kodu O.o

Sa jakies sposoby czy lepiej zostawic ten jezyk bo teraz sie srogo rozczarowalem  :o

Offline Kot

  • Użytkownik

# Sierpień 01, 2006, 01:08:46
Tylko obfuscation.
1. http://www.yoda.arachsys.com/csharp/obfuscation.html
2. http://dotnet.sys-con.com/read/38805.htm
3 [art. sponsorowany]. http://www.codeproject.com/showcase/Dotfuscator.asp
4. Linki na podanej przeze mnie wcześniej http://msdn.microsoft.com/vcsharp/programming/tools w sekcji Obfuscators.

A kod C++ też możesz disasmem przelecieć :P.

Offline Kot

  • Użytkownik

# Sierpień 01, 2006, 02:29:22
Dokładnie, a i nawet idealistycznie zakładając, że będziemy posiadać całkowicie nie dekompilowalny kod - zawsze pozostanie analiza wychodzących/przychodzących pakietów i pies pogrzebany :).
Poza tym algorytmy nikogo z nas nie są żadnymi przełomowymi pracami, których sekretów należałoby za wszelką cenę strzec. Ogólnie polecam artykuł 1. z mojego poprzedniego postu.

Offline zarius

  • Użytkownik

# Sierpień 01, 2006, 03:10:25
Cytuj
A kod C++ też możesz disasmem przelecieć ;P.

i bez hardcorowej znajomosci assemblera gucio to da ;p

Cytuj
cala logike gry utrzymywac na serverze, nie ufac danym przesylanym przez klientow i nie wysylac klientom informacji, ktorych nie powinni znac. Jezyk w jakim napisany jest klient nie ma zadnego znaczenia.

Latwo powiedziec ;p Sama analiza tego jak klient rzadza czegos a potem jak przetwarza wyniki i ktore bity do czego sa wykorzystywane to tak jakby "dokumentacja" protkolu w postaci kodu klienta. Napisanie emulatora staje sie o niebo prostsze niz uzywanie Packet Snifferow i testowanie bajtow pakietu "recznie".

No ale sprawdzilem narazie 2 obfuscation'y i po godzine zabawy z ustawieniami moge stwierdzic ze da rade skutecznie odstarszyc. Wlasciwie to kod spagetthi ;) Bez komentarzy i z takimi nazwami to hardcore. Ponadto przy zmianie nazwe funkcji i zmiennych uzywa taki znakow poza zwyklym kodowaniem co w rezultacie daje pusta przestrzen zamiast nazwy ;p

Ok dzieki, mysle ze to sie sprawdzi tylko szkoda ze kazdy taki program kaze za siebie placic :/
« Ostatnia zmiana: Sierpień 01, 2006, 03:25:09 wysłana przez zarius »

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Sierpień 01, 2006, 08:19:26
Gdyby dekompilacja kodu C++ kogos odstraszala to nie byloby tylu aimbotow w CSie i maphackow w W3.

Gdyby CS i W3 były napisane w C#, to amatorów "hakerstwa" byłoby jeszcze więcej :).

Offline Kot

  • Użytkownik

# Sierpień 01, 2006, 12:19:15
Zawsze kluczowe algorytmy przetwarzania / szyfrowania można skompilować z C++ do dll'ki, którą potem będzie się linkować do C#.

Offline Lothar

  • Użytkownik

# Sierpień 01, 2006, 12:57:08
Zawsze kluczowe algorytmy przetwarzania / szyfrowania można skompilować z C++ do dll'ki, którą potem będzie się linkować do C#.

Raczej nie polecam linkować COMów do .NETa, mija się to bardzo z całą ideą platformy .NET. Poza tym jeżeli już ktoś pisze w C# to nie ma sensu pisania 70% programu w C++, już chyba lepiej całość napisać w C++.
Są "mieszacze" kodu, nie wiem czy dla 2.0 też, ale widziałem taki w działaniu dla 1.1. Po takim "zamieszaniu" trzeba nieźle kumać żeby się połapać o co chodziło autorowi programu.

maxest

  • Gość
# Sierpień 01, 2006, 14:45:59
z tego co mi wiadomo istnieja jakies "zaciemniacze" ktore potrafia pozmieniac nazwy zmiennych, klas itp. kodu zrodlowego na zupelnie przypadkowe a sam kod stanie sie potwornie niezrozumialy

Offline macabre13

  • Użytkownik

# Sierpień 01, 2006, 14:56:05
W javie sa naprawde dobre, kiedys zdekompilowalismy plik *.jar. Byly tam linijki np w takiej postaci
i
Aczkowielwiek, udalo sie to odzyskac. Niestety to nie byla moja zasluga.

Offline zarius

  • Użytkownik

# Sierpień 01, 2006, 17:01:52
Dla zainteresowanych znalazlem i troche potestowalem i oto przyklad:

Kod orginalny:
using System.Collections;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;

namespace GameServer
{

    public class ConnectionManager
    {

        private ArrayList alConnections;
        public TextBox tbport;
        private Thread thdConnectionHandler;
        private Thread thdListener;

        public ConnectionManager(TextBox tbPort)
        {
            thdListener = new Thread(new ThreadStart(ConnectionListener));
            thdConnectionHandler = new Thread(new ThreadStart(ConnectionHandler));
            alConnections = new ArrayList();
            tbport = tbPort;
        }

        private void ConnectionHandler()
        {
            byte[] bArr1 = new byte[255];
            Socket socket = (Socket)alConnections[0];
            socket.Receive(bArr1);
            if (bArr1[0] == 255)
            {
                byte[] bArr2 = new byte[] { 100 };
                socket.Send(bArr2);
            }
        }

        private void ConnectionListener()
        {
            // trial
        }

        public void HandleStart()
        {
            // trial
        }

        public void HandleStop()
        {
            thdConnectionHandler.Suspend();
        }

        public void ListenStart()
        {
            // trial
        }

        public void ListenStop()
        {
            thdListener.Suspend();
        }

    } // class ConnectionManager

}

A to kod po zaciemniaczu:
using System;
using System.Collections;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;

namespace GameServer
{

    public class ӟ : Ӿ
    {

        private Ԁ Ӣ;
        public ԁ ӣ;
        private ӿ Ӡ;
        private Ԁ ӡ;

        public ӟ(ԁ tbPort)
        {
            ԣ();
            ӡ = new Ԁ(new Ԏ(Ӥ));
            Ӣ = new Ԁ(new Ԏ(ӥ));
            Ӡ = new ӿ();
            ӣ = tbPort;
        }

        public void Ӧ()
        {
            // trial
        }

        public void ӧ()
        {
            throw new Exception("This method was pruned during dead code elimination.");
        }

        private void Ӥ()
        {
            // trial
        }

        private void ӥ()
        {
            byte[] bArr1 = new ԏ[255];
            Ԅ Ԅ = (Ԅ)Ӡ.get_Ա(0);
            Ԅ.Բ(bArr1);
            if (bArr1[0] == 255)
            {
                byte[] bArr2 = new ԏ[] { (ԏ)100 };
                Ԅ.Գ(bArr2);
            }
        }

        public void ө()
        {
            throw new Exception("This method was pruned during dead code elimination.");
        }

        public void Ө()
        {
            // trial
        }

    } // class ӟ

}

Mysle ze taki kod jest duzo bezpieczniejszy niz goly... i niech mi tu ktos kitu nie wciska ze to bedzie mala roznica...

Offline Kot

  • Użytkownik

# Sierpień 01, 2006, 17:17:40
Coś kiepsko, że ten zaciemniacz nie zmienia nazw argumentów
Cytuj
public ӟ(ԁ tbPort)

a stosowanie znaków spoza naszego alfabetu to raczej taki pic na wodę, bo wystarczy zwykłe find&replace i już mamy zmienne postaci zmienna1, zmienna2, itd :)

Fajny przykład jest w materiałach do przytoczonego przeze mnie wcześniej artykułu:
http://photos.sys-con.com/story/res/38805/source.html
porównaj listing 3 i listing 4. Wg artykułu powinno to wychodzić na to samo :)

edit: zarius, ściągnij sobie Reflectora do dekompliacji, chyba jest free i nie wstawia "//trial"-i
« Ostatnia zmiana: Sierpień 01, 2006, 17:20:18 wysłana przez Kot »

Offline nameczanin

  • Użytkownik
    • devlog

# Sierpień 10, 2006, 04:40:35
z tego co mi wiadomo istnieja jakies "zaciemniacze" ktore potrafia pozmieniac nazwy zmiennych, klas itp. kodu zrodlowego na zupelnie przypadkowe a sam kod stanie sie potwornie niezrozumialy
Do PHP widzialem cos takiego :F

Offline ronin

  • Użytkownik

# Listopad 18, 2006, 17:42:04
Coś kiepsko, że ten zaciemniacz nie zmienia nazw argumentów
Cytuj
public ӟ(ԁ tbPort)

a stosowanie znaków spoza naszego alfabetu to raczej taki pic na wodę, bo wystarczy zwykłe find&replace i już mamy zmienne postaci zmienna1, zmienna2, itd :)

Samo find&replace nie wystarczy bo nazwy zmiennych i funkcji mogą się powtarzać w przypadków większych projektów. Przykładowy kod Javy:
public class cl01 extends cl02 implements cl03, cl04, cl05
{
    public int a;
    public int b; ...
    public void a()
    {
        a = c(d(e(f(b))))+cl03.a(cl02.b());
    }
}

W tym przypadku nie można zamienić a na coś innego, bo zmienią się nazwy zmiennych i funkcji. Dekompilowanie takiego kodu ręcznie jest bardzo ciężkie do wykonania ale jeszcze użyjemy odpowiednich narzędzi staje się proste. Jeżeli chodzi o Jave to podstawą jak dla mnie jest moduł "refactoring" z NetBeans. Do
tego jeszcze np. Enterprise Architect aby zreversować kod do UML. Widać wtedy które klasy zależą od innych. Klasy, które nie korzystają z innych klas można
wyodrębnić z kodu i skompilować oddzielnie, wiadomo wtedy co robią. Przechodząc tak od małych klas do coraz większych można bardzo szybko uzyskać
czytelny kod.
« Ostatnia zmiana: Listopad 18, 2006, 17:50:38 wysłana przez ronin »