http://alpha-thema-online.uv.ro
Fa-ti si tu propriul forum, pe www.myforum.ro!
Pagina de start a forumului http://alpha-thema-online.uv.ro Autentificare Inregistrare FAQ Membri Cautare

Pagina de start a forumului http://alpha-thema-online.uv.ro » C / C++ / C# » Subclasarea ferestrelor C++
Creaza un subiect nou  Raspunde la subiect Subiectul anterior :: Subiectul urmator 
Subclasarea ferestrelor C++
MesajTrimis: 21/07/2007 17:30 Raspunde cu citat (quote)
Ad_Infinitum
Administrator
Administrator
Ad_Infinitum
Data inscrierii: 23/Iun/2007
Mesaje: 212




Subclasarea ferestrelor prin injectarea unui dll

Autor: SlicK
Data: 5/26/2007
Website: rstzone.net
Mediu de programare: Dev-C++ 4.9.9.2/WIN32
Nivel: Mediu

>> Introducere

Un fisier cu extensia dll(acronim de la "Dynamic Link Library") este o colectie
de functii care pot fi utilizate de un program sau mai numeroase in acelasi timp.
Avantajul unui dll este ca nu este incarcat in memoria RAM la rularea programului
salvand astfel memorie pentru alte procese.

Tehnica pe care o voi prezenta in continuare numita "Dll Injection" este o metoda
prin care putem rula un cod propriu(aflat in dll) in spatiul de memorie al altui
program modificad comportamentul acestuia.

>> Exemplificare

In acest tutorial voi prezenta cum putem injecta un dll in Notepad adaugandu-i un meniu propriu

Pentru a injecta un dll in spatiul de memorie al altui program avem nevoie noi insine
de un program care sa faca acest lucru. Codul urmator face acest lucru.

===== loader.cpp ======

#include <windows.h>

BOOL DllInject(HANDLE,LPSTR); // delaram functia

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
while(1) // ciclu pana la gasirea unei ferestre "Notepad"
{
Sleep(100); // evitam supraincarcarea
HWND hwNot=FindWindow("Notepad",NULL); //cautam fereastra
if(hwNot!=NULL)
{
DWORD pid; GetWindowThreadProcessId(hwNot,&pid); // obtinem PID'ul
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); // deschidem procesul
if(hProcess!=NULL)
{
if(!DllInject(hProcess,"C:\\<DIRECTOR>\\dll.dll")) // injectam dll'ul in procesul respectiv
{
MessageBox(NULL,"Eroare la injectare","Eroare",MB_OK|MB_ICONERROR);
}
break;
}
}
}
return(0);
}

// aceasta este functia care injecteaza un dll intr'un proces (credit rohitab.com)
BOOL DllInject(HANDLE hProcess,LPSTR lpszDllPath)
{
HMODULE hmKernel=GetModuleHandle("Kernel32");
if(hmKernel==NULL || hProcess==NULL) return(FALSE);
int nPathLen=lstrlen(lpszDllPath)+1;
LPVOID lpvMem=VirtualAllocEx(hProcess,NULL,nPathLen,MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(hProcess,lpvMem,lpszDllPath,nPathLen,NULL);
DWORD dwWaitResult,dwExitResult=0;
HANDLE hThread=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(hmKernel,"LoadLibraryA"),lpvMem,0,NULL);
if(hThread!=NULL)
{
dwWaitResult=WaitForSingleObject(hThread,10000);
GetExitCodeThread(hThread,&dwExitResult);
CloseHandle(hThread);
}
VirtualFreeEx(hProcess,lpvMem,0,MEM_RELEASE);
return ((dwWaitResult!=WAIT_TIMEOUT) && (dwExitResult>0));
}

=======================

Pana aici am reusit sa injectam un dll in fereastra Notepad. Dar care este Dll'ul?

Codul urmator trebuie compilat intr-un proiect de tip DLL.

===== dll.cpp =====

#include <windows.h>

DWORD WINAPI Main(); // declaram cele doua functii
LRESULT CALLBACK NewWndProc(HWND,UINT,WPARAM,LPARAM);

LONG OldWndProc; // procedura de fereastra Notepad

//acesta este entry pointul intr-un dll, la fel ca "WinMain"
extern "C" BOOL WINAPI DllMain(HINSTANCE hInst,DWORD Reason,LPVOID Null)
{
switch(Reason)
{
case DLL_PROCESS_ATTACH: //cand dll'ul este atasat la un proces
{
MessageBox(NULL,"Dll Atasat","DLL",MB_OK);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&Main,NULL,0,NULL); // creeam un thread nou pentru a nu bloca aplicatia
}
break;

case DLL_PROCESS_DETACH: //cand dll'ul este detasat de un proces(cant procesul este inchis)
{
MessageBox(NULL,"Dll Detasat","DLL",MB_OK);
}
break;
}
return true;
}

// functia din noul thread
DWORD WINAPI Main()
{
HWND hwNot=FindWindow("Notepad",NULL); // cautam fereastra Notepad
// in continuare vom obtine meniul autentic al Notepad-ului si-i voi adauga o sectiune proprie
HMENU hOldMen=GetMenu(hwNot);
HMENU hNewMen=CreateMenu();
AppendMenu(hOldMen,MF_STRING | MF_POPUP,(unsigned int)hNewMen,"Tutorial");
AppendMenu(hNewMen,MF_STRING,2000,"Buton"); // 2000 este indentificatorul meniului nou
DrawMenuBar(hwNot);

// Subclasam procedura de fereastra a Notepad-ului cu o procedura proprie pentru
// a putea intercepta mesajele trmise de diferitele elemente ale ferestrei
// in cazul de fata atunci cand este selectat meniul nou
OldWndProc=SetWindowLong(hwNot,GWL_WNDPROC,(long)NewWndProc);
ExitThread(0);
}

// procedura de fereastra noua
LRESULT CALLBACK NewWndProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
switch(Message)
{
case WM_COMMAND: // mesajul pe care il primeste fereastra
{
if(wParam==2000)
{
MessageBox(HWND_DESKTOP, "Ai selectat meniul nou!","Tutorial",MB_OK);
}
}
}
// trimitem mesajele mai departe catre procedura de fereastra originala
return CallWindowProc((WNDPROC)OldWndProc,hWnd,Message,wParam,lParam);
}


===================

Cam atat cu acest tutorial. Sper ca ati prins ideea si va va folosi vreodata
Vezi profilul utilizatorului Trimite mesaj privat

Subclasarea ferestrelor C++
 Pagina de start a forumului http://alpha-thema-online.uv.ro » C / C++ / C#
Nu puteti crea un subiect nou in acest forum
Nu puteti raspunde in subiectele acestui forum
Nu puteti modifica mesajele proprii din acest forum
Nu puteti sterge mesajele proprii din acest forum
Nu puteti vota in chestionarele din acest forum
Ora este GMT + 3 ore  
Pagina 1 din 1  

  
  
 Creaza un subiect nou  Raspunde la subiect  


Fa-ti si tu propriul forum GRATUIT, pe www.myforum.ro
    Powered by phpBB © 2001-2004 phpBB Group. phpBB Skin by Vjacheslav Trushkin.