**Pöördprojekteerimine** on tarkvara masinkoodi või muu käitatava koodi analüüsimine selle tööpõhimõtete või sisemise loogika tuvastamiseks. Pöördprojekteerimist kasutatakse vana tarkvara paikamiseks ja ühilduvuse loomiseks, pahavara analüüsimiseks või kuritahtliku koodi leidmiseks, kuid ka kopeerimiskaitse vältimiseks või tarkvara turvaaukude leidmiseks.

Tööriistad
----------

### Disassembler

Disassembler on arvutiprogramm, mis tõlgib masinkoodi assemblerkeelde, olles seega assembleri vastand. Korrektsele masinkoodile vastab alati vähemalt üks assemblerkeeles kood, seega defektideta disassembleriga peaks saama analüüsida kõiki programme, kuid varieeruva käsupikkusega käsustikel võib kavalalt konstrueeritud koodi puhul olla keeruline, kui leidub hüppeid käsu 'keskele'.

Disassembler on tõhus pisikese koodijupi väga täpseks edasiandmiseks, kuid suurema tarkvaraprojekti analüüsimine vaid disassembleri abil on tülikas. 

### Dekompilaator

Dekompilaator on programm, mis teisendab kompileeritud koodi kõrgtaseme lähtekoodiks, olles seega kompilaatori vastand. Selline kood on palju lihtsamini loetav, kuid dekompilaatori ülesanne on disassembleri omast oluliselt keerulisem, sest et lähtekoodi ja masinkoodi vahel puudub üksühene seos. Õige väljund on vähem defineeritud – mida idiomaatilisemat koodi see väljastab, seda kergemini loetav see on.

Kõige populaarsem masinkoodi dekompilaator elukutseliste pöördprojekteerijate seas on IDA Pro, mis on tasuline tarkvara.

2019. aastal avaldas NSA oma dekompilaatori Ghidra ja selle lähtekoodi.

### Silur

Silur on arendustööriist, mida kasutatakse programmi samm- või osahaaval käitamiseks ning selle oleku (näiteks mälu ja registrite) jälgimiseks, mille abil saab uuritava programmi tööd analüüsida dünaamiliselt, mis teeb koodi huvitava osa leidmise lihtsamaks ning enamasti võimaldab koodi ka käitamise ajal disassembleerida ja muuta. Dünaamiline analüüs on kasulik tehnika eriti näiteks siis, kui programm dekrüpteerib ennast mälus.

Rakendused
----------

### Pahavara analüüsimine

Pahavara analüüsitakse, et tuvastada selle funktsionaalsus, päritolu, ohtlikkus ja seotud juhtserverid. Eduka analüüsi tulemusena võib olla võimalik tarkvara kahjutuks teha, näiteks on võimalus, et autoriteedid võtavad juhtserverid või nende domeeniaadressid enda kontrolli alla. Ka on mõnikord võimalik sel viisil tuvastada pahavara autor.

### Koopiakaitse vältimine

Koopiakaitse vältimine ehk kräkkimine on kommertsvara analüüsimine või muutmine litsentsipiirangute vältimiseks, näiteks piraattarkvara levitamise eesmärgil.

### Turvaaukude otsimine

Pöördprojekteeritud tarkvarast saab otsida turvaauke, kas äriloogikast või mäluhaldusest – viimasest kõige levinum ärakasutatav tarkvaraviga on puhvri ületäitumine. Turvaauke otsivad nii "mustakaabulised" kui ka "valgekaabulised" häkkerid – esimesed nende ärakasutamiseks või müümiseks ja teised, et teavitada arendajat turvaaugust, et too selle parandaks. Suuremates tarkvaraprojektides on sageli kasutusel puugipreemiajaht, kus vea leidjat premeeritakse tunnustuse ja rahalise tasuga.

Pöördprojekteerimise tõkestamine
--------------------------------

### Sogastamine

Tarkvara sogastamine on selle muutmine nii, et tulemuse mõistmine on inimeste jaoks keeruline. Sogastamistehnikad põhinevad käitatava koodi teisendamises nii, et tulemus on semantiliselt sama, kuid raskemini loetav. 

### Silumisvastased meetodid

