Cracking4neWBies - Lekce č.11

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: DjH
Datum: 10.9.2007
Hodnocení/Hlasovalo: 2.67/12

Cracking pro začátečníky...pojedenácté :-)

Cracking4neWBies

Lekce č.11

Opět chráníme náš software…



Balík zde
Takže teď bych chtěl uvést pár antidebugových triků, které jsem za poslední dobu zatím stihl postřehnout.



IsDbgPresent:

function IsDebuggerPresent : boolean; stdcall; external kernel32 name 'IsDebuggerPresent';


function checkdbg : boolean;
begin
if IsDebuggerPresent = true then
begin
asm
CALL ExitProcess
end;
end;
end;


Pro ověření, jestli je program debugovaný, zavolejte funkci „CheckDbg“.

Podle Title okna:

var
item:string;
hwndShell: HWnd;

begin
HWNDShell:=GetWindow(Handle,GW_HWNDFIRST); //Zacneme hledat okna…
repeat
SetLength(item,255);
HWNDShell:=GetNextWindow(HWNDShell,GW_HWNDNEXT); //Zacneme hledat okna…
GetWindowText(HWNDShell,Pchar(item),8); //Zjistime prvnich 7 pismen…
if length(string(Pchar(item)))>0 then
begin
if (String(Pchar(item))) = 'OllyDbg' then begin application.Terminate; end; //Jestli je tech 7 pismen rovno stringu „OllyDbg“ ukonci program…
end;
until HWNDShell=0;
end;


Aby nebyl string viditelný, je opět lepší jej alespoň trochu zneviditelnit, třeba pomocí funkce Char, a vypsat všech 7 písmen pomocí Char(x) + Char(x+1) … Promiňte, teď se mi to nechce převádět, alespoň máte co na práci pokud se vám to zalíbí :-)… Háček je v tom, že stačí mít Ollyho jen zaplého, a program se ukončí. Takže mu je jedno jestli je debuggovaný nebo ne… Ale to si myslím ani tak neva.

Tolik k antidebuggingu v Olly, ještě se pokusím přijít na to, jak v Delphi udělat SMC (Self-Modyfing Code), které je velmi působivé :-)… (btw: místo „OllyDbg“ můžete nahradit (přidat) jiný string (Soft-Ice)… ten ale nepoužívám, takže nevím přesně, jaký má caption :-))

Jak ochránit s/n, aby nebylo jen tak čitelné v paměti??
Jde o to, kontrolovat jeden znak po druhém, a ještě lépe, na přeskáčku, a pokud je v nějakém písmeně zádrhel, okamžitě skočit na BadBoi. Asi bych to opět měl popsat na ukázce (VCL, Delphi…):




if sn.Text[1] = inttostr(length(nick.Text)) then
if sn.Text[3] = inttostr(ord(sn.text[5]))[2] then
if sn.Text[7] = char(77 xor 96) then
if sn.Text[10] = b then
if sn.Text[aa] = inttostr((length(nick.Text)-1) xor ord(sn.text[2]) xor ord('D') * (length(nick.Text)-1) xor ord(sn.text[2]) xor ord('D'))[2] then
if sn.Text[cc] = inttostr(aa - ord(b[1]))[length(inttostr(aa - ord(b[1])))] then
begin
showmessage('Registrováno úspěšně...');
end;
end;

Proměnné (b, aa…) si můžete udělat podle svého algoritmu, dávejte ale pozor, aby se Vám dvakrát nekotrolovalo jedno písmeno! Potom by bylo CME neřešitelné (vyřešil by to jen patch). Přeba aby sedmé písmeno nebylo char(77 xor 96) (pomlka „-“) a zároveň by se pak kontrolovalo, jestli není sedmé písmeno třeba „8“ (TŘEBA..! :-)). To je velká chyba pak. Ještě bych chtěl doplnit, že na tyhle typy „CheckSn“ je docela těžké udělat keygen (myslím že ze zrojového kódu to jde vidět :-)). Třeba v Delphi byste si museli pohrát s Arrayem…
Nemám moc času, ukončím to dnes dříve, možná postupem času článek dopíšu, nebo vydám v 12té lekci pokračování na toto téma. Zatím si můžete přečíst pěkný článek od jOea "Zakladne antireversing techniky.1 - lahky uvod" Snad jste vše teda pochopili, a jestli ne, tak se moc omlouvám :-( , ale pokud se vyznáte v Delphi, pochopit by to neměl být problém…

P.S. Na www.crackmes.de mám (zatím v téhle době) 1 Cme, pokuste se ho prosím vyřešit, je i zde v balíku, a v balíku máte i druhé CMe, které je pakované a je dělané v Delphi (jen API)...tak kdyžtak na mail, nebo sem do komentářů, můžete přidávat komenty, popřípadě chyby. Solutions bych radši až v tom e-mailu. Uveřejňovat je zde nebudu (možná časem…:-))…

Zatím
Bie
DjH2oo7