[C++] Process Handle

10/26/2009 20:59 Medix#1
huhu, ich hab ein Problem den Process Handle von Diablo II zu bekommen.

Code:
#include <cstdlib>
#include <iostream>
#include <windows.h>



using namespace std;


int main(int argc, char *argv[])
{
    
    
HWND Diablo = FindWindow("Diablo II", NULL);
     
DWORD process_ID;
DWORD thread_ID = GetWindowThreadProcessId(Diablo, &process_ID);
HANDLE process = OpenProcess(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF, FALSE, process_ID);    


//SPEICHERABFRAGE//

unsigned int wert(0);
unsigned int adress(0x01CBFC3D);
ReadProcessMemory(process,
                    reinterpret_cast<void *> (adress),
                    &wert,
                    sizeof(wert),
                    NULL);


if(ReadProcessMemory(process,
                    reinterpret_cast<void *> (adress),
                    &wert,
                    sizeof(wert),
                    NULL)){
     cout<<"Success";}
else{
    cout<<"Fehlercode"<<endl;
    cout<<GetLastError()<<endl;

}
///AUSGABE////
if (Diablo){
    
cout<<"\n";
cout<<"\n";
cout<<"HWND"<<endl;
cout<<Diablo<<endl;
cout<<"\n";
cout<<"HANDLE"<<endl;
cout<<process<<endl;
cout<<"\n";
cout<<"&wert"<<endl;
cout<<&wert<<endl;

cout<<"\n";
cout<<"wert"<<endl;
cout<<wert<<endl;
}
else if(!Diablo)
{
    cout<<"Programm nicht aktiv"<<endl;
}


    
    system("PAUSE");
    return EXIT_SUCCESS;
}
und zwar wird dann in der Konsole bei HANDLE : 0 ausgegeben und der Speicherwert kann auch nicht ausgelesen werden.

Wenn ich das ganze jedoch bei Minesweeper mache klappt es Problemlos wieso ? :(
10/26/2009 21:19 ^darkwing#2
Code:
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process_ID);
Unter Vista bzw. Windows 7 als Administrator ausführen.

Btw. 0 heißt es ist wohl ein Fehler passiert und deswegen kann Read- und WriteProcessMemory auch nicht funktionieren
10/26/2009 21:25 Medix#3
Quote:
Originally Posted by ^darkwing View Post
Code:
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process_ID);
Unter Vista bzw. Windows 7 als Administrator ausführen.

Btw. 0 heißt es ist wohl ein Fehler passiert und deswegen kann Read- und WriteProcessMemory auch nicht funktionieren
Danke, eben versucht Problem besteht leider immernoch, wobei ich Diablo 2 sowie auch das Programm selbst als Admin ausgeführt habe.
10/26/2009 21:32 ^darkwing#4
Dann muss der Fehler wohl paar Zeilen drüber liegen.

Code:
HWND Diablo = FindWindow("Diablo II", NULL);
Ich glaube hier steckt dann evtl. der Fehler.
Das Handle zum Fenster ist vermute ich 0.

Mir fällt gerade auf, dass du die Parameter von FindWindow() vertauscht hast und der Code sollte so besser geschrieben werden:

Code:
HWND Diablo = NULL;
while (Diablo == NULL)
{
    Diablo = FindWindow(NULL, "Diablo II");
    Sleep(100);
}
10/26/2009 21:38 Medix#5
Quote:
Originally Posted by ^darkwing View Post
Dann muss der Fehler wohl paar Zeilen drüber liegen.

Code:
HWND Diablo = FindWindow("Diablo II", NULL);
Ich glaube hier steckt dann evtl. der Fehler.
Das Handle zum Fenster ist vermute ich 0.

Mir fällt gerade auf, dass du die Parameter von FindWindow() vertauscht hast und der Code sollte so besser geschrieben werden:

Code:
HWND Diablo = NULL;
while (Diablo == NULL)
{
    Diablo = FindWindow(NULL, "Diablo II");
    Sleep(100);
}
Danke ;) aber habs immernoch nicht hingekriegt.


Das HWND ist jedenfalls nicht NULL daran scheiterts anscheinend nicht denn ich lass mir ja den wert von Diablo unten ausgeben in der Konsole und der bekommt einen wert zugewiesen.

:(
10/26/2009 21:48 ^darkwing#6
Was sagt denn GetLastError(), wenn du es hinter bzw. unter dem Aufruf von OpenProcess schreibst?
10/26/2009 21:54 Medix#7
Quote:
Originally Posted by ^darkwing View Post
Was sagt denn GetLastError(), wenn du es hinter bzw. unter dem Aufruf von OpenProcess schreibst?

5
aka

Quote:
ERROR_ACCESS_DENIED
5 (0x5)



Access is denied.
Programm wurde aber als Administrator ausgeführt
10/26/2009 22:18 ^darkwing#8
Wie es aussieht hat der Prozess nicht genügend Rechte. Um absolut volle Rechte zu bekommen braucht man das "SeDebugPrivileg".
Deklarier die Funktion bei dir und ruf sie vor OpenProcess auf.
Das müsste nun endgültig das Problem lösen :0
Code:
bool EnableDebugPrivilege()
{
    TOKEN_PRIVILEGES priv;
    HANDLE hThis, hToken;
    LUID luid;
    hThis = GetCurrentProcess();
    OpenProcessToken(hThis, TOKEN_ADJUST_PRIVILEGES, &hToken);
    LookupPrivilegeValue(0, "seDebugPrivilege", &luid);
    priv.PrivilegeCount = 1;
    priv.Privileges[0].Luid = luid;
    priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, false, &priv, 0, 0, 0);
    CloseHandle(hToken);
    CloseHandle(hThis);
    return true;
}
10/26/2009 23:45 MrSm!th#9
selbes problem bei nem anderen game
habe bisher auch noch keine lösung gefunden
es scheint wohl an vista zu liegen
bis zur ProcessID hab ich auch alles zurückverfolgt; alles stimmt
bei mir kanns also nur irgendwie an den rechten oder an dem handle liegen
p.s. das mit dem Debug Previleg auch schon probiert...klappt auch nicht
ich glaube langsam echt es liegt an vista
10/27/2009 16:11 ^darkwing#10
Also bei Medix funktioniert es jetzt.
Die Lösung war, den Prozess mit nur den notwendigesten Rechten zu öffnen.
Das SeDebugPrivileg muss dennoch vorher ausgeführt werden.

Ansonsten: Google "openprocess access denied"