Et vältida programmi töö dünaamilist analüüsi siluri abil, võivad programmid vältida programmi olulise osa käitamisest, kui tuvastatakse, et silur on küljes. Meetodid selle tuvastamiseks põhinevad kas otseselt käituskeskkonna silumisliideselt küsimisel, programmi koodi muudatuste tuvastamisel (katkestuspunktid on sageli teostatud programmi ajutise muutmisega) või silumisest põhjustatud keskkonnamuudatuste tuvastamisel.

Legaalsus
---------

### Euroopa Liidus

Euroopa Liidus sätestab pöördprojekteerimist direktiiv 2009/24/EÜ.

Selle direktiivi kohaselt on tarkvara autoriõiguse omanikul ainuõigus lubada tarkvara kopeerimist, tõlkimist, muutmist või avaldamist. Erandina on lubatud muuta tarkvara vigade parandamiseks ning dekompileerida, kui see on vajalik ühilduvuse tagamiseks muu seadme või tarkvaraga, kuid sellist dekompileerimise tulemust ei tohi kasutada muul eesmärgil.

### Ameerika Ühendriikides

Ameerika Ühendriikides on pöördprojekteerimine ühilduse tagamiseks lubatud, kuid kohtupraktikas võivad lepingutingimused seda keelata, mis juhul pöördprojekteerimist loetakse lepingurikkumiseks.

Viited
------

1. ↑  Warden, R. (1992). *Software Reuse and Reverse Engineering in Practice*. London, England: Chapman & Hall. Lk-d 283–305.
2. 1 2  C. Cifuentes, K. Gough (1995). "Decompilation of binary programs". *Software: Practice and Experience*. Kd 25 (7 trükk). Lk 811-829.
3. ↑  Quynh, Nguyen Anh (7. august 2014). "Capstone: Next-Gen Disassembly Framework" (pdf). Vaadatud 29.01.2020.
4. 1 2  E. Eldad (2005). *Reversing: Secrets of Reverse Engineering*. No Starch Press. ISBN ISBN 978-1-59327-178-7.. `{{raamatuviide}}`: kontrolli parameetri `|isbn=` väärtust: invalid character (juhend)
5. ↑  "Ghidra Change Log". Vaadatud 29.01.2020.
6. ↑  M. V. Yason (2007). "The Art of Unpacking" (PDF). Vaadatud 29.01.2020.
7. ↑  M. Sikorski, A. Honig (2012). *Practical Malware Analysis*. San Francisco, CA, Ameerika Ühendriigid: No Starch Press. ISBN 9781593272906.
8. ↑  J. Saxe, H. Sanders (2018). *Malware Data Science*. No Starch Press. ISBN 978-1-59327-859-5.
9. ↑  P. Craig, R. Honick, M. Burnett (2005). *Software Piracy Exposed*. Rockland, MA: Syngress. Lk 61-94. ISBN ISBN 1-932266-98-4.. `{{raamatuviide}}`: kontrolli parameetri `|isbn=` väärtust: invalid character (juhend)CS1 hooldus: mitu nime: autorite loend (link)
10. ↑  C. Anley, J. Koziol, F. Linder (2007). *The Shellcoder's Handbook: Discovering and Exploiting Security Holes*. New York, Ameerika Ühendriigid: John Wiley & Sons, Inc. ISBN 978-0-470-08023-8.`{{raamatuviide}}`: CS1 hooldus: mitu nime: autorite loend (link)
11. ↑  T. Maillart, M. Zhao, J. Grossklags, J. Chuang (2017). "Given enough eyeballs, all bugs are shallow? Revisiting Eric Raymond with bug bounty programs". *Journal of Cybersecurity*. Oxford University Press. Lk 81-90.`{{raamatuviide}}`: CS1 hooldus: mitu nime: autorite loend (link)
12. ↑  C. Behera, D. Bhaskari (2015). "Different Obfuscation Techniques for Code Protection". *Procedia Computer Science*. Kd 70. Lk 757-763.
13. ↑  Deep Instinct. "COMMON ANTI-DEBUGGING TECHNIQUES IN THE MALWARE LANDSCAPE". *The Malware D.Igest*. Vaadatud 29.01.2020.
14. ↑  "2009/24/EÜ". *Euroopa Liidu Teataja*. 2009. Lk 111.
15. ↑  "17 U.S. Code § 1201 (f)".
16. ↑  G. Gross (26. juuni 2003). "Contract case could hurt reverse engineering". *InfoWorld*. Vaadatud 29.01.2020.