Aktivní SMC - 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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Ve kterém roce se narodil autor fotografií z výstavy "Ostravská periferie"?

V dnešní soutěži hrajeme o:



Assembler

Aktivní SMC

24. srpna 2001, 00.00 | Pokračování povídání o SMC - tentokrát jeho aktivní podobě. Ke článku je samozřejmě přiložena i praktická ukázka.

Jedním z mých nejoblíbenějších způsobů, jak zabránit nejenom disassemblování, je plně dynamické generování programového kódu.
Možná to bude znít trochu nereálně, ale čistá teorie praví, že právě s využitím aktivního SMC se dá vytvořit částečně "neprolomitelná" ochrana. 

Ne nesmějte se, vysvětlím to na praktické ukázce. Představte si, že program pomocí zadaného sériového čísla (hesla..) teprve rozšifruje další kód - třeba celou funkci pro obsluhu správně zadaného hesla. Pokud je tedy tento kód dostatečně dobře zašifrován a je zvolena náležitá délka klíče, je pak bezpečnost vašeho programu přímo úměrná bezpečnosti samotného šifrovacího algoritmu. Například při použití algoritmu RSA a klíče o délce 1024, bude váš program dostatečně chráněn i před vládními organizacemi - tedy pokud nebude dosaženo zásadních pokroků v řešení úlohy faktorizace (nebo nebude-li nalezen nějaký jiný postup).
Ale má to jeden obrovský háček - toto všechno bude platit jen do té doby, než vydáte první platné sériové číslo či heslo. I když je to paradoxní, je v tomto případě vaším největším nepřítelem legální uživatel vašeho programu - ten může správné číslo dát svému kamarádovi crackerovi nebo si přímo on zaregistruje váš program. Dostane tak data v dekódované podobě a vše je ztraceno - během několika minut pracuje program i se špatnými sériovými čísli.

Dost však bylo teorie - jak tedy vložit SMC kód do programu?

Základem je volání API funkce VirtualProtect, která změní přístupová práva (PAGE_READWRITE - čtení i zápis) v určité paměťové oblasti - v našem případě do oblasti, kde je načten spustitelný kód programu. Pak už jen patřičná místa přepíšeme požadovanými hodnotami. 
A pokud se vám nechce nebo nemůžete přepisovat paměť programu, bez jakýchkoli okolků můžete alokovat paměť novou - třeba funkcí GlobalAlloc a tam následně přesměrovat tok dat.
Jak vidíte, možnosti jsou opravdu neomezené. Člověk by ani nevěřil, jak neuvěřitelných výsledků může dosáhnou s tak jednoduchou konstrukcí.

Podívejte se na následující ukázku:

/****** Compilujte jako DEBUG verzi, jinak bude kód optimalizován => bude odstraněn celý cyklus if ******/

DWORD LastProtect, Adresa; 
BYTE *Prepis = new BYTE;
BOOL A=TRUE; 

VirtualProtect((VOID*)0x401000,0x1000,PAGE_READWRITE,&LastProtect);
*Prepis = 0x75;
__asm
{
    mov Adresa, offset SMChere
}
memcpy((VOID*)(Adresa+4),Prepis,sizeof BYTE);

SMChere:
if (A)
{
    MessageBox("SMC neaktivní",NULL,MB_OK);
}
else
{
    MessageBox("SMC aktivní",NULL,MB_OK);
    *Prepis = 0x74;
    memcpy((VOID*)(Adresa+4),Prepis,sizeof BYTE);
}

delete Prepis;

Kdyby výše zmiňovaná ukázka začínala až příkazem if, zcela logicky by se zobrazila hláška: "SMC neaktivní".
Nejdříve se však zavolá funkce VirtualProtect, která umožní patřičný přístup do paměti programu, která obsahuje spustitelný kód. Hodnoty parametrů této funkce, by se měli obecně zjistit z PE hlavičky souboru, ale pro tento ukázkový příklad bohatě stačí pevně nastavené hodnoty. Následně je obrácena logika cyklu if - příkaz memcpy přepíše patřičný bajt.
A výsledkem je hláška "SMC aktivní". Potom se ještě opraví logika cyklu do původní podoby. 

Tento velice jednoduchý příklad pouze demonstruje opravdovou sílu SMC. Jako vždy záleží jen na vás, jak hluboko sáhnete do své mysli a kolik času věnujete návrhu programového kódu.

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: