{"id":14059,"date":"2025-02-10T05:00:00","date_gmt":"2025-02-10T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=14059"},"modified":"2025-02-18T11:43:34","modified_gmt":"2025-02-18T10:43:34","slug":"inzynieria-odwrotna-co-to-jest","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/inzynieria-odwrotna-co-to-jest\/","title":{"rendered":"In\u017cynieria odwrotna \u2013 co to jest?"},"content":{"rendered":"\n<p>In\u017cynieria odwrotna (ang. Reverse Engineering), czasami nazywana in\u017cynieri\u0105 wsteczn\u0105, to proces, w kt\u00f3rym produkty s\u0105 dekonstruowane w celu wyodr\u0119bnienia z nich informacji projektowych.&nbsp;Cz\u0119sto in\u017cynieria odwrotna polega na dekonstrukcji poszczeg\u00f3lnych element\u00f3w wi\u0119kszych produkt\u00f3w. Proces umo\u017cliwia okre\u015blenie, w jaki spos\u00f3b produkt zosta\u0142 zaprojektowany, aby mo\u017cna by\u0142o go odtworzy\u0107.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Kilka s\u0142\u00f3w o historii<\/strong><\/h2>\n\n\n\n<p>Nazwa in\u017cynierii odwrotnej wywodzi si\u0119 z tego, \u017ce proces obejmuje przechodzenie \u201ewstecz\u201d przez oryginalny proces projektowania. Cz\u0119sto wiedza na temat metod in\u017cynierskich, kt\u00f3re zosta\u0142y wykorzystane do stworzenia produktu, jest ograniczona, dlatego wyzwaniem jest jej zdobycie.<\/p>\n\n\n\n<p>In\u017cynieria odwrotna istnieje od samego pocz\u0105tku, kiedy ludzie tworzyli rzeczy, takie jak ko\u0142a, powozy czy infrastruktur\u0119 architektoniczn\u0105. Aby odtworzy\u0107 te obiekty, wykorzystywano prymitywn\u0105 in\u017cynieri\u0119 wsteczn\u0105. Zdejmowano wymiary obiekt\u00f3w i odtwarzano je w ca\u0142o\u015bci albo cz\u0119\u015bciowo je przebudowywano. Na przyk\u0142ad armia rzymska, kt\u00f3ra nie mia\u0142a sta\u0142ej marynarki wojenne, po I wojnie punickiej w roku 264 p.n.e. dokona\u0142a in\u017cynierii wstecznej na wraku kartagi\u0144skiego pi\u0119ciorz\u0119dowca. Niestety, jako pocz\u0105tkuj\u0105cy cie\u015ble, Rzymianie zbudowali kopie, kt\u00f3re by\u0142y ci\u0119\u017csze ni\u017c statki kartagi\u0144skie, a wi\u0119c wolniejsze i mniej zwrotne.<\/p>\n\n\n\n<p>Techniki in\u017cynierii odwrotnej znacznie ewoluowa\u0142y od tych minionych epok. Chocia\u017c in\u017cynieria odwrotna mog\u0142a zacz\u0105\u0107 si\u0119 od zastosowa\u0144 wojskowych, jest teraz przydatna w wielu r\u00f3\u017cnych dziedzinach, w tym w in\u017cynierii komputerowej, in\u017cynierii mechanicznej, projektowaniu, in\u017cynierii elektronicznej, in\u017cynierii oprogramowania, in\u017cynierii chemicznej czy te\u017c biologii system\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>In\u017cynieria odwrotna w produkcji<\/strong><\/h2>\n\n\n\n<p>Dla producent\u00f3w in\u017cynieria odwrotna jest niezwykle wa\u017cnym procesem. Istnieje jej wiele powszechnych zastosowa\u0144 w produkcji:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jest cz\u0119sto stosowana, gdy brakuje oryginalnej dokumentacji lub je\u015bli nie ma rysunk\u00f3w 2D lub 3D\/modeli CAD. In\u017cynieria odwrotna jest szczeg\u00f3lnie wa\u017cna, je\u015bli informacje projektowe cz\u0119\u015bci zale\u017c\u0105 od ludzkiej pami\u0119ci.<\/li>\n\n\n\n<li>Firmy przeprowadzaj\u0105 in\u017cynieri\u0119 wsteczn\u0105 cz\u0119\u015bci, gdy cz\u0119\u015bci zamienne od producenta oryginalnego sprz\u0119tu (OEM) nie s\u0105 dost\u0119pne, poniewa\u017c producent ju\u017c ich nie tworzy lub te\u017c producent ju\u017c nie istnieje.<\/li>\n\n\n\n<li>Jest r\u00f3wnie\u017c wykorzystywana do optymalizacji z\u0142o\u017ce\u0144 i ulepszania produkt\u00f3w o nowe funkcje.<\/li>\n\n\n\n<li>Producenci stosuj\u0105 j\u0105, aby ulepszy\u0107 cz\u0119\u015bci, kt\u00f3re uleg\u0142y awarii lub odtworzy\u0107 r\u0119cznie wykonane cz\u0119\u015bci lub zespo\u0142y cz\u0119\u015bci.<\/li>\n\n\n\n<li>Czasami jest po prostu wykorzystywana do budowania cyfrowego archiwum lub tworzenia wirtualnego \u015brodowiska do wykorzystania w przysz\u0142o\u015bci.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Korzy\u015bci in\u017cynierii wstecznej w produkcji<\/strong><\/h2>\n\n\n\n<p>Do zalet wykorzystania in\u017cynierii odwrotnej nale\u017c\u0105:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>In\u017cynieria wsteczna mo\u017ce zmniejszy\u0107 ryzyko zwi\u0105zane ze starszymi produktami oraz wadami produkt\u00f3w. Dzi\u0119ki niej mo\u017cna stworzy\u0107 cz\u0119\u015bci zamienne, a tak\u017ce zidentyfikowa\u0107 i pom\u00f3c w naprawie usterek w produktach.<\/li>\n\n\n\n<li>Ponadto in\u017cynieria odwrotna mo\u017ce przyspieszy\u0107 innowacje produktowe. Na przyk\u0142ad zesp\u00f3\u0142 in\u017cynier\u00f3w mo\u017ce bada\u0107 projekty istniej\u0105cych produkt\u00f3w i szuka\u0107 sposob\u00f3w na zwi\u0119kszenie ich wydajno\u015bci, uaktualnienie funkcji lub znalezienie sposob\u00f3w na obni\u017cenie koszt\u00f3w produkcji.<\/li>\n\n\n\n<li>Producenci wykorzystuj\u0105 ten proces, aby szybko produkowa\u0107 cz\u0119\u015bci, zamiast kupowa\u0107 komponenty od producenta OEM, kt\u00f3ry mo\u017ce mie\u0107 d\u0142ugi czas realizacji i wymaga\u0107 wysokich koszt\u00f3w.<\/li>\n\n\n\n<li>In\u017cynieria odwrotna mo\u017ce by\u0107 r\u00f3wnie\u017c kluczow\u0105 strategi\u0105 w planie proaktywnej konserwacji producenta. Dzi\u0119ki in\u017cynierii wstecznej krytycznych komponent\u00f3w, zanim komponenty ulegn\u0105 awarii, producent mo\u017ce magazynowa\u0107 cz\u0119\u015bci zamienne i skr\u00f3ci\u0107 nieplanowane przestoje.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Bran\u017ce wykorzystuj\u0105ce in\u017cynieri\u0119 wsteczn\u0105<\/strong><\/h2>\n\n\n\n<p>Producenci z wielu bran\u017c wykorzystuj\u0105 procesy in\u017cynierii odwrotnej do optymalizacji produkcji, uzyskania przewagi konkurencyjnej i obni\u017cenia koszt\u00f3w. Najpopularniejsze bran\u017ce, w kt\u00f3rych ma racj\u0119 bytu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Przemys\u0142 lotniczy \u2013 przeprowadzanie analizy aerodynamicznej, opracowanie plan\u00f3w utrzymania statk\u00f3w powietrznych, dodawanie\/ulepszanie komponent\u00f3w samolotu, produkcja narz\u0119dzi.<\/li>\n\n\n\n<li>Przemys\u0142 samochodowy \u2013 studiowanie konkurencji, digitalizacja cz\u0119\u015bci starszych modeli pojazd\u00f3w, zrozumienie problem\u00f3w z komponentami pojazdu, produkcja cz\u0119\u015bci zamiennych.<\/li>\n\n\n\n<li>Firmy narz\u0119dziowe \u2013 ulepszanie uchwyt\u00f3w, opraw, matryc, form, cz\u0119\u015bci do maszyn i narz\u0119dzi skrawaj\u0105cych.<\/li>\n\n\n\n<li>Dobra konsumpcyjne \u2013 szybkie tworzenie prototyp\u00f3w, testowanie i walidacja projekt\u00f3w koncepcyjnych, analiza produkt\u00f3w konkurencji, dokumentowanie i archiwizowanie r\u00f3\u017cnych iteracji projektowych.<\/li>\n\n\n\n<li>Ochrona sztuki i dziedzictwa \u2013 odtwarzanie dzie\u0142 sztuki do cel\u00f3w edukacyjnych, ochrona cyfrowa sztuk wizualnych, takich jak obrazy, rze\u017aby, staro\u017cytne artefakty archeologiczne i budynki historyczne, odrestaurowane artefakt\u00f3w kultury.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>In\u017cynieria odwrotna w oprogramowaniu<\/strong><\/h2>\n\n\n\n<p>In\u017cynieria odwrotna oprogramowania (ang. Software reverse engineering) to proces polegaj\u0105cy na analizie systemu oprogramowania, w ca\u0142o\u015bci lub w cz\u0119\u015bci, w celu wyodr\u0119bnienia informacji o projekcie i implementacji.<\/p>\n\n\n\n<p>In\u017cynieria odwrotna oprogramowania jest szeroko stosowana w elektronice, a tak\u017ce w obszarach przemys\u0142owych, komputerowych i wojskowych. Przyk\u0142adowe zastosowania in\u017cynierii odwrotnej:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Badanie format\u00f3w plik\u00f3w u\u017cywanych do przechowywania danych.<\/li>\n\n\n\n<li>Zwi\u0119kszanie zgodno\u015bci produktu z oprogramowaniem lub platform\u0105 stron trzecich.<\/li>\n\n\n\n<li>Utrzymanie starych system\u00f3w poprzez napraw\u0119 znalezionych b\u0142\u0119d\u00f3w, poprawienie wydajno\u015bci, dodanie nowych funkcji.<\/li>\n\n\n\n<li>Badanie nieudokumentowanych cech produktu komercyjnego.<\/li>\n\n\n\n<li>Szukanie nieznanych wcze\u015bniej mechanik, kt\u00f3re mo\u017cna wykorzysta\u0107 w przysz\u0142o\u015bci.<\/li>\n\n\n\n<li>Zwi\u0119kszenie bezpiecze\u0144stwa: sprawdzenie czy oprogramowanie jest w stanie oprze\u0107 si\u0119 in\u017cynierii wstecznej przeprowadzanej przez osoby trzecie, ochrona antywirusowa itp.<\/li>\n\n\n\n<li>Uzupe\u0142nienie\/zaktualizowanie dokumentacji produktu.<\/li>\n\n\n\n<li>Usuwanie zabezpiecze\u0144 przed kopiowaniem, omijanie ogranicze\u0144 dost\u0119pu.<\/li>\n\n\n\n<li>Badanie z\u0142o\u015bliwego oprogramowania, aby zrozumie\u0107, jak dzia\u0142a w celu obrony przed nim oraz wykorzystania zdobytej wiedzy do aktualizacji baz wirus\u00f3w i przygotowania obrony na wypadek przysz\u0142ych atak\u00f3w z\u0142o\u015bliwego oprogramowania.<\/li>\n\n\n\n<li>Dostosowywanie system\u00f3w wbudowanych przyk\u0142adowo systemy zarz\u0105dzania silnikiem.<\/li>\n\n\n\n<li>In\u017cynieria odwrotna mo\u017ce by\u0107 nieocenionym narz\u0119dziem do nauki korzystania z okre\u015blonego j\u0119zyka programowania lub pracy z okre\u015blonym typem aplikacji, pocz\u0105tkuj\u0105cy mog\u0105 wykorzysta\u0107 t\u0119 technik\u0119 do doskonalenia swoich umiej\u0119tno\u015bci.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przypadki wykorzystania in\u017cynierii wstecznej<\/strong><\/h2>\n\n\n\n<p>W zale\u017cno\u015bci od tego jaki jest cel zastosowanie in\u017cynierii odwrotnej w oprogramowaniu mo\u017cemy wyr\u00f3\u017cni\u0107 dwa przypadki. W pierwszym przypadku kod \u017ar\u00f3d\u0142owy jest dost\u0119pny dla oprogramowania, ale wysokopoziomowe aspekty programu ju\u017c nie, natomiast w drugim przypadku nie ma dost\u0119pu ani do kodu \u017ar\u00f3d\u0142owego oprogramowania ani do wysokopoziomowych aspekt\u00f3w programu.<\/p>\n\n\n\n<p>Drugi przypadek jest cz\u0119sto nazywany jako&nbsp;<strong>in\u017cynieria odwrotnego kodu (ang. reverse code engineering)<\/strong>&nbsp;i jest on bardziej powszechny ni\u017c przypadek pierwszy.<\/p>\n\n\n\n<p>Proces analizy dzia\u0142ania danego programu mo\u017cna podzieli\u0107 na nast\u0119puj\u0105ce kroki (Rys. 1):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dezasemblacja \u2013 zamiana kodu binarnego na komendy assamblera.<\/li>\n\n\n\n<li>Dekompilacja \u2013 zamiana komend assemblera na kod programu.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-1.png\"><img decoding=\"async\" width=\"322\" height=\"1024\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-1-322x1024.png\" alt=\"Ryc. 1 Uproszczony schemat procesu in\u017cynierii odwrotnej\" class=\"wp-image-21909\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-1-322x1024.png 322w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-1-94x300.png 94w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-1.png 427w\" sizes=\"(max-width: 322px) 100vw, 322px\" \/><\/a><figcaption class=\"wp-element-caption\">Rys. 1 Uproszczony schemat procesu in\u017cynierii odwrotnej<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Znany przyk\u0142ad zastosowania in\u017cynierii odwrotnej w oprogramowaniu<\/strong><\/h2>\n\n\n\n<p>Firma Phoenix Technologies Ltd., kt\u00f3ra w po\u0142owie lat 80. chcia\u0142a wyprodukowa\u0107 BIOS dla komputer\u00f3w PC, b\u0119d\u0105cy kompatybilnym z firmowym BIOS-em IBM PC. Aby uchroni\u0107 si\u0119 przed zarzutami nielegalnego skopiowania BIOS-u IBM, firma Phoenix u\u017cy\u0142a in\u017cynierii wstecznej, stosuj\u0105c&nbsp;<strong>podej\u015bcie zwane \u201eczystym pokojem\u201d lub \u201echi\u0144sk\u0105 \u015bcian\u0105\u201d.<\/strong><\/p>\n\n\n\n<p>Najpierw zesp\u00f3\u0142 in\u017cynier\u00f3w przestudiowa\u0142 BIOS IBM, oko\u0142o 8 KB kodu. Nast\u0119pnie opisa\u0142 wszystko, co BIOS robi\u0142, tak dok\u0142adnie, jak to mo\u017cliwe, bez u\u017cywania lub odwo\u0142ywania si\u0119 do \u017cadnego rzeczywistego kodu. Nast\u0119pnie Phoenix sprowadzi\u0142 drugi zesp\u00f3\u0142 programist\u00f3w, kt\u00f3rzy nie mieli do czynienia z BIOS-em IBM-u i nigdy nie widzieli jego kodu.<\/p>\n\n\n\n<p>Pracuj\u0105c tylko na podstawie specyfikacji funkcjonalnych pierwszego zespo\u0142u, drugi zesp\u00f3\u0142 napisa\u0142 nowy BIOS, kt\u00f3ry dzia\u0142a\u0142 zgodnie ze specyfikacj\u0105. Powsta\u0142y BIOS r\u00f3\u017cni\u0142 si\u0119 od kodu IBM, ale pod ka\u017cdym wzgl\u0119dem dzia\u0142a\u0142 identycznie. Stosuj\u0105c podej\u015bcie czystego pokoju, nawet je\u015bli niekt\u00f3re sekcje kodu by\u0142y identyczne,&nbsp;<strong>nie dosz\u0142o do naruszenia praw autorskich<\/strong>. Phoenix zacz\u0105\u0142 sprzedawa\u0107 sw\u00f3j BIOS firmom, kt\u00f3re wykorzysta\u0142y go do stworzenia pierwszych komputer\u00f3w PC kompatybilnych z IBM.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Narz\u0119dzia wykorzystywane przy in\u017cynierii odwrotnej oprogramowania<\/strong><\/h2>\n\n\n\n<p>In\u017cynierowie pracuj\u0105c nad in\u017cynieri\u0105 odwrotn\u0105 oprogramowania wykorzystuj\u0105 mi\u0119dzy innymi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Deasemblery \u2013 s\u0142u\u017c\u0105 do zamiany kod\u00f3w binarnych na kody asemblera. S\u0105 r\u00f3wnie\u017c wykorzystywane do wyodr\u0119bniania ci\u0105g\u00f3w, funkcji (zar\u00f3wno importowanych, jak i eksportowanych), bibliotek itp. Pomagaj\u0105 konwertowa\u0107 j\u0119zyk maszynowy na format bardziej przyjazny dla u\u017cytkownika. R\u00f3\u017cne deasemblery s\u0105 u\u017cywane do r\u00f3\u017cnych cel\u00f3w.<\/li>\n\n\n\n<li>Debugery \u2013 rozszerzaj\u0105 funkcjonalno\u015b\u0107 deasembler\u00f3w mi\u0119dzy innymi o monitorowanie rejestr\u00f3w procesora, widok stosu, heksowe zrzuty programu. Programi\u015bci u\u017cywaj\u0105 debugger\u00f3w do ustawiania punkt\u00f3w przerwania, a tak\u017ce do edycji kod\u00f3w asemblera w czasie wykonywania.<\/li>\n\n\n\n<li>Narz\u0119dzia do monitorowania systemu \u2013 \u015bledz\u0105 operacje sieciowe, dost\u0119p do danych, dost\u0119p do plik\u00f3w systemowych i tym podobne. Niekt\u00f3re narz\u0119dzia pokazuj\u0105 wykorzystanie przez program artefakt\u00f3w systemu operacyjnego, takich jak muteksy, strumienie, zdarzenia itp.<\/li>\n\n\n\n<li>Edytory szesnastkowe \u2013 pozwalaj\u0105 programistom przegl\u0105da\u0107 i edytowa\u0107 pliki binarne. Pomagaj\u0105 w manipulowaniu podstawowymi danymi binarnymi sk\u0142adaj\u0105cymi si\u0119 na plik komputerowy. Poniewa\u017c s\u0105 u\u017cywane do edycji plik\u00f3w binarnych, s\u0105 czasami okre\u015blane jako edytor binarny lub edytor plik\u00f3w binarnych.<\/li>\n\n\n\n<li>Przegl\u0105darka zasob\u00f3w \u2013 to narz\u0119dzie pozwala programistom przegl\u0105da\u0107 i edytowa\u0107 zasoby osadzone w pliku EXE. Pozwalaj\u0105 na zmian\u0119 ikon, edycj\u0119 menu, informacje o wersji, okno dialogowe itp. PE Explorer u\u0142atwia t\u0142umaczenie aplikacji, kt\u00f3re nie posiadaj\u0105 kod\u00f3w \u017ar\u00f3d\u0142owych. Wszystko co trzeba zrobi\u0107, to zast\u0105pi\u0107 zasoby tekstowe ich przet\u0142umaczonymi wersjami, a nast\u0119pnie zmieni\u0107 rozmiar przycisk\u00f3w, formularzy itp.<\/li>\n\n\n\n<li>\u015arodowiska wirtualne \u2013 mo\u017ce by\u0107 u\u017cywane do analizy nieznanych\/podejrzanych program\u00f3w. Uruchomienie nieznanego programu w niekontrolowanym \u015brodowisku mo\u017ce spowodowa\u0107 nieodwracalne szkody, je\u015bli program uruchomi co\u015b w tle. Korzystanie z wirtualnego \u015brodowiska jest konieczno\u015bci\u0105, gdy mamy do czynienia z nieznanym oprogramowaniem, aby\u015bmy mogli bezpiecznie dzia\u0142a\u0107 analizuj\u0105c go w odizolowanym \u015brodowisku.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Gotowe narz\u0119dzia<\/strong><\/h2>\n\n\n\n<p>Istniej\u0105 gotowe narz\u0119dzia wspomagaj\u0105ce proces in\u017cynierii odwrotnej. Nale\u017c\u0105 do nich:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>IDA (The Interactive Dissambler) \u2013 najbardziej popularne narz\u0119dzie, podstawowa darmowa wersja wysposa\u017cona jest w deasembler oraz debugger.<\/li>\n\n\n\n<li>Ghidra \u2013 darmowe otwarte oprogramowanie stworzone przez National Security Agency (NSA), wyposa\u017cone w deasembler i dekompilator, oraz od niedawna w debugger.<\/li>\n\n\n\n<li>ImHex \u2013 darmowe otwarte oprogramowanie wyposa\u017cone w deasembler, umo\u017cliwia wy\u015bwietlanie, edycj\u0119 i analiz\u0119 binarnego kodu.<\/li>\n\n\n\n<li>Radare2 \u2013 oparty na licencji GNU, wyposa\u017cony w deasembler oraz debugger.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"908\" height=\"186\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/logotypy.jpg\" alt=\"Logotypy od lewej: IDA, ImHex, Ghidra, Radare2\" class=\"wp-image-30310\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/logotypy.jpg 908w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/logotypy-300x61.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/logotypy-768x157.jpg 768w\" sizes=\"(max-width: 908px) 100vw, 908px\" \/><figcaption class=\"wp-element-caption\">Rys. 2 Logotypy od lewej: IDA, ImHex, Ghidra, Radare2<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Hello world!<\/strong><\/h2>\n\n\n\n<p>Pierwszym uruchamianym programem podczas nauki j\u0119zyka programowania jest zazwyczaj wy\u015bwietlenie napisu \u201e<a href=\"https:\/\/pl.wikipedia.org\/wiki\/Hello_world\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >hello, world<\/a>\u201d. Najprostsz\u0105 modyfikacj\u0119 jak\u0105 mo\u017cna wprowadzi\u0107 do tego klasycznego przyk\u0142adu, jest zmiana wy\u015bwietlanego tekstu.<\/p>\n\n\n\n<p>Modyfikuj\u0105c wy\u015bwietlany tekst, nale\u017cy zwr\u00f3ci\u0107 szczeg\u00f3ln\u0105 uwag\u0119 na to, aby:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ci\u0105g znak\u00f3w zako\u0144czy\u0107 znakiem nowej linii,<\/li>\n\n\n\n<li>nie przekroczy\u0107 liczby znak\u00f3w, nie wiemy za co odpowiadaj\u0105 bajty znajduj\u0105ce si\u0119 za napisem.<\/li>\n<\/ul>\n\n\n\n<p>Napis \u201ehello, world\u201d przedstawiony w zapisie szesnastkowym wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-2-1.png\"><img decoding=\"async\" width=\"638\" height=\"52\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-2-1.png\" alt=\"Napis \u201ehello, world\u201d przedstawiony w zapisie szesnastkowym\" class=\"wp-image-21913\" style=\"width:638px;height:52px\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-2-1.png 638w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-2-1-300x24.png 300w\" sizes=\"(max-width: 638px) 100vw, 638px\" \/><\/a><\/figure>\n\n\n\n<p>W kodzie binarnym mo\u017cemy znale\u017a\u0107 sekwencj\u0119 znak\u00f3w zawieraj\u0105c\u0105 napis \u201eworld\u201d i zamieni\u0107 j\u0105 na \u201eSii!\u201d (Rys. 3). W ten spos\u00f3b otrzymamy nowy napis \u201ehello, Sii!\u201d (Rys. 4).<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-3.png\"><img decoding=\"async\" width=\"633\" height=\"375\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-3.png\" alt=\"Ryc. 3 Prosta modyfikacja \u201ehello, world\u201d\" class=\"wp-image-21915\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-3.png 633w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-3-300x178.png 300w\" sizes=\"(max-width: 633px) 100vw, 633px\" \/><\/a><figcaption class=\"wp-element-caption\">Rys. 3 Prosta modyfikacja \u201ehello, world\u201d<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-4.png\"><img decoding=\"async\" width=\"578\" height=\"159\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-4.png\" alt=\"Ryc. 4 Wy\u015bwietlanie \u201ehello, world\u201d przed i po modyfikacji\" class=\"wp-image-21917\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-4.png 578w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-4-300x83.png 300w\" sizes=\"(max-width: 578px) 100vw, 578px\" \/><\/a><figcaption class=\"wp-element-caption\">Rys. 4 Wy\u015bwietlanie \u201ehello, world\u201d przed i po modyfikacji<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>In\u017cynieria odwrotna \u2013 legalna czy nielegalna?<\/strong><\/h2>\n\n\n\n<p>Nie ma og\u00f3lnego prawa przeciwko in\u017cynierii wstecznej. Oznacza to, \u017ce praktyka in\u017cynierii wstecznej sama w sobie jest legalna. Jednak\u017ce stosowanie in\u017cynierii odwrotnej mo\u017ce podlega\u0107 nast\u0119puj\u0105cym prawom:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Prawo autorskie i prawo dozwolonego u\u017cytku.<\/li>\n\n\n\n<li>Prawo tajemnicy handlowej.<\/li>\n\n\n\n<li>Postanowienia wymienione w ustawie Digital Millennium Copyright Act (DMCA).<\/li>\n\n\n\n<li>Prawo um\u00f3w.<\/li>\n\n\n\n<li>Ustawa o prywatno\u015bci w komunikacji elektronicznej (ang. The Electronic Communications Privacy Act -ECPA).<\/li>\n<\/ul>\n\n\n\n<p>Wi\u0119kszo\u015b\u0107 oprogramowania stanowi w\u0142asno\u015b\u0107 intelektualn\u0105 firmy, kt\u00f3ra je stworzy\u0142a, tak wi\u0119c jest chronione przez prawa autorskie. Korzystanie z dowolnej cz\u0119\u015bci kodu poddanego in\u017cynierii wstecznej mo\u017ce stanowi\u0107 naruszenie praw autorskich. Nawet je\u015bli programista w rzeczywisto\u015bci nie u\u017cywa kodu.<\/p>\n\n\n\n<p>Wykorzystanie wniosk\u00f3w wyci\u0105gni\u0119tych z kodu poddanego in\u017cynierii wstecznej mo\u017ce stanowi\u0107 wykorzystanie chronionych tajemnic handlowych lub mo\u017ce zosta\u0107 uznane za naruszenie umowy, na przyk\u0142ad umowy o zachowaniu poufno\u015bci.<\/p>\n\n\n\n<p>Ustawa DMCA wprowadza jeszcze wi\u0119kszy zam\u0119t, zakazuj\u0105c stosowania in\u017cynierii wstecznej w celu obej\u015bcia \u201etechnologicznych \u015brodk\u00f3w ochronnych\u201d. Chocia\u017c cz\u0119sto uwa\u017ca si\u0119, \u017ce oznacza to ochron\u0119 zarz\u0105dzania prawami cyfrowymi, wielu twierdzi, \u017ce r\u00f3wnie \u0142atwo mo\u017ce odnosi\u0107 si\u0119 do \u201etechnik, takich jak uwierzytelnianie, podpisywanie kodu, zaciemnianie kodu i szyfrowanie protoko\u0142u\u201d.<\/p>\n\n\n\n<p>Wreszcie, ECPA zabrania \u201eprzechwytywania komunikacji elektronicznej przep\u0142ywaj\u0105cej przez sie\u0107\u201d. Mo\u017ce to obejmowa\u0107 pakiety sieciowe, wi\u0119c jakakolwiek in\u017cynieria wsteczna takich pakiet\u00f3w mo\u017ce stanowi\u0107 naruszenie ECPA, chyba \u017ce uzyskano zgod\u0119 wszystkich odpowiednich stron.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cracking<\/strong><\/h2>\n\n\n\n<p>Obecnie na rynku oprogramowania praktycznie ka\u017cda aplikacja ma zabezpieczenie, kt\u00f3re nie pozwala na korzystanie ze wszystkich funkcji programu, je\u015bli nie jest si\u0119 zarejestrowanym u\u017cytkownikiem. Cracking jest procesem usuwania zabezpiecze\u0144 program\u00f3w i jest on zazwyczaj nielegalny. Proces ten nie jest bezpo\u015brednio zwi\u0105zany z in\u017cynieri\u0105 odwrotn\u0105, ale in\u017cynieria odwrotna mo\u017ce by\u0107 wykorzystana do zbadania cz\u0119\u015bci programu odpowiedzialnej za zabezpieczenia.<\/p>\n\n\n\n<p>Przyk\u0142adow\u0105 metod\u0105 crackingu jest&nbsp;<strong>serial fishing<\/strong>, gdzie szukany jest w\u0142a\u015bciwy numer seryjny, kt\u00f3ry jest zaszyty w kodzie, a nast\u0119pnie za jego pomoc\u0105 dokonywana jest rejestracja produktu. Serial fishing jest metod\u0105 czyst\u0105 z\u0142amania zabezpieczenia programu, nie ingeruje ona w struktur\u0119 programu. Ta metoda mo\u017ce r\u00f3wnie\u017c by\u0107 nazywana jako cracking na \u017cywo, poniewa\u017c w tym przypadku w\u0142a\u015bciwy numer seryjny znajdowany jest w czasie wykonywania programu.<\/p>\n\n\n\n<p>Innym przyk\u0142adem jest&nbsp;<strong>patching<\/strong>&nbsp;okre\u015blany r\u00f3wnie\u017c jako&nbsp;<strong>dead cracking<\/strong>, b\u0119d\u0105cy metod\u0105 inwazyjn\u0105. Przyk\u0142adowo mo\u017ce by\u0107 wykorzystywana w przypadku pomini\u0119cia kodu sprawdzaj\u0105cego czy wersja pr\u00f3bna programu ju\u017c si\u0119 zako\u0144czy\u0142a. Jest miejsce w kodzie, gdzie por\u00f3wnywana jest liczba dni od kiedy u\u017cywany jest program z jak\u0105\u015b sta\u0142\u0105, przyk\u0142adowo 30 dni. Je\u017celi liczba dni u\u017cytkowania jest r\u00f3wna lub wy\u017csza, wy\u015bwietlany jest komunikat i program jest zamykany. Mo\u017cna tutaj podmieni\u0107 instrukcje tak, aby program wykonywa\u0142 to samo niezale\u017cnie od warunku.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Sposoby ochrony przed in\u017cynieri\u0105 odwrotn\u0105 w oprogramowaniu<\/strong><\/h2>\n\n\n\n<p>W wielu przypadkach korzystne jest stworzenie oprogramowania odpornego na in\u017cynieri\u0119 odwrotn\u0105. Niestety nigdy nie da si\u0119 ca\u0142kowicie temu zapobiec. To, co jest mo\u017cliwe, to utrudnianie i blokowanie procesu tak, aby trwa\u0142 jak najd\u0142u\u017cej i by\u0142 trudny do przeprowadzenia, w rezultacie zniech\u0119caj\u0105c osoby przeprowadzaj\u0105ce in\u017cynieri\u0119 wsteczn\u0105.<\/p>\n\n\n\n<p>To, czy kto\u015b ostatecznie odniesie sukces, zale\u017cy od kilku czynnik\u00f3w, takich jak ich zdolno\u015bci i motywacja. Skuteczno\u015b\u0107 technik utrudniaj\u0105cych in\u017cynieri\u0119 odwrotn\u0105 zale\u017cy r\u00f3wnie\u017c od tego, jak\u0105 cen\u0119 jeste\u015bmy w stanie za nie zap\u0142aci\u0107.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Metody ochrony<\/strong><\/h2>\n\n\n\n<p>Ka\u017cde podej\u015bcie wi\u0105\u017ce si\u0119 z pewnym kosztem. Czasami jest to u\u017cycie procesora, czasami rozmiar kodu, a czasami ma to wp\u0142yw na niezawodno\u015b\u0107 i odporno\u015b\u0107. Istnieje kilka podej\u015b\u0107, ka\u017cde z w\u0142asnym zestawem zalet i wad. Aplikacje, kt\u00f3re maj\u0105 na celu zwalczanie atakuj\u0105cych, zazwyczaj wykorzystuj\u0105 kombinacj\u0119 wi\u0119cej ni\u017c jednego podej\u015bcia. Nale\u017c\u0105 do nich:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Eliminowanie informacji symbolicznych<\/strong> \u00ad\u2013 pierwszym i najbardziej oczywistym podej\u015bciem jest wyeliminowanie z programu wszelkich oczywistych informacji tekstowych. W zwyk\u0142ym skompilowanym programie nieopartym na kodzie bajtowym, oznacza to po prostu usuni\u0119cie wszystkich informacji symbolicznych z pliku wykonywalnego programu. W programach opartych na kodzie bajtowym pliki wykonywalne cz\u0119sto zawieraj\u0105 du\u017ce ilo\u015bci wewn\u0119trznych informacji symbolicznych, takich jak nazwy klas, nazwy cz\u0142onk\u00f3w klas i nazwy utworzonych obiekt\u00f3w globalnych. Nazwy wszystkich symboli powinny by\u0107 zamienione na bezsensowne sekwencje znak\u00f3w.<\/li>\n\n\n\n<li><strong>Zaciemnianie programu (ang. obfuscating<\/strong>) \u2013 to og\u00f3lna nazwa dla wielu technik, kt\u00f3re maj\u0105 na celu zmniejszenie podatno\u015bci programu na wszelkiego rodzaju analizy statyczne. Osi\u0105ga si\u0119 to poprzez modyfikacj\u0119 uk\u0142adu, logiki, danych i organizacji programu w taki spos\u00f3b, aby by\u0142 funkcjonalnie identyczny, ale znacznie mniej czytelny. Istnieje wiele r\u00f3\u017cnych podej\u015b\u0107 do zaciemniania.<\/li>\n\n\n\n<li><strong>Osadzanie kodu antydebuggera <\/strong>\u2013 innym powszechnym podej\u015bciem do przeciwdzia\u0142ania in\u017cynierii odwrotnej jest utrudnienie analizy na \u017cywo, w kt\u00f3rej debuger przechodzi przez program, aby okre\u015bli\u0107 szczeg\u00f3\u0142y dotycz\u0105ce jego wewn\u0119trznego wdro\u017cenia. Chodzi o to, aby program celowo wykonywa\u0142 operacje, kt\u00f3re w jaki\u015b spos\u00f3b uszkodz\u0105 lub wy\u0142\u0105cz\u0105 do\u0142\u0105czony debugger,. Niekt\u00f3re z tych podej\u015b\u0107 obejmuj\u0105 po prostu wykrywanie obecno\u015bci debugera i ko\u0144czenie programu, inne obejmuj\u0105 bardziej wyrafinowane sposoby ingerowania w debuggery. Istnieje wiele metod antydebuggera, a wiele z nich jest specyficznych dla platformy lub nawet dla debuggera.<\/li>\n\n\n\n<li><strong>Wykrywanie zmian w oprogramowaniu<\/strong> \u2013 monitorowanie integralno\u015bci systemu w czasie rzeczywistym, podejmowanie odpowiednich dzia\u0142a\u0144, kiedy integralno\u015b\u0107 systemu jest naruszona, przyk\u0142adowo wy\u0142\u0105czenie programu albo usuni\u0119cie wra\u017aliwych danych.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Prosty przyk\u0142ad zastosowania in\u017cynierii odwrotnej oprogramowania<\/strong><\/h2>\n\n\n\n<p>Praca z in\u017cynieri\u0105 odwrotn\u0105 cz\u0119sto wi\u0105\u017ce si\u0119 z analiz\u0105 kodu assemblera. Dobra znajomo\u015b\u0107 komend assemblera jest bardzo pomocna. Jednym z polece\u0144, na kt\u00f3re mo\u017cna si\u0119 natkn\u0105\u0107, pracuj\u0105c z kodem, s\u0105 instrukcje skoku takie jak&nbsp;<strong>jz (ang. jump if zero) czy&nbsp; jmp (ang. unconditional jump).&nbsp;<\/strong>Instrukcje te znajdziemy w kodzie sprawdzaj\u0105cym parzysto\u015b\u0107 liczb:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"632\" height=\"616\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/prosty_kod.png\" alt=\"kod\" class=\"wp-image-30312\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/prosty_kod.png 632w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/prosty_kod-300x292.png 300w\" sizes=\"(max-width: 632px) 100vw, 632px\" \/><figcaption class=\"wp-element-caption\">Rys. 5 Kod sprawdzaj\u0105cy parzysto\u015b\u0107 liczb<\/figcaption><\/figure>\n\n\n\n<p>Po skompilowaniu kodu, jego plik wykonawczy mo\u017cna otworzy\u0107 w programie wspomagaj\u0105cym prac\u0119 z in\u017cynieri\u0105 odwrotn\u0105, takim jak IDA Pro. IDA Pro analizuje kod binarny pliku wykonawczego i na jego podstawie przeprowadza deasemblacje (Rys. 6).<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-5.png\"><img decoding=\"async\" width=\"1024\" height=\"416\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-5-1024x416.png\" alt=\"Ryc. 5 Deasemblacja kodu w IDA Pro\" class=\"wp-image-21919\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-5-1024x416.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-5-300x122.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-5-768x312.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-5.png 1356w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Rys. 6 Deasemblacja kodu w IDA Pro<\/figcaption><\/figure>\n\n\n\n<p>Program po wywo\u0142aniu funkcji sprawdzaj\u0105cej isOddNumber(int) wykonuje skok do pami\u0119ci (jz), gdzie wy\u015bwietlana jest informacja, \u017ce liczba jest parzysta. Jest to skok warunkowy, kt\u00f3ry wywo\u0142ywany jest tylko je\u017celi funkcja isOddNumber(int) zwraca false. Mo\u017cliwe jest znalezienie lokalizacji, kt\u00f3ra odpowiada za skok warunkowy jest to adres 00001824 (Rys. 7).<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-6.png\"><img decoding=\"async\" width=\"810\" height=\"547\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-6.png\" alt=\"Ryc. 6 Lokalizacja miejsca w pami\u0119ci skoku warunkowego\" class=\"wp-image-21921\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-6.png 810w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-6-300x203.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-6-768x519.png 768w\" sizes=\"(max-width: 810px) 100vw, 810px\" \/><\/a><figcaption class=\"wp-element-caption\">Rys. 7 Lokalizacja miejsca w pami\u0119ci skoku warunkowego<\/figcaption><\/figure>\n\n\n\n<p>Plik wykonawczy programu mo\u017cna otworzy\u0107 w edytorze szesnastkowym takim jak Hex Editor Neo. Pod lokalizacj\u0105 00001824 znajdziemy, \u017ce instrukcja jz jest opisana szesnastkowo jako 74. Mo\u017cna instrukcj\u0119 jz zast\u0105pi\u0107 instrukcj\u0105 jmp, kt\u00f3ra jest opisana w kodzie szesnastkowym jako eb. Podmieniaj\u0105c instrukcj\u0119 jz na instrukcj\u0119 jmp (Rys. 8), zmieniana jest logika programu w taki spos\u00f3b, \u017ce zawsze wykonywany jest skok do cz\u0119\u015bci kodu wy\u015bwietlaj\u0105cego informacj\u0119, \u017ce liczba jest parzysta. Wynik wykonania programu przed i po modyfikacji pokazany jest na Rys. 9.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-7.png\"><img decoding=\"async\" width=\"591\" height=\"225\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-7.png\" alt=\"Ryc. 7 Podmiana instrukcji jz na jmp\" class=\"wp-image-21923\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-7.png 591w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-7-300x114.png 300w\" sizes=\"(max-width: 591px) 100vw, 591px\" \/><\/a><figcaption class=\"wp-element-caption\">Rys. 8 Podmiana instrukcji jz na jmp<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-8.png\"><img decoding=\"async\" width=\"713\" height=\"422\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-8.png\" alt=\"Ryc. 8 Wy\u015bwietlanie parzysto\u015bci przed i po modyfikacji\" class=\"wp-image-21925\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-8.png 713w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/05\/Ryc.-8-300x178.png 300w\" sizes=\"(max-width: 713px) 100vw, 713px\" \/><\/a><figcaption class=\"wp-element-caption\">Rys. 9 Wy\u015bwietlanie parzysto\u015bci przed i po modyfikacji<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/oferty-pracy\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"737\" height=\"170\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/02\/praca-m-3.jpg\" alt=\"oferty pracy\" class=\"wp-image-30371\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/02\/praca-m-3.jpg 737w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/02\/praca-m-3-300x69.jpg 300w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/a><\/figure>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuj\u0105 Ci\u0119 inne tematy z obszaru embedded, zach\u0119camy do <a href=\"https:\/\/sii.pl\/blog\/all\/embedded\/\" target=\"_blank\" rel=\"noopener\" title=\"\">lektury artyku\u0142\u00f3w naszych specjalist\u00f3w<\/a>. <\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Pierwsza publikacja artyku\u0142u: 29.06.2022<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;14059&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;15&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.9&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.9\\\/5 ( votes: 15)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;In\u017cynieria odwrotna \u2013 co to jest?&quot;,&quot;width&quot;:&quot;136.6&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 136.6px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.9\/5 ( votes: 15)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>In\u017cynieria odwrotna (ang. Reverse Engineering), czasami nazywana in\u017cynieri\u0105 wsteczn\u0105, to proces, w kt\u00f3rym produkty s\u0105 dekonstruowane w celu wyodr\u0119bnienia z &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/inzynieria-odwrotna-co-to-jest\/\">Continued<\/a><\/p>\n","protected":false},"author":372,"featured_media":14073,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[563,287,1289,1290,770],"class_list":["post-14059","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-embedded","tag-software-development","tag-inzynieria-odwrotna","tag-inzynieria-wsteczna","tag-programowanie"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/06\/Inzynieria-odwrotna.png","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/14059"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/372"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=14059"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/14059\/revisions"}],"predecessor-version":[{"id":30373,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/14059\/revisions\/30373"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/14073"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=14059"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=14059"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=14059"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}