Cracking4neWBies - Lekce č.17
Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: DjH
Datum: 20.10.2007
Hodnocení/Hlasovalo: 1.8/5
Cracking pro začátečníky...posedmnácté :-)
Cracking4neWBies
Lekce č.17
Trocha programování v Delphi – komponenta DjH DÍL[2]
Balík
zde
Minule jsme probrali myslím dostatečně práci se stringy. Nyní se pustíme do souborů. Ukážu Vám dvě funkce, které jsem
sepsal. Jedná se o funkce „ExtractResource“ a „Run“. První funkce uloží nějaký resource ze „sebe sama“ do nějakého souboru. Fukce je takováto:
ExtractResource(FileName:String; Resource:PCHar; DeleteIfExists: Boolean);
Myslím že není co dodat. Další funkce (procedura) je:
Run(FileName:string);
Jde o to, že se spustí jakýkoliv soubor v defaultním „prohlížeči toho souboru“. Tedy pokud použiju „Run(‚linkin park.mp3‘)“ otevře se mi tato empétrojka ve WinAmpu nebo Mediaplayeru, prostě v defaultním přehrávači MP3jek :). To je ten rozdíl od API „WinExec“, který umí spouštět jen *.exe, *.com atp… Funkce Run je vlastně tento řádek:
ShellExecute(0,'open',PChar(FileName),nil,nil,0);
Napsal jsem tuto funkci, protože tenhle zápis mě furt nebavil psát dokola :)
Za to funkce ExtractResource mi dala pěkně zabrat. Nejdřív jsem tuto funkci složil ze „SysUtilovských“ FileCreate, FileWrite… Potom jsem si uvědomil, že by vlastně narostla exace o 25 kB, tak jsem použil assembler. Nějak jak jsem k tomu došel popisovat nebudu, mělo by to být jasné z komentářů :)
procedure ExtractResource(FileName:String; Resource:PCHar; DeleteIfExists: Boolean);
//ExtractResource - Function by DjH2oo7
Var
BytesWritten:Integer;
begin
if DeleteIfExists = True then DeleteFile(PChar(FileName));
//Delete the file, if exists
CreateFile(PChar(FileName),
GENERIC_READ + GENERIC_WRITE,
FILE_SHARE_READ + FILE_SHARE_WRITE,
nil,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
0); //Create the file
asm //Now we will work in assembler :)
PUSH EBX //Push the exports of
PUSH EDI
//func. CreateFile
MOV EDI,EAX
//EDI = EAX = fileHandle
end;
FindResource(0,Resource,RT_RCDATA); //Find resource
asm
MOV EBX,EAX //In EAX is Address...
push EAX
push 0
Call LoadResource //Invoke LoadResource,0,eax - Get the address, where resource starts
PUSH EAX
push ebx
push 0
Call SizeofResource //Invoke SizeOfResource,0,ebx,eax - Get the size of res.
POP ECX //Get the handle
lea edx,BytesWritten //BytesWritten - Temp value :)
push 0
push edx
push eax
push ecx
push edi
call WriteFile //Invoke WriteFile,edi,ecx,eax,edx,0
push edi
call CloseHandle
//Close handle of file (EDI)
pop edi
//Zustanou nam ve stacku dve hodnoty,
pop edi
//musime je "vyPOPovat", jinak by RETN neskocil spravne! :)
end;
end;
Jak jednoduché, že?! :)
Uděláme si další čtyři funkce, na otevření a zavření mechaniky a na vypnutí a restartování počítače :). Tyhle čtyři funkce budou zvlášť v unitě DjHHWUtils (HW = HardWare :)). Unita je přiložená v balíčku…
//###################################################################//
//########################OpenDrive##################################//
procedure OpenDrive;
begin
mciSendString('Set cdaudio door open', nil, 0, hinstance);
end;
//###################################################################//
//########################CloseDrive#################################//
procedure CloseDrive;
begin
mciSendString('Set cdaudio door closed wait', nil, 0, 0);
end;
A v Uses nesmí chybět MMSystem :). A reset a Turn Off:
//###################################################################//
//#####################ShutDownPC###################################//
Procedure ShutDownPC;
begin
ExitWindowsEx(EWX_Force,0); // potlačí hlášky systému
ExitWindowsEx(EWX_SHUTDOWN,0); // vypnutí počítače
end;
//##################################################################//
//############################RestartPC##############################//
Procedure RestartPC;
begin
ExitWindowsEx(EWX_Force,0); // potlačí hlášky systému
ExitWindowsEx(EWX_REBOOT,0); // restart počítače
end;
Tyto dva díly Vám měli přiblížit vytváření vlastních komponent, naučit se používat vkládaný assembler v Delphi a naučit využívat DeDe naplno :). Neříkám, že tyhle funkce jsou potřeba, ale někdy se ocitne situace, kdy tyto funkce potřebujete. A proč tam ty funkce nedat, když v binárce zaberou stejně jen kolem 1 kilobajtu… Někdy se unita DjH prostě hodí :)