× Aktuálně z oboru

SHIELD Experience Upgrade 7 – méně hledání a více zábavy [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]
Celá zprávička [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]

Cracking – 5. část

[ http://programujte.com/profil/3632-michal-blazek/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/20356-michal-zima/ ]Google [ ?rel=author ]       19. 11. 2006       24 601×

  • 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 [ http://mujweb.cz/www/dosms/crhak.htm ]) 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 [ /clanek/2006091801 ]) 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 [ http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/ ].

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 [ http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/PEiD-updated.shtml ]. 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 [ http://mujweb.cz/www/dosms/crhak.htm ].

Velký výběr nástrojů pro práci s PE souborovým formátem naleznete také ZDE [ http://t4c.ic.cz/tools.html ].

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.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2006102203-cracking-5-cast/ ].