Anti-disassembling - základy - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Assembler

Anti-disassembling - základy

30. července 2001, 00.00 | Několik slov o základních technikách proti statickému rozkladu na assembler - tzv. disassemblingu.

V některém z prvních dílů tohoto seriálu jsme si řekli, že na začátku téměř každého úspěšného snažení crackera je rozklad programu na assembler. Také jsme si řekli, že toto rozložení může být buďto statické nebo dynamické. Až do teď jsme se věnovali tomu dynamické a tak nadešel čas, podívat se na zoubek druhé zmiňované technice - tzv.disassemblingu. I když se anti-disassembling v mnohém prolíná a doplňuje s jinými anti-cracking technikami a jeho použití není tak exaktní jako anti-debugging, budeme dále uvedené možnosti označovat jako anti-disasemblingové. Není proto vyloučeno, že nějaká anti-disassembligová technika vlastně stěžuje i jiné crackerské techniky a naopak. 
Vzhledem k tomu, že k rozložení na assembler při disassemblingu není třeba, aby byl program (soubor..) spuštěn, jak je tomu u debuggingu, nemůže se této technice nějak aktivně bránit. Může však obsahovat instrukce, které by compiler nikdy sám nevygeneroval a tak velice ztížit či dokonce znemožnit použití disassembleru. Mezi ty nejpoužívanější patří dnes již velice známá IDA a Win32Dasm. Ve svém vývoji se však již značně zdokonalily a naučily se obcházet mnoho druhů nejrůznějších anti-disassemblovacích algoritmů (hlavně IDA). Naše snaha se proto zaměří spíše na co možná největší "znepřehlednění" samotného kódu než na tvorbu algoritmů, které by znemožnily využití disassembleru .
Jednou z největších a také nejpoužívanějších zbraní proti disassemblingu je SMC neboli SELF MODIFYING CODE. Abych lépe vysvětlil o co jde, dovolím si rozdělit jeho použití na aktivní a pasivní. Aktivní SMC využívá plně dynamického generování kódu za běhu programu. Kód se tedy generuje RUN-TIME - a jak chcete disassemblovat něco, co v programu není (nebudu vás napínat-nejde to:-)))?? Naproti tomu pasivní SMC využívá mnohotvárnosti vyjádření instrukcí v assembleru. Podívejte se na následující ukázku:

00401000: EB01               JMP 00401003
00401002: 68E9xxxxxxxx PUSH xxxxxxxx

Jistě jste si všimli něčeho velice zvláštního - hned první instrukce JMP skáče kamsi doprostřed té druhé!?!? Je tak přeskočen jeden bajt na adrese 00401002. Kód tedy po skoku ve skutečnosti vypadá takto :

00401000: EB01           JMP 00401003
00401002: 68                // tato špatná instrukce se přeskočí
00401003: E9xxxxxxxx JMP xxxxxxxx

Toto byl jen velice jednoduchý příklad, jistě jste ale pochopili o co jde. Compiler by nikdy takovýto kód nevygeneroval.

Následující kód jste již určitě viděli v mnoha aplikacích:

MOV EAX,xxxxxxxx
PUSH EAX
RET 

Určitě se nedá označit jako SMC, ale ve skutečnosti je ekvivalentem kódu JMP xxxxxxxx nebo chcete-li JMP EAX. 
Pokud zvolíte k výpočtu adresy, na kterou chcete skočit nějaký složitější matematický postup, můžete dosáhnout zcela neuvěřitelných výsledků (nebylo to poprvé, co jsem nepochopil svůj vlastní programový kód:-)).
Toto bylo jen velice stručné seznámení s obecnými základy anti-disassembling technik. V příštích dílech se budeme daným tématům věnovat podrobněji.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Assembler  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: