Pocítili jste někdy touhu rozebrat nějaký mechanismus, abyste zjistili, jak funguje? No, kdo ne. Tato touha je vůdčí silou reverzního inženýrství. Tato dovednost je užitečná při analýze zabezpečení produktu, zjišťování účelu podezřelého souboru .exe bez jeho spuštění, obnově ztracené dokumentace, vývoji nového řešení na základě staršího softwaru atd.

V tomto článku probereme základnu znalostí potřebných k provádění reverzního inženýrství, základní principy reverzního inženýrství části softwaru systému Windows, disassemblery a nástroje. Uvádíme také příklad reverzního inženýrství aplikace krok za krokem.

Napsal

Sergii Bratus,

koordinátor vývoje,

tým pro zabezpečení sítě

a

Anton Kukoba,

Security Research Leader

Obsah

Co je to softwarový reverz?

Co potřebujeme k reverznímu inženýrství

Teoretické znalosti. Proces reverzního inženýrství softwaru

Užitečné nástroje pro reverzní inženýrství softwaru systému Windows

Disassemblery

Sysinternaly systému Windows

Nástroje pro monitorování sítě

Debuggery

Reálné-příklad reverzního inženýrství softwaru ze života

Jak reverzně inženýrovat ovladač

Závěr

Co je reverzní inženýrství softwaru?

Reverzní inženýrství je proces odhalování principů, které stojí za hardwarem nebo softwarem, například jeho architektury a vnitřní struktury. Otázka, která řídí reverzní inženýrství, zní: Jak to funguje?“

Je zřejmé, že pokud máte k dispozici dokumentaci, celý proces je mnohem jednodušší. Často se však stává, že dokumentace není k dispozici a vy musíte najít jiný způsob, jak zjistit, jak daný software funguje.

Kdy můžete potřebovat reverzní inženýrství softwaru a jak vám to může pomoci?

V oblasti informatiky existuje mnoho způsobů využití reverzního inženýrství, například:

  • Výzkum síťových komunikačních protokolů
  • Nalezení algoritmů používaných v malwaru, jako jsou počítačové viry, trojské koně, ransomware atd.
  • Zkoumání formátu souborů používaných k ukládání jakýchkoli informací, například databází e-mailů a obrazů disků
  • Kontrolování schopnosti vlastního softwaru odolat reverznímu inženýrství
  • Zlepšování kompatibility softwaru s platformami a softwarem třetích stran
  • Používání nedokumentovaných funkcí platformy

Legálnost reverzního inženýrství závisí na jeho účelu a způsobu, jakým bude software používán. Všechny výše uvedené účely jsou zcela legitimní za předpokladu, že jste kopii softwaru získali legálně. Pokud však máte v úmyslu například reverzně zkonstruovat určitou funkci uzavřené aplikace a následně ji implementovat do jiné aplikace, pravděpodobně se dostanete do problémů.

Co se týče právní dokumentace, reverzní inženýrství je často zakázáno licenčními smlouvami s koncovými uživateli (EULA). Americký zákon Digital Millennium Copyright Act však uvádí, že reverzní inženýrství softwaru je legální, pokud je provedeno za účelem zlepšení kompatibility s jinými produkty.

Právní požadavky se v jednotlivých zemích liší, takže než začnete, věnujte čas jejich prozkoumání.

Nyní se podíváme, jak reverzní inženýrství softwaru provádět.

Co potřebujeme k reverznímu inženýrství?“

Chcete-li začít s reverzním inženýrstvím softwaru, potřebujete:

  1. znalosti v oboru, ve kterém chcete reverzní inženýrství použít
  2. nástroje, které vám umožní uplatnit vaše znalosti při pokusu o demontáž softwaru.

Uvažujme obecný příklad, který nesouvisí se softwarem. Řekněme, že máte hodinky a chcete zjistit, zda jsou mechanické, quartzové nebo automatické.

