Temat: Dekompilacja kodu
Podstawowy obfuscator masz dostępny w VS - Dotfuscator Community Editor. Ale lepiej zapytać google o .NET Obfuscator, bo są na pewno oferujące lepsze możliwości.
Co do trików, to powiem szczerze nigdzie nie spotkałem się z artykułem podsumowującym różne techniki (mam w planach post z tym co ja wymyśliłem, ale z braku czasu ciągle odkładam go). Może trochę na
OWASP poszperaj.
Niestety będziesz musiał bawić się ILASM'em, żeby to zrobić.
1) Załóżmy, że masz fragment kodu, który wygląda tak
ret
[instrukcja operująca na stosie]
ret
Oczywiście takiego kodu nie wyprodukujesz za pomocą C#. Musisz posłużyć się MethodBuilder'em (swój kod w postaci IL dostaniesz za pomocą GetMethodBody (na obiekcie MethodInfo). Reflector parsując ten kod do C# będzie próbował wykonać to (stos pusty) i wywali się. Niestety IL pokaże się bez problemu. Wystarczy edycji dll'ki i mamy też C#/VB.NET i inne.
2) Możesz w strumień bajtów wklejać opcody, które nie są przyporządkowane do różnych instrukcji, oczywiście musisz dać BR_S przed tym - czyli musisz mieć 3 bajtowe NOP'y w kodzie.
3) Oba narzędzia mają problem z buffer overload na co wskazał Dinis Cruz na OWASP'ie
Buffer_OverFlow_in_ILASM_and_ILDASM.
Wygenerowanie assembly z metodą, która ma 64k znaków w nazwie wywala oba narzędzia. Mankament jest taki, że jedynie możesz zawołać to przez Reflection (i nie sądzę, że to dobry pomysł aby metoda publiczna miała tak długą nazwę :-)).
Przypomniało mi się jeszcze, że możesz dll'kę generować w pamięci user nie będzie miał fizycznie jej na dysku (o ile nie zrobi sobie dump'a pamięci). Jakoś to też zniechęci, jak w kodzie zobaczy IL'a.
Ale tak jak pisałem - wszystko da się obejść. Jeśli miałbyś jakieś pytania to chętnie odpowiem. Jest to ciekawy dla mnie temat.
Paweł Łukasik edytował(a) ten post dnia 14.01.09 o godzinie 15:09