![](img/tr.png)
- Tabulka sekcí
- Tabulka importů
- Test PE šifrérů/kompresorů
- Dumpery (ProcDump)
Dnes budeme pokračovat v PE souborovém formátu, povíme si něco o tabulce sekcí a tabulce importů. Po těchto základech PE se vrhneme do testu PE šifrérů/kompresorů a seznámím vás s programem ProcDump.
Tabulka sekcí
Otevřte program PEditor, tlačítkem browse
otevřte libovolný program (program time.exe, na kterém budu vše demonstrovat, si můžete stáhnout ZDE) a zvolte volbu section
. Tím se otevře tabulka sekcí (Section table
).
Section
V minulé části jste se dozvěděli, že sekce jsou logické celky dat (pro upřesnění musím dodat, že existují případy, kdy to tak není, ale tím se zatím nebudu zabývat). V tomto případě jsou sekce: .text, .rdata, .data, .rsrc. Pokud byste chtěli zjistit základní informace o sekcích a neměli byste zrovna po ruce PE editor nebo debugger (většina již dokáže i základy práce s PE souborovým formátem) můžete ke zjištění počtu sekcí použít i obyčejný notepad. Otevřte tedy v notepadu program time.exe a všimněte si několika klíčových slovíček (názvů sekcí).
MZ ˙˙ ¸ @ Č ş ´
Í!¸LÍ!This program cannot be run in DOS mode.$
ă’r§ó{!§ó{!§ó{!)ěh!¬ó{![Ói!¦ó{!`ő}!¦ó{!Rich§ó{!
PE L E ŕ @
P
< @
text z `.rdata î
@ @.data t 0 @ Ŕ .rsrc @
@ @
atd.
Určitě jste si všimli i dalších věcí. Třeba písmen MZ (DOS MZ hlavička), věty „This program cannot be run in DOS mode.“ (Úsek pro DOS), poté písmen PE (Portable Executable – struktura Signature) atd. Pro tento účel můžete samozřejmě použít libovolný HEX editor (uživatelům GNU/Linuxu poslouží příkaz xxd
).
Virtual Size, Raw Size
Slovo Virtual označuje, že se jedná o informace určující umístění v operační paměti, a slovo Raw určuje umístění v souboru. Konkrétně Virtual Size je velikost sekce v operační paměti. Raw Size (někdy také SizeOfRawData) je velikost sekce v souboru na pevném disku.
Virtual Offset, Raw Offset
Struktura ImageBase (viz minulá část) určuje tzv. preferovanou nahrávací adresu. Ta je u spustitelných souborů obvykle 00400000h. Pokud ale otevřete program time.exe v OllyDbg, nebude první instrukce na adrese 00400000h, ale na 00401000h, takže tuto adresu získám součtem ImageBase + Virtual Offset sekce .text
. Problém může nastat, pokud je tato adresa již obsazena (Windows je multitaskingový operační systém, takže i s tím se musí počítat). Řešením je relokace, ale ta přesahuje odbornost tohoto seriálu (možná někdy v budoucnu). Raw Offset je umístění sekce v souboru. Tam je situace o dost jednodušší, protože tam žádná relokace nehrozí. Jediné, co vás možná zarazilo, je, že v položkách Raw Size a Raw Offset se vyskytují pouze sudá čísla a pouze stovky. To je určeno strukturou File Alignment, která má v tomto případě velikost 00000200h. Takže i kdyby sekce měla pouze 1 instrukci, tak by pro ni také platilo toto zarovnání. Poté je zde ještě struktura Section Alignment, která určuje zarovnání sekcí v operační paměti (položka Virtual Offset). Zde je nastavena na 00001000h.
Charakteristics
Popisuje charakteristiku dat v sekci – např.: pouze pro čtení, čtení a zápis, spustitelný kód atd.
Tabulka importů
Tabulka importů (chcete-li tabulka importovaných funkcí) je jedním ze základů architektury Win32 platforem. Importované funkce jsou takové, které jsou PE-souborem volány, ale on sám je neobsahuje. Tyto funkce (API funkce) jsou v DLL knihovnách. Těch jsou ve Windows stovky (zkuste Start → Hledat → *.dll). Troufám si tvrdit, že v každém programu naleznete importované funkce z knihoven kernel32.dll a user32.dll. V souboru musí být tyto funkce také někde zaznamenány a k tomu je tabulka importů. Pokud si ji chcete prohlédnout, můžete použít program Exescope, debugger nebo znovu notepad. V něm vypadá situace následovně:
...
Ě ľ ® – Š | l ˘ \ ŕ
Ě ľ ® – Š | ťMessageBoxA bwsprintfA „LoadIconA
user32.dll RGetTickCount € ExitProcess GetModuleHandleA
kernel32.dll
...
Zde hned vidíte, jaké API funkce jsem použil a z jakých knihoven jsem je importoval. Z user32.dll
jsem importoval: MessageBoxA, wsprintfA, LoadIconA a z kernel32.dll
GetTickCount, ExitProcess a GetModuleHandleA.
time.exe
Abyste si dokázali věci z této části lépe v hlavě utřídit, tak přidávám ještě zdrojový kód primitivního prográmku time.exe, na kterém jsem vše demonstroval. Time.exe po spuštění pouze pomocí API fukce MessageBoxA zobrazí aktuální čas běhu systému a po stisku OK
se ukončí.
.586P
.MODEL FLAT, stdcall
;---------------------------------------
; konstanty
MB_ICONQUESTION EQU 20h
;---------------------------------------
; deklarace externích funkcí
EXTERN GetTickCount@0:NEAR
EXTERN MessageBoxA@16:NEAR
EXTERN wsprintfA:NEAR
EXTERN ExitProcess@4:NEAR
EXTERN GetModuleHandleA@4:NEAR
EXTERN LoadIconA@8:NEAR
;---------------------------------------
; direktivy pro připojení knihoven
INCLUDELIB C:\MASM32\LIB\USER32.LIB
INCLUDELIB C:\MASM32\LIB\KERNEL32.LIB
;---------------------------------------
; segment s daty
_DATA SEGMENT
TITULEK DB "TIME 1.01 – Michal Blažek", 0
FORM DB "Čas běhu systému je: %u minut", 0
BUF DB 60 dup(?)
_DATA ENDS
;---------------------------------------
; segment s kódem
_TEXT SEGMENT
START:
;---------------------------------------
; získání handlu instance programu
PUSH 0
CALL GetModuleHandleA@4
;---------------------------------------
PUSH 9
PUSH EAX
CALL LoadIconA@8
;---------------------------------------
; získání aktuálního běhu systému v ms
; hodnota bude vrácena v EAX
CALL GetTickCount@0
;---------------------------------------
; převedení času z ms na minuty
XOR EDX, EDX
MOV EBX, 1000
DIV EBX ; nyní je čas v s
XOR EBX, EBX
XOR EDX, EDX
MOV EBX, 60
DIV EBX ; nyní je čas v min
;---------------------------------------
; vyplnění bufferu
PUSH EAX
PUSH OFFSET FORM
PUSH OFFSET BUF
CALL wsprintfA
;---------------------------------------
; vyčištění zásobníku
ADD ESP, 12 ; vyčištění zásobníku
;---------------------------------------
; vypsání času běhu systému na obrazovku
PUSH MB_ICONQUESTION
PUSH OFFSET TITULEK
PUSH OFFSET BUF
PUSH 0
CALL MessageBoxA@16
;---------------------------------------
; ukončení aplikace
PUSH 0
CALL ExitProcess@4
_TEXT ENDS
END START
Test PE šifrérů/kompresorů
Když jsem tento test plánoval, tak jsem si to představoval, jak se říká, „jako Hurvínek válku“. Chtěl jsem vyzkoušet všechny PE šifréry/kompresory, všechny je překonat a všechno podrobně sepsat. Ačkoliv bych to asi neměl říkat, tak jsem ve svém plánu žalostně zklamal. Bylo to těžší, než jsem myslel, časově dost náročné a je takový počet PE šifrérů/kompresorů, že bych to nedokázal do smrti. Proto jsem se rozhodl zrecenzovat jenom čtyři PE šifréry/kompresory, které velice dobře znám. Všechny tyto PE šifréry/kompresory si můžete stáhnout ze www.softpedia.com.
ASPack 2.12
ASPack patří do skupiny PE šifrérů/kompresorů, které spíše než chrání aplikaci před crackery, zmenšují jeho velikost. ASPack dokáže při maximální kompresi redukovat velikost spustitelných souborů až na 70 %, což je lepší než zip komprese. Toto celkem rapidní zmenšení velikosti ovšem program téměř vůbec nezpomalí, což je u podobných programů docela rarita. Dekodovací rutina obsahuje pouze jeden pořádný anti-debugový trik a ostatní jsou tam spíše jen pro okrasu. Ten „zázrak“ je ochrana před nahráním programu do Symbol Loaderu Soft-Ice, ale tato ochrana se dá velice snadno zlomit vložením instrukce INT 3h
na začátek programu a nastavavení breakpointu na toto přerušení, poté se program zastaví na začátku a můžete začít zkoumat. Dekompresní rutina obsahuje také několik skoků na zmatení crackera (pasivní SMC).
PE Compact 2.78
PE Compact považuji za jeden z nejlepších PE šifrérů/kompresorů. Program je celý naprogramován v Assembleru (můj neoblíbenější programovací jazyk) a obsahuje velice širokou paletu pluginů. Velice užitečná je rozsáhlá paleta kompresních knihoven, kterou si můžete vyvolat volbami Settings of selected → odtržením Let PECompact Choose → Select CODEC(s) to use → nyní si vyberte v nabídce v levém horním rohu → ADD
. Každá knihovna má své klady a zápory. V PE Compact si opravdu můžete nastavit vše a popis všech možností by vyšel na samostatný seriál. Proto vás odkazuji na dokumentaci k programu, ve které naleznete dost užitečných informací, včetně popisu jednotlivých kompresních knihoven. Další plus připisuji programu PE Compact za ohleduplnost k uživatelům operačního systému GNU/Linux, kteří musí programy pro Windows spouštět v emulátorech. Velké množství PE šifrérů/kompresorů na to ohledy nebere, a občas se stane, že nejde výsledný soubor spustit. Pokud budete používat PE Compact nemusíte se takovýchto problémů obávat.
UPX 2.01
UPX patří společně s ASPackem mezi absolutní špičku mezi PE kompresory. Narozdíl od ASPacku, UPX podporuje množství odlišných spustitelných souborů zahrnujících programy pro Windows 95/98/ME/NT/2000/XP, DLL knihovny, DOS programy a spustitelné programy pro Linux. Co se týká komprese, řadí se UPX na druhé místo právě za ASPack. Bohužel UPX dokáže sebou zkomprimované soubory i dekomprimovat, což bych označil jako jeho největší slabost (stačí přidat parametr -d
). Budete-li chtít, můžete po zkomprimování modifikovat některou z položek v PE hlavičce tak, aby si UPX myslel, že se nejedná o win32 spustitelný soubor a zároveň to nezpůsobilo nefunkčnost programu. Bohužel je jednoduché se s tímto vypořádat, takže ani nebudu uvádět příklad. Možná vás teď napadá, jak je na tom UPX s anti-debugovými triky. Odpověď zní: „černě“. Obsahuje jenom několik náznaků, u kterých si nejsem jistý, jestli se opravdu jedná o anti-debugové triky. Popis parametrů naleznete v souboru upx.html nebo upx.doc.
PE Lock 1.6
Přestože je program staršího data, má stále co nabídnout. Program je kompromisem mezi PE šifrérem a PE kompresorem. Obsahuje velice užitečné funkce proti debugingu, dumperům, ochranu heslem a další užitečné volby, které jistě oceníte. PE Lock dokáže redukovat velikost souboru až o 30 %, což je na program, který ještě k tomu má uspokojivou ochranu proti crackerům, docela dobré.
Další, co stojí za vyzkoušení
- NSPack
- BitCrypt
- PE-Shield
- Petite
- Shrinker
- WWPACK32
Pozn.: V tomto testu jsem se nezabýval komerčními ochranami.
Jak zjistit, jakým programem je soubor zašifrován?
Můžete samozřejmě začít zkoumat tabulku sekcí, PE hlavičku, programový kód apod. a určitě tam naleznete odpověď, ale proč si dělat situaci složitější, když si můžete stáhnout pro tento úkol program? Jedním z nich je třeba PEiD, který si můžete stáhnout na této stránce. Ovládání je intuitivní až primitivní, protože stačí vybrat program a ihned se vám zobrazí odpověď.
Dumpery
Dumpingem je označováno ukládání obsahu operační paměti na disk. To je velice užitečné, protože programy chráněné PE šifréry/kompresory se musejí při spuštění dekomprimovat a v dekomprimované podobě se ukládají do operační paměti. Dumperů je velký výběr, ale mezi nejlepší patří SoftDump, LordPE, IceDump a ProcDump, který budu používat já. ProcDump má proti ostatním tu výhodu, že je to i PE dešifrér/dekompresor. Říci, že ProcDump dokáže zašifrované soubory převést zpět do stavu před zašifrováním by nebylo správné, protože ProcDump většinou pouze odstraní nebo poškodí ochrany proti crackerům a soubor pouze přiblíží stavu před zašifrováním (nejeden cracker by měl chuť mě teď zabít, ale pro naše účely toto vysvětlení stačí ;)). Problémem je, že ve většině případů se po dumpingu nebo dešifrování poškodí tabulka importů. Ta se poté musí zrekonstruovat např. programem ImportREC. Dešifrování provedete volbou Unpack a poté výběrem PE šifréru/kompresoru, kterým je program zašifrován. Můžete také ponechat označenou výchozí položku *Unknown*
a ProcDump se pokusí sám zjistit použitý PE šifrér/kompresor, ale bohužel velice často neuspěje a zahlásí chybu, takže doporučuji nejdříve zjistit použitý PE šifrér/kompresor, a poté ho zvolit. ProcDump nabízí možnost ochrany i zkoumat. V adresáři, kde je uložen ProcDump, se nachází soubor script.ini, kde má ProcDump uložen v podobě vlastních příkazů postup deširování. Popis příkazů použitých v souboru script.ini naleznete v souboru script.txt. ProcDump si můžete stáhnout na této stránce.
Velký výběr nástrojů pro práci s PE souborovým formátem naleznete také ZDE.
Dnes jsme dobrali základ, který každý cracker musí bezpodmínečně umět. Na těchto základech můžete nyní stavět a učit se dál třeba z internetu. Příště zkusíme překonat několik crackme a povíme si něco o Markových pravidlech ochrany softwaru, které, i když jsou staršího data, mají nadčasovou platnost.