Imagine a situation where there is some malicious program stealing crucial data from victims’ computers and once run, it spreads throughout the entire operating system, creating many copies of it in different locations and runs every time when system boots. Owner of such infected machine needs to find it, delete it, bring back operating system to previous, correct state and ensure that his machine won’t be infected once again by similar malware. How would he do that? How to check which particular program does harm? And then, how to check exactly how and which files were potentially corrupted, which data has been stolen? Finally, how could one ensure that it does not longer exist on disk?Or, some company has produced commercial software using very sophisticated algorithms and doesn’t want any competitive company to be able to extract them nor to copy any fragment of it. Is it possible to ensure that nobody does so? If so, how costly would it be to create such protection?In such situations, and many more, reverse engineering comes with help. Above mentioned examples are just two of countless situations where there is a need to extract some information from software or protect it against analysis and plagiarisms.The purpose of this work is to present what reverse engineering is and help with understanding its importance and impact on modern software development. At the beginning, short definition, historical context and applications will be presented. After that, it will be illustrated in depth on malware analysis process, including defences against it used by malware authors in practice, other potential mechanisms to obstruct analysis, as well as ways to bypass them. Next section will contain more theoretical approach to this topic, including answers to questions like: Is it possible reverse engineer every software?, or: Having executable, is it possible to always generate high level language code which compiles to it?. The last section will contain my own work on this topic, presenting way to implement analysis obstructing mechanisms.
Rozważmy sytuację, w której mamy do czynienia ze złośliwym oprogramowaniem, które kradnie dane zarażonych komputerów i po uruchomieniu rozprzestrzenia się po całym systemie operacyjnym, tworząc wiele swoich kopii w różnych lokalizacjach i zostaje uruchamiane za każdym razem wraz z systemem operacyjnym.Właściciel zaatakowanego komputera musi je znaleźć, usunąć, przywrócić system operacyjny do wcześniejszego, poprawnego stanu i zapewnić, że jego sprzęt nie zostanie więcej zaatakowany przez tego typu program. Jak może to osiągnąć? Jak sprawdzić czy dany program jest szkodliwy czy nie? I, jeśli jest, jak zidentyfikować wszystkie uszkodzone pliki, dowiedzieć się jak zostały uszkodzone oraz jakie dane zostały ukradzione? W końcu, jak zapewnić, że na dysku nie znajdują się już żadne zawirusowane pliki?Albo, pewna firma wyprodukowała komercyjny program korzystający z bardzo wyrafinowanych algorytmów i nie życzy sobie, żeby konkurencyjne firmy były w stanie je odtworzyć ani skopiować ich jakiegokolwiek fragmentu. Czy jest możliwe zrealizowanie tych wymogów? Jeśli tak, to jak kosztowne jest zapewnienie takiej ochrony?W takich sytuacjach i wielu innych inżynieria wsteczna przychodzi z pomocą. Powyżej wspomniane przypadki są zaledwie dwoma z wielu niezliczonych sytuacji, w których jest potrzeba odtworzenia pewnych informacji z programu, bądź jego ochrony przed analizą i plagiatami.Celem tej pracy jest zaprezentowanie czym jest inżynieria wsteczna a także pomoc w zrozumieniu jej znaczenia i wpływu na obecnie wytwarzanie oprogramowania.Na początku podana będzie krótka definicja, kontekst historyczny oraz jej zastosowania. Następnie, będzie zaprezentowana szczegółowo na przykładzie analizy złośliwego oprogramowania, wraz ze sposobami obrony przed nią stosowanymi przez takie programy w praktyce, inne potencjalne sposoby utrudniające analizę a także sposoby ich obejścia. Następna sekcja zawierać będzie bardziej teoretyczne podejście do tematu i zawierać będzie między innymi odpowiedzi na pytania takie jak: Czy możliwe jest dokonanie inżynierii wstecznej na każdym programie? lub: Mając dostęp tylko do pliku wykonywalnego, czy zawsze jest możliwe wygenerowanie kodu napisanego w języku wysokiego poziomu, który kompiluje się do równoważnej postaci?.W ostatniej sekcji znajdzie się moja własna praca dotycząca tego tematu, wraz z opisem sposobów implementowania mechanizmów utrudniających analizę programu.