Exe Packer
Un pachet este un instrument care vă permite să faceți mai dificilă analiza unui fișier executabil sau, pur și simplu, reducerea dimensiunii acestuia. Ambalatorii sunt adesea utilizați în versiuni limitate de produse comerciale pentru a preveni sau cel puțin a descuraja crearea fisurilor . Folosesc tehnici anti-depanare și anti-demontare din ce în ce mai avansate care, dacă nu sunt interpretate în mod corect de către depanator / dezasamblator, fac ca crackerul (sau inversorul în general) să piardă mult timp.
Structura
Un pachet, odată procesat un fișier executabil, produce un nou fișier executabil (denumit în mod obișnuit „pachet”) a cărui structură constă dintr-un „încărcător” polimorf (cel puțin în pachetele recent dezvoltate) flancat de o versiune modificată, de exemplu de mijloace de algoritmi criptografici, ai codului original. Încărcătorul, odată executat, va efectua apoi operațiile necesare pentru a restabili codul original și a-i da control.
Tehnici utilizate de ambalatori
Tehnicile folosite de ambalatori sunt multe și, cel puțin cele mai cunoscute, sunt detectate și gestionate corect de cele mai comune dezasamblatoare. În special, dezasamblatorii precum IDA pro sunt capabili să recunoască prezența unui ambalator și să permită dezasamblarea selectivă a codului (utilizatorul decide ce să dezasambleze și ce nu). Tehnicile pot fi împărțite în 2 macro categorii: tehnici anti-depanare și tehnici anti-demontare (deși uneori distincția nu este atât de clară). Tehnicile anti-depanare sunt tehnici menite să împiedice depanarea aplicației încercând, de exemplu, să detecteze dacă un depanare este în desfășurare. Tehnicile anti-demontare sunt tehnici menite să facă dezasamblatorul să piardă alinierea pentru a masca instrucțiunile mașinii care decurg din acest proces de decodare.
Cod Junk
Codul nedorit este o tehnică care constă în amestecarea datelor și a codului împreună. Această tehnică are scopul de a face dezasamblatorul să piardă alinierea, care va încerca să decodeze datele (și, prin urmare, nu instrucțiunile). Tehnica utilizată de cei mai avansați dezasamblatori este de a considera drept „date” tot ceea ce, pe parcursul programului, nu va fi executat niciodată (chiar dacă adesea nu este foarte ușor să-l determinăm a priori din cauza predicatelor opace ). Codul junk este ușor de identificat chiar și de o ființă umană, deoarece decodificarea acestuia produce de obicei:
- eroare, codul nu se potrivește cu niciun opcode. În acest caz, prezența codului junk este evidentă.
- instrucțiuni privilegiate, foarte neobișnuite pentru un program la nivel de utilizator.
- sare la porțiuni de cod care sunt vizibil în afara programului. Acest lucru se întâmplă dacă codul junk corespunde unei instrucțiuni de salt (condițional sau nu).
Codul nedorit poate fi folosit și în alte scopuri. De exemplu, luați în considerare această bucată de cod:
apel func1 DB ... jmp undeva ... func1: pop ebx inc ebx împinge ebx ret
În această bucată de cod func1 se numește func1 care mărește adresa de returnare a func1 pentru a vă asigura că „DB ...” nu este executat. Când analizați această bucată de cod cu un depanator, este ușor de văzut că trecerea funcției "func1" nu are efectul dorit: execuția continuă până la sfârșitul programului. Acest lucru se datorează faptului că cele mai frecvente instrumente de depanare, atunci când efectuează step-over-ul, stabilesc un punct de întrerupere imediat după apelul de funcție. În consecință, pentru un depanator, o funcție nu este terminată până când indicatorul de instrucțiuni nu indică instrucțiunea care urmează CALL (ceea ce nu se întâmplă niciodată când se utilizează această tehnică). În consecință, inversorul este forțat să intre în fiecare funcție.
Predicate opace
„Predicatele opace” sunt porțiuni de cod care returnează o valoare booleană predeterminată care, dintr-un anumit motiv, trebuie calculată în timpul rulării. Luați în considerare acest exemplu:
mov eax, 1 ... cmp eax, 1 je func1 jne undeva
Instrucțiunea „cmp eax, 1” va reveni întotdeauna adevărat, dar totuși valoarea sa trebuie calculată din când în când în timpul rulării. Această tehnică, coroborată cu cea a codului junk, poate fi suficientă pentru a confunda cei mai simpli dezasamblatori făcându-i să-și piardă alinierea (dezasamblatorul nu este capabil să prezică care „ramură” va fi executată și care nu).
Mașină virtuală
Această tehnică este cu siguranță una dintre cele mai dificil de gestionat. Acesta constă în simularea unui microprocesor (cu un set de instrucțiuni personalizat). Prin urmare, toate opcodurile prezente în program trebuie decodate de procesorul virtual și, la rândul său, de cel real. Deoarece este ușor de ghicit, această tehnică introduce o ușoară cheltuială (minimizată prin utilizarea instrucțiunilor de virtualizare, acolo unde există).
Entropie
Entropia poate fi utilizată pentru a determina dacă un fișier a fost supus unui proces de „împachetare”. Această abordare se bazează pe faptul că fișierele executabile în mod normal neambalate au o anumită natură sistematică a instrucțiunilor lor, în timp ce un fișier ambalat este prezentat în mod obișnuit ca un set de date aleatorii. Având în vedere acest lucru, este posibil să spunem că cu cât entropia unui fișier este mai aproape de zero, cu atât este mai probabil ca fișierul să nu fie ambalat. În acest fel este posibil să se stabilească a priori, înainte de orice comparație a așa-numitei „semnături” a fișierului, dacă acesta este ambalat.
Lista ambalatorilor
Pentru executabile în format Portable Executable (Windows):
- Plic HASP
- kkrunchy - Freeware
- MEW - dezvoltarea sa oprit
- NeoLite
- Obsidium
- PECompact
- PEPack
- PKLite32
- PELock
- PESpin
- Minion
- Privilege Shell
- RLPack
- Sentinel CodeCover (Sentinel Shell)
- Shrinker32
- Smart Packer Pro
- SmartKey GSS
- tElock
- Themida
- UniKey Enveloper
- Upack (software) - Freeware
- UPX - software gratuit
- VMProtect
- WWPack
- PackedApp Packer
- XComp / XPack - Freeware
Pentru un nou executabil (Windows):
- PackWin
- WinLite
- PKLite 2.01
Pentru executabile OS / 2 :
- NeLite
- LxLite
Pentru executabile DOS :
- 32LiTE
- 624
- AINEXE
- un pachet
- DIETĂ
- Plic HASP
- LGLZ
- LZEXE - Primul compresor executabil utilizat pe scară largă pentru microcomputere.
- PKLite
- PMWLITE
- UCEXE
- UPX
- WDOSX
- WWpack
- XE
Pentru executabile ELF :
- gzexe
- Plic HASP
- UPX
Pentru executabilele asamblării .NET :
- .NETZ
- NsPack
- Mpress
- Plic HASP
- .reducere
- dotBundle
- DotProtect : protector comercial / ambalator pentru.net și mono. Dispune de verificări on-line și „criptare standard din industrie”.
Pentru executabile Mach-o (Apple Mac OS X):
- Plic HASP
- UPX
Pentru executabilele Java JAR :
- Plic HASP
- pachet200
Pentru executabilele Java WAR :
- Plic HASP
linkuri externe
- Pachet open-source UPX , la upx.sourceforge.net .
- Ambalator comercial ASProtect , pe aspack.com .
- Depanator IDA Pro / dezasm comercial , la hex-rays.com .
- Depanator / dezasm gratuit OllyDBG , la ollydbg.de .