- C Helpdesk http://www.chelpdesk.pun.pl/index.php - Tutorial http://www.chelpdesk.pun.pl/viewforum.php?id=10 - [C/C++] Duplikowanie uchwytów obiektów jądra w Windows. http://www.chelpdesk.pun.pl/viewtopic.php?id=13 |
mieczyk - 03-31-2007 22:39:35 |
0x01. Wstęp. Kod:#include <windows.h> #include <tlhelp32.h> #include <iostream> #include <fstream> using namespace std; int WINAPI WinMain(HINSTANCE hi,HINSTANCE,PSTR cmd,int show) { HANDLE uchwyt_zdarzenia_s=CreateEvent(NULL,TRUE,FALSE, NULL); HANDLE uchwyt_zdarzenia_t; HANDLE uchwyt_source = GetCurrentProcess(); HANDLE uchwyt_target; MessageBox(NULL, TEXT("Zanim wciśniesz OK, uruchom proces \"target\""), TEXT("Uwaga !"), MB_OK | MB_ICONINFORMATION); /*------------------------------------------------------------------------------- Wyszukanie procesu o nazwie ´target´ i przypisanie do zmiennej ´uchwyt_target´ jego uchwytu ---------------------------------------------------------------------------------*/ HANDLE snapshot; snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 p32; p32.dwSize = sizeof(PROCESSENTRY32); do { if(lstrcmp(p32.szExeFile, "target.exe") == 0) uchwyt_target=OpenProcess(PROCESS_ALL_ACCESS, FALSE, p32.th32ProcessID); } while (Process32Next(snapshot, &p32)); /*-------------------------------------------------------------------------------*/ DuplicateHandle(uchwyt_source, uchwyt_zdarzenia_s, uchwyt_target, &uchwyt_zdarzenia_t, 0, FALSE, DUPLICATE_SAME_ACCESS); ofstream Strm("plik.txt"); Strm << uchwyt_zdarzenia_t; return 0; } * Na samym początku tworzymy zdarzenie w stanie niesygnalizowanym i przypisujemy wartość uchwytu obiektu-zdarzenia do zmiennej uchwyt_zdarzenia_s. To właśnie ten uchwyt zdyplikujemy i przekażemy go do procesu target. Musimy jeszcze zainicjować zmienną uchwyt_zdarzenia_t, która będzie przechowywać wartość zduplikowanego uchwytu po wywołaniu funkcji DuplicteHandle. Kod:#include <windows.h> #include <iostream> #include <fstream> using namespace std; int WINAPI WinMain(HINSTANCE hi,HINSTANCE, PSTR cmd, int show) { MessageBox(NULL, TEXT("Zanim wciśniesz OK tutaj, wciśnij OK w procesie \"source\""), TEXT("Uwaga!"), MB_OK | MB_ICONINFORMATION); ifstream Strm("plik.txt"); HANDLE uchwyt_zdarzenia; Strm >> uchwyt_zdarzenia; BOOL test = SetEvent(uchwyt_zdarzenia); if(test==TRUE) MessageBox(NULL, TEXT("Uchwyt został zduplikowany!"), TEXT("Sukces!"), MB_OK | MB_ICONINFORMATION); else MessageBox(NULL, TEXT("Uchwyt nie został zduplikowany!"), TEXT("Porażka!"), MB_OK | MB_ICONERROR); return 0; } * No i w końcu proces, który przejmie zduplikowany uchwyt obiektu-zdarzenia. Na samym początku zatrzymujemy program za pomocą funkcji MessageBox. Teraz proces target działa i proces źródłowy source może spokojnie wykonać resztę kodu. Gdy to nastąpi, możemy kontynuować wykonywanie kodu procesu target. |