10.04.2016, 09:31
Najpopularniejszym dziś sposobem tworzenia nowego procesu jest odwołanie się do odpowiedniej funkcji, gdzie deklarujemy podstawowe informacje o procesie. Funkcja zwraca nam potem uchwyt do tego procesu (ang. handle) za pomocą którego możemy na nim operować.
Teraz stworzymy program, który uruchamia daną aplikację, a następnie czeka na jej zakończenie. Wykorzystamy w nim funkcję WinAPI (windows.h) CreateProcess (funkcja ta przyjmuje bardzo dużo parametrów, z czego potrzebne jest nam tylko kilka).
Przeanalizujmy kod linijka po linijce. Pierwsze dwie, są to dwie dobrze nam znane zaimportowane biblioteki – standardowa (stdio.h / cstdio), druga to WinAPI (windows.h)., trzecia to biblioteka obsługująca stringi a ostatnia iostream (wykorzystam z niej funkcje cin).
Tworzymy główną część naszego programu (int main) bez żadnych parametrów (void).
Teraz tworzymy dwa obiekty PROCESS_INFORMATION oraz STARTUPINFO – potrzebne są one nam do uruchamiania nowego procesu.
Potem tworzymy string a nazwie a, i prosimy użytkownika o wpisanie ścieżki do programu.
Potem widzimy zmienną logiczną BOOL nazwaną res – służy ona do sprawdzenia, czy uruchomienie procesu się powiodło (CreateProcessW również jest typem BOOL). Jeżeli zwróci on wartość TRUE – kontynnujmy, inaczej return 1.
Przeanalizujmy teraz strukturę CreateProcess. Ma ona, jak to wiele komend z WinAPI, wiele parametrów, w większości niepotrzebnych. Najważniejsze dla nas są:
Kompilacja i uruchomienie (TDM-GCC 4.9.2 32-bit DEBUG) wygląda tak:
Jak widać, wszystko wykonuje się tak, jak powinno.
To by było na tyle, w razie czego pytajcie
Teraz stworzymy program, który uruchamia daną aplikację, a następnie czeka na jej zakończenie. Wykorzystamy w nim funkcję WinAPI (windows.h) CreateProcess (funkcja ta przyjmuje bardzo dużo parametrów, z czego potrzebne jest nam tylko kilka).
Kod:
#include <windows.h>
#include <stdio.h>
#include <string>
#include <iostream>
int main(void)
{
PROCESS_INFORMATION pInfo;
STARTUPINFO sInfo = { sizeof(pInfo) };
std::string a;
puts("Podaj ścieżkę do uruchamianego programu:\n");
std::cin >> a;
BOOL res = CreateProcess(a.c_str(), NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &sInfo, &pInfo);
if (!res) return 1;
CloseHandle(pInfo.hThread);
printf("Process started with ID: %u, waiting for exit...\n", static_cast<unsigned int>(pInfo.dwProcessId));
WaitForSingleObject(pInfo.hProcess, INFINITE);
CloseHandle(pInfo.hProcess);
puts("Process exited");
return 0;
}
Przeanalizujmy kod linijka po linijce. Pierwsze dwie, są to dwie dobrze nam znane zaimportowane biblioteki – standardowa (stdio.h / cstdio), druga to WinAPI (windows.h)., trzecia to biblioteka obsługująca stringi a ostatnia iostream (wykorzystam z niej funkcje cin).
Tworzymy główną część naszego programu (int main) bez żadnych parametrów (void).
Teraz tworzymy dwa obiekty PROCESS_INFORMATION oraz STARTUPINFO – potrzebne są one nam do uruchamiania nowego procesu.
Potem tworzymy string a nazwie a, i prosimy użytkownika o wpisanie ścieżki do programu.
Potem widzimy zmienną logiczną BOOL nazwaną res – służy ona do sprawdzenia, czy uruchomienie procesu się powiodło (CreateProcessW również jest typem BOOL). Jeżeli zwróci on wartość TRUE – kontynnujmy, inaczej return 1.
Przeanalizujmy teraz strukturę CreateProcess. Ma ona, jak to wiele komend z WinAPI, wiele parametrów, w większości niepotrzebnych. Najważniejsze dla nas są:
- lpApplicationName – ścieżka do uruchamianej aplikacji
- lpStartupInfo – zawiera parametry nowego procesu
- lpProcessInformation – zawiera informacje o nowym procesie i uchwyty (Handle) do niego
Kompilacja i uruchomienie (TDM-GCC 4.9.2 32-bit DEBUG) wygląda tak:
[Aby zobaczyć linki, zarejestruj się tutaj]
[Aby zobaczyć linki, zarejestruj się tutaj]
Jak widać, wszystko wykonuje się tak, jak powinno.
To by było na tyle, w razie czego pytajcie
0x DEADBEEF