Ochrana před debuggingem - 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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Jak se jmenuje výstava fotografií od fotografa Sebastião Salgada?

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



Assembler

Ochrana před debuggingem - základy

22. května 2001, 00.00 | Úvod do problematiky anti-debuggingu a první velice jednoduché algoritmy. O co jsou tyto algoritmy primitivnější, o to by mohly být účinější..

Základem téměř každého crackerského úsilí je rozložení programu na assembler. Buďto statické (disassembling) nebo dynamické (debugging). V dnešním díle si ukážeme, jak se bránit druhé uváděné možnosti - tedy dynamickému rozkladu na assembler neboli debuggingu. Rád bych ale upozornil na fakt, že ochrana před jakýmkoli způsobem rozkladu na assembler by měla být považována spíše za pomocnou, nikoliv však hlavní část ochranných metod softwaru. Řada profesionálů tvrdí (a má pravdu), že místo nad tvořením anti-debuggingových procedur by se měl programátor zamyslet spíše nad návrhem samotného ochranného systému. Nikdy nespoléhejte jen na anti-debuggingové finty vašeho programu!!! 
Vzhledem k tomu, že anti-debugging je kapitolou sám pro sebe, bude se mu věnovat nejen tento, ale také několik příštích dílů našeho seriálu. V dnešním díle si ukážeme pouze některé velice jednoduché, ale překvapivě účinné metody detekce debuggeru a v díle příštím již poněkud složitější a specializovanější způsoby s využitím assembleru.
Před chvílí jsem uvedl, že se naučíme nějaké anti-debuggingové postupy, což ovšem není tak zcela přesné. Přesněji řečeno to budou anti-SoftIce postupy. Asi je na čase to vysvětlit. Když před mnoha lety, tehdy ještě neznámá a maličká firma Numega vydala svůj debugger s názvem SoftIce, nikdo ještě netušil, co tím způsobila. Za několik let na světovém softwarovém trhu si vydobyl SoftIce tak silnou a neotřesitelnou pozici, že už je dnes snad jedinou volbou při zakoupení debuggeru. Díky svým úžasným možnostem při práci se softwarem si ho oblíbili zejména crackeři a nejrůznější beta-testeři. Troufnul bych si říci, že ho využívá 99,9% všech crackerů na celém světě a to zcela bez nadsázky. Ve všech crackerských materiálech a materiálech k assembleru je vždy uváděn jen tento a žádný jiný debugger. A v tom je právě kámen úrazu většiny návrhářů softwarových ochran. Místo toho, aby se bránili specifickému debuggeru a využili k tomu všech jeho vlastností, dávají raději přednost velmi dobře známým, obecným způsobům ochrany proti všem debuggerům - ty jsou však znatelně slabší. My ovšem tuto chybu neuděláme. 

Ale teď již k našemu cíli - jak tedy detekovat SoftIce??

První velice neotřelou možností, jak zjistit, jestli je na systému nainstalován debugger (chápej SoftIce) je prověřit soubor "autoexec.bat", protože SoftIce je rezidentní (což je ovšem logické, když je to debugger) a spouští se ještě před startem Windows (ve skutečnosti se nejdříve spustí SoftIce a ten pak spustí Windows).
Já osobně preferuji zápis v ASM, ovšem vzhledem k tomu, že rozhodně více programátorů bude své aplikace dělat např. v C++, pokusím se většinu kódu převést právě do tohoto jazyka. Bohužel jsem se s tímto jazykem ještě natolik neskamarádil a tak to bude spíše takové ASM++ :-)) - jakékoli poznámky z vaší strany jsou vítány, pokud někdo z vás převede jakýkoli uváděný kód do poněkud lidštější podoby, rád ho uveřejním.
V této i ve většině dalších ukázek záměrně poruším některá, dříve uvedená pravidla k ochraně softwaru (kódování stringů, názvy funkcí...)- ukázky vás mají něco naučit a ne vám zamotat hlavu!


CFile file;
char* buff;
const char si[] = "winice.exe"; //tímto souborem se spouští SoftIce
CString str;

if (!file.Open("c:\\autoexec.bat", CFile::modeRead))
return;
else
{
buff = new char[file.GetLength()+1];
file.Read(buff, file.GetLength()+1);
str = buff;
delete [] buff;
buff = 0;

str.MakeLower();
for (int i = 0; i < str.GetLength() - strlen(si); i++)
{
if (str.Mid(i, strlen(si)) == si) 
{
m_si = "SoftIce detected!";
break;
}
m_si = "SoftIce not detected!";
}
}
UpdateData(FALSE);


SoftIce se spouští (nebo spíše se zobrazí) kombinací kláves CTRL+D (nikomu to neříkejte :-))), která je nadřazena všem ostatním klávesovým zkratkám. Toho můžeme využít - například si na tuto klávesovou zkratku nastavte nějakou důležitou funkci vašeho programu (nesmí jít ale spustit jinak), místo této funkce se pak spustí SoftIce. Jak na to?:

if((GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState('D') & 0x8000) && (GetActiveWindow() == this))
{
//strašně důležitá funkce :-))
//třeba spuštění registračního okna vašeho programu


Tuto funkci vložte do Message WM_TIMER. Pak už jen nastavte TIMER funkcí SetTimer (vložte třeba do OnInitDialog()):

SetTimer(2194, 100, NULL); //např.takhle

Možná si říkáte, že výše zmiňované možnosti jsou tak primitivní, že nikoho nemohou zastavit, ale víte, co se říká: "V jednoduchosti je síla!". Většina crackerů dobře zná strukturu anti-debuggingových algoritmů a zcela bezpečně je poznají. Když se pak program odmítne spustit s aktivním debuggerem, okamžitě začnou hledat tyto algoritmy. Ovšem vzhledem k tomu, že naše postupy jsou při nejmenším originální a ne tolik známé, nebude jejich kód na první pohled tak nápadný, oproti těm již dobře známým, třeba i více profesionálním. Z vlastní zkušenosti musím říct, že většina anti-debuggových algoritmů je psána takovým způsobem, že už jen stačí přidat transparent: "Hledej zde!".

To by tak pro dnešek stačilo a příště (jak již jsem slíbil) se podíváme na poněkud profesionálnější způsoby detekce SoftIcu.

Přikládám i ukázkový příklad se všemi výše zmiňovanými funkcemi.

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: