[WinAPI] OpenProcess problem z otwarciem procesów 64 bitowych przez aplikacje 32 bitową
Ostatnio zmodyfikowano 2012-11-10 02:03
yogi Temat założony przez niniejszego użytkownika |
[WinAPI] OpenProcess problem z otwarciem procesów 64 bitowych przez aplikacje 32 bitową » 2012-11-07 19:04:41 Jeżeli skompiluje aplikacje 64 bitową, to OpenProcess działa jak trzeba, ale lepiej by było otworzyć aplikację 64 bitową przez 32 bitową
#edit Aplikacje 32 bitowe mogą otwierać tylko aplikacje 32 bitowe, zaś aplikacje 64 bitowe mogą otwierać i 64 i 32 bitowe aplikacje |
|
cyklopek11 |
» 2012-11-08 22:21:05 Jak to się nie da? Poniższy kod uruchomiłem na Viście 64-bit. Program skompilowany przy pomocy środowiska Code::Blocks do postaci 32-bit exe. Uruchomiłem proces notepad.exe 64-bit jako królika doświadczalnego i odczytałem jego PID (który umieściłem w kodzie). Poniższy kod uruchomiłem na koncie z grupy - administratorzy, wymuszając na systemie operacyjnym podwyższenie tokenu filtrowanego na granicy procesów do poziomu - może robić to co administratorzy (tzn. prawy klik --> uruchom jako administrator, korzystam z domyślnie włączonego UAC). Jednoznacznym dowodem na to, że proces został otwarty jest to, że funkcja OpenProcess zwróciła handle różny od zera, a wywołanie za nią GetLastError daje ERROR_SUCCESS. W kodzie popełniłem coś czego nie powinno się robić - dałem maksymalne uprawnienia sobie do grzebania w procesie. Prawidłowo powinienem tam wpisać możliwie najniższy do danego celu. #include <windows.h> #include <iostream> using namespace std;
void EnableDebugPriv() { HANDLE hToken; LUID sedebugnameValue; TOKEN_PRIVILEGES tkp; if( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, & hToken ) ) return; if( !LookupPrivilegeValue( NULL, SE_DEBUG_NAME, & sedebugnameValue ) ) { CloseHandle( hToken ); return; } tkp.PrivilegeCount = 1; tkp.Privileges[ 0 ].Luid = sedebugnameValue; tkp.Privileges[ 0 ].Attributes = SE_PRIVILEGE_ENABLED; if( !AdjustTokenPrivileges( hToken, FALSE, & tkp, sizeof tkp, NULL, NULL ) ) CloseHandle( hToken ); }
int main() { cout << "Jestem sobie watkiem z procesu 32-bitowego" << endl; EnableDebugPriv(); HANDLE handle; handle = OpenProcess( PROCESS_ALL_ACCESS, FALSE, static_cast < DWORD >( 2588 ) ); DWORD error = GetLastError(); if(( handle != NULL ) &&( error == ERROR_SUCCESS ) ) { cout << "Udalo sie poprawnie otworzyc proces notepad.exe 64-bit" << endl; } else { cout << "Nie udalo sie poprawnie otworzyc procesu :-(" << endl; } cin.get(); return 0; }
|
|
yogi Temat założony przez niniejszego użytkownika |
» 2012-11-10 02:03:31 To jednak nie była wina OpenProcess tylko GetModuleFileName czy jakoś tak :) zamieniłem na identyczną funkcję która różni się tylko nazwą |
|
« 1 » |