Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI] OpenProcess problem z otwarciem procesów 64 bitowych przez aplikacje 32 bitową

Ostatnio zmodyfikowano 2012-11-10 02:03
Autor Wiadomość
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
P-68740
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.

C/C++
#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 ) ); // aktualny PID procesu notepad.exe 64-bit
    DWORD error = GetLastError(); // Jaki błąd ustawia OpenProcess
    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;
}
P-68865
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ą
P-68911
« 1 »
  Strona 1 z 1