Znalost oboru znamená, že byste měli vědět, že existují tři typy hodinek. Kromě toho byste měli vědět, že pokud je v hodinkách baterie, je umístěna uvnitř hodinek a můžete ji vidět, pokud je otevřete. Měli byste mít také základní znalosti o vnitřní struktuře hodinek, jak vypadá baterie a jaké nástroje potřebujete k otevření pouzdra hodinek. Mít nástroje k uplatnění svých znalostí znamená, že musíte mít šroubovák nebo jiný specializovaný nástroj, který vám dá možnost hodinky otevřít.

Stejně jako reverzní inženýrství hodinek vyžaduje specifickou sadu dovedností a nástrojů, vyžaduje reverzní inženýrství softwaru své vlastní znalosti a nástroje specifické pro daný obor.

Teoretické znalosti. Proces reverzního inženýrství softwaru

Pro různé úlohy reverzního inženýrství softwaru potřebujete různé typy znalostí. Samozřejmě existují běžné znalosti, které vám pomohou při většině úloh reverzního inženýrství: znalosti běžných aplikačních struktur, programovacích jazyků, překladačů atd. Bez speciálních teoretických znalostí však nemůžete řešit specifické úlohy reverzního inženýrství.

Pokud…

Potřebujete znalosti o…

reverzního inženýrství libovolných síťových aplikací

principů meziprocesové komunikace, struktury sítí, spojení, síťových paketů atd.

reverzní kryptografické algoritmy

kryptografie a nejoblíbenější algoritmy používané v této oblasti

výzkumný soubor struktury

základní pojmy týkající se souborů a jak různé systémy nebo komponenty se soubory pracují

Speciální techniky mohou ušetřit mnoho času při reverzování speciálních typů softwaru. V případě interakce se soubory může vytvoření testu, který zapíše jedinečné hodnoty typu do souboru a zároveň zaznamená posuny a velikost dat do skutečného úložného souboru, pomoci najít společné vzory v posunech. To vám napoví o vnitřních strukturách těchto souborů.

Při zahájení procesu reverzního inženýrství vývojáři softwaru obvykle používají disassembler, aby našli algoritmy a logiku programu na místě. Existuje mnoho různých formátů spustitelných souborů, kompilátorů (které poskytují různé výstupy) a operačních systémů. Tato různorodost technologií vylučuje použití jedné jediné technologie pro reverzi všech typů softwaru.

K pochopení dekompilace kódu potřebujete určité znalosti jazyka assembleru, konvencí volání funkcí, struktury zásobníku, konceptu zásobníkových rámců atd.

Znalost výstupu assembleru pro různé vzorky kódu vám může pomoci při odhalování původní funkčnosti. Uvažujme několik příkladů pro platformu Windows x86.

Řekněme, že máme následující kód:

int count = 0;for (int i = 0; i < 10; ++i){count++;}std::cout << count;

Pokud tento kód zkompilujeme do spustitelného souboru, uvidíme v disassembleru toto:

004113DE loc_4113DE:004113DE mov eax, 004113E1 add eax, 1004113E4 mov , eax004113E7 loc_4113E7:004113E7 cmp , 0Ah004113EB jge short loc_4113F8004113ED mov eax, 004113F0 add eax, 1004113F3 mov , eax004113F6 jmp short loc_4113DE004113F8 loc_4113F8:004113F8 mov ecx, ds:004113FE push eax00411400 call ds:<<(int)00411404 xor eax, eax00411406 retn 

Jak vidíme, běžný cyklus se změnil na kód assembleru s porovnáváním a skoky. Všimněte si, že assemblerový kód nepoužívá běžný assemblerový cyklus s čítačem v registru ecx. Kromě toho jsou zde lokální proměnné označovány jako a odpovídajícím způsobem.

Podívejme se, co se stane, když tento kód zkompilujeme pomocí sestavení pro vydání:

00401000 main proc near00401000 mov ecx, ds:00401006 push 0Ah00401008 call ds:<<(int)0040100E xor eax, eax00401010 retn00401010 main endp

Tento kus kódu nevypadá jako předchozí. Je to způsobeno tím, jak byl kód optimalizován. Technicky vzato byla smyčka odstraněna, protože nedělá nic hodnotného kromě inkrementace proměnné count na 10. Optimalizátor se tedy rozhodl pouze zachovat konečnou hodnotu proměnné count a umístit ji přímo jako argument pro výstupní operátor count.

Překladače, které dnes používáme, jsou v optimalizaci kódu velmi dobré. Proto je při reverzním inženýrství lepší pochopit myšlenku kódu (principy kódu), než se snažit získat samotný původní kód. Pokud pochopíte myšlenku kódu, můžete si prostě napsat vlastní prototyp, který bude vyhovovat původní úloze.

Bude velmi užitečné vědět, jaký kód v assembleru získáte, pokud zkompilujete různé operátory, struktury a další konstrukce jazyka. Pochopení výsledného kódu assembleru je dobrý způsob, jak začít proces reverzního inženýrství v jazyce C++, ale nebudeme se zde zabývat jeho technickými detaily.

Užitečné nástroje pro reverzní inženýrství softwaru Windows

Několik nástrojů pro reverzní inženýrství, včetně ProcessMonitor a ProcessExplorer, jsme již popsali v našem výzkumu architektury aplikací. Tyto nástroje jsou pro reverzní inženýrství naprosto nepostradatelné.

V této části si projdeme nejoblíbenější disassemblery a několik dalších nástrojů, které používáme pro naše projekty reverzního inženýrství.

Podrobnější informace a příklady použití najdete v našem článku o nejlepších nástrojích pro reverzní inženýrství softwaru.

Disassemblery

Disassembler je program, který překládá spustitelný soubor do jazyka assembleru. Nejoblíbenější z nich je IDA Pro

IDA Pro

IDA Pro

IDA Pro je pohodlný a výkonný nástroj pro disassembler. Disponuje obrovským množstvím nástrojů, které umožňují rychlé rozebrání části softwaru. Dokáže zobrazit strom volání funkcí, analyzovat import a export spustitelného souboru a zobrazit informace o nich. Dokáže dokonce zobrazit kód v jazyce C. Také podporuje více architektur procesorů, takže je možné použít IDA Pro k reverznímu inženýrství kódu pro ARM, AVR, M68k a mnoho dalších architektur.

Radare

Radare

Disassembler Radare je alternativou k IDA. Má v podstatě všechny funkce IDA, aniž by byl tak robustní a stabilní. Je však zdarma a s otevřeným zdrojovým kódem. Samotný Radare je konzolový nástroj, ale má frontend Cutter, což z něj dělá skutečnou alternativu k IDA.

Windows Sysinternals

Utility Windows Sysinternals se obecně používají pro správu, diagnostiku, řešení problémů a monitorování prostředí Microsoft Windows. Jsou však vhodné i pro reverzní inženýrství softwaru systému Windows.

TCPView je síťový sniffer, který zobrazuje veškeré informace o paketech TCP/UDP ze všech procesů. Tento nástroj je užitečný pro reverzi síťových protokolů.

PortMon je monitor fyzických portů systému. Monitoruje sériové a paralelní porty a veškerý provoz, který jimi prochází.

WinObj zobrazuje všechny globální objekty v systému v hierarchické struktuře. Tento nástroj může být užitečný při reverzním inženýrství aplikací, které pracují se synchronizačními primitivy, jako jsou mutexy a semafory, a také při reverzním inženýrství ovladačů v režimu jádra.

Nástroje pro monitorování sítě

Wireshark

Wireshark

Wireshark je jeden z nejvýkonnějších snifferů sítě. Umožňuje nejen zachytávat síťový provoz, ale obsahuje také analyzátory různých síťových protokolů, počínaje opravdu nízkoúrovňovými, jako je Ethernet, TCP a IP, až po aplikačně specifické protokoly, jako jsou WebSockets a XMPP.

Fiddler

Fiddler

Fiddler je webový proxy server, který zaznamenává provoz z prohlížečů a umožňuje analyzovat požadavky HTTP/HTTPS. Na rozdíl od programu Wireshark zobrazuje relace HTTP namísto samostatných síťových paketů. Fiddler také umožňuje analyzovat komprimovaná data odeslaná prostřednictvím protokolu HTTP a analyzovat data JSON a XML při monitorování požadavků SOAP, REST a AJAX.

API Monitor

API Monitor

API Monitor je užitečný nástroj pro zjištění, která rozhraní API jsou aplikací volána a jaké chování aplikace od těchto rozhraní API očekává. Tento nástroj má výkonnou databázi a umožňuje zobrazit volání obrovského množství funkcí API nejen kernel32 a ntdll, ale také COM, spravovaného prostředí a dalších. Nástroj API Monitor také poskytuje pohodlné mechanismy filtrování.

Ladicí programy

Ladicí program je pro každého vývojáře neocenitelný, aby viděl, co program právě dělá. Při zpětném ladění aplikací získáte stejný užitek jako při ladění živých aplikací.

Nejoblíbenější debuggery jsou OllyDbg, WinDbg a Windbg Preview.

OllyDbg

OllyDBG

OllyDbg (a jeho nástupce x64dbg) je pravděpodobně nejlepší debugger, pokud jde o reverzní inženýrství softwaru. Byl vyvinut speciálně pro potřeby reverzace a má všechny nástroje potřebné k tomuto účelu:

  • vybavený disassembler se schopností analyzovat a identifikovat klíčové datové struktury
  • funkce analýzy importu a exportu
  • vybavený assembler a patchovací engine

Schopnost analyzovat funkce API a jejich parametry usnadňuje reverzní interakce se systémem. Zobrazení zásobníku poskytuje mnoho informací o zásobníku volání. Další důležitou výhodou je, že OllyDbg můžete použít u aplikací chráněných proti ladění, kdy běžné ladicí programy prostě nic nezmůžou.

WinDbg

Windbg

Přes své jednoduché rozhraní má WinDbg výkonné nástroje pro ladění. Má vestavěný disassembler, různé příkazy, které umožňují zjistit téměř vše o laděném procesu/systému, a možnost ladění v režimu jádra, což je asi nejcennější funkce. Je to velká výhoda pro reverzní ovladače, zejména ovladače v režimu jádra.

Windbg Preview

Windbg Preview

Windbg Preview je nová verze Windbg vyvinutá společností Microsoft. Je distribuována pouze prostřednictvím obchodu Windows Store. Má všechny funkce klasického Windbg ve spojení s novým uživatelským rozhraním a několika novými funkcemi. Jednou z těchto nových funkcí je ladění cestováním v čase, které umožňuje zaznamenat určitý časový úsek provádění programu a poté jej přehrát tolikrát, kolikrát potřebujete. Tímto způsobem můžete spouštět zajímavé části kódu krokováním, aniž byste se museli bát, že omylem spustíte nějaký kód a ztratíte kontext nebo všechna data.

Přečtěte si také:

Přečtěte si také:

:
9 nejlepších nástrojů pro reverzní inženýrství pro rok 2018

Reálný příklad reverzního inženýrství softwaru

Nyní si ukážeme příklad reverzního inženýrství softwaru. Představme si, že máte podezřelý spustitelný soubor. Potřebujete zjistit, co tento program dělá a zda je pro uživatele bezpečný.

Vzhledem k tomuto scénáři je dobré nespouštět tento spustitelný soubor na pracovním počítači, ale použít místo toho virtuální počítač. Spusťme aplikaci v našem virtuálním počítači.

Proces vytváří službu

Jak vidíme, tento soubor vytváří službu systému Windows s názvem TestDriver. Má typ kernel, takže víme, že se jedná o ovladač. Odkud ale bere soubor ovladače, aby mohl běžet? To můžeme zjistit pomocí nástroje ProcessMonitor ze sady Sysinternals Suite. Když otevřeme ProcessMonitor, můžeme nastavit filtry, které nám zobrazí pouze aktivitu souborů z procesu, který nás zajímá. Jeho protokol aktivity vypadá takto:

Informace o souboruMon

Soubor ovladače je vytvořen procesem, který obracíme, a tento proces tento soubor umístí do dočasného adresáře uživatele. Soubor není třeba v dočasném adresáři hledat, protože vidíme, že proces jej hned po použití odstraní. Co tedy proces s tímto souborem udělá? Pokud soubor rozbalí, můžeme se ho pokusit najít v sekci zdrojů procesu, protože to je běžné místo pro ukládání takových dat. Podívejme se tam. Ke zkoumání zdrojů použijeme další nástroj – Resource Hacker. Spusťme jej:

Zkoumejte zdroje pomocí nástroje Resource Hacker

Bingo! Jak vidíme z obsahu nalezených prostředků, jedná se pravděpodobně o spustitelný soubor systému Windows, protože začíná signaturou MZ a má řetězec „Tento program nelze spustit v režimu DOS“. Zkontrolujme, zda se jedná o náš soubor ovladače. Za tímto účelem rozbalíme prostředek pomocí nástroje Resource Hacker a otevřeme jej v disassembleru.

Okno disassembleru

Jak víme, DriverEntry je vstupní bod pro ovladače v režimu jádra v systémech Windows. Můžeme pokračovat ve výzkumu, protože to vypadá, že jsme našli správný ovladač.

Jak zpětně analyzovat ovladač

Pro zahájení zpětného analyzování ovladače zkoumáme postupně funkce, které jsou volány z DriverEntry. Když přejdeme na sub_14005, nenajdeme nic zajímavého, takže pokračujeme sub_110F0 a najdeme tento kód:

Kus kódu 1

Kus kódu 2

Kus kódu 3

Kus kódu 4

Některé řádky jsou zde pro zjednodušení vynechány.

V prvním výpisu je vytvořen unicode řetězec, který ukazuje na cestu C:\hello.txt. Poté je struktura OBJECT_ATTRIBUTES naplněna běžnými hodnotami; víme, že tato struktura je často potřeba při volání funkcí, jako je ZwCreateFile.

V druhém výpisu vidíme, že je skutečně volána funkce ZwCreateFile, což nám dává celkem jistotu, že ovladač vytvoří soubor – a my víme, kde se tento soubor po vytvoření nachází.

Ze třetího a čtvrtého výpisu vidíme, že ovladač vezme unicode řetězec a zapíše ho do bufferu (to se stane ve funkci sub_11150) a buffer bude zapsán do souboru pomocí funkce ZwWriteFile. Na závěr ovladač soubor uzavře pomocí API ZwClose.

Shrňme si to. Zjistili jsme, že původní program vytáhne soubor ovladače ze svých zdrojů, umístí jej do složky temp aktuálního uživatele, vytvoří službu Windows pro tento ovladač a spustí ji. Poté se program zastaví a odstraní službu i původní soubor ovladače z dočasného adresáře. Z tohoto chování a z analýzy disassembleru vyplývá, že ovladač nedělá nic jiného, než že na disku C vytvoří soubor s názvem hello.txt a zapíše do něj řetězec „Hello from driver“.

Nyní je třeba ověřit, zda máme pravdu. Spustíme program a zkontrolujeme disk C:

Obrázek aplikace

Nádhera! Provedli jsme reverzní inženýrství tohoto jednoduchého programu a nyní víme, že je bezpečné jej používat.

Tohoto výsledku jsme mohli dosáhnout mnoha různými způsoby – pomocí ladění nebo API Mon, psaním testů atd. Můžete si najít vlastní způsoby reverzního inženýrství softwaru, které vám budou vyhovovat.

Závěr

Reverzní inženýrství softwaru pro systém Windows vyžaduje solidní vzdělání a zkušenosti s programováním. Abyste mohli provádět reverzní inženýrství, musíte kombinovat dovednosti v oblasti disassemblingu, monitorování sítě, ladění, integrace API, několika programovacích jazyků, kompilátorů atd. Při reverzi softwaru musíte být také velmi opatrní, abyste neporušili autorská práva nebo nepoškodili systém.

V Aprioritu máme zkušený tým reverzních inženýrů. Pokud chcete využít dovednosti reverzního inženýrství pro svůj projekt, neváhejte nás kontaktovat!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.