[C++]Problem FindWindow

04/30/2011 21:43 Evilkingg#1
hey wie der titel schon sagt hab ich ein problem mit findwindow
unzwar immer wenn ich 4story_gsp ( fenstername von 4story spiel )
aufrufen will hwnd = FindWindow(0,L"4Story_GSP");
setzt sich der processhandel auf 0000000000 bei anderen processen geht das ohne probleme nur da nicht liegt es vllt an dem _ oder an was anderes ? bitte um ein paar ideen voran es liegen könnte :P
04/30/2011 21:46 MrSm!th#2
könntest du es bitte lassen zu jedem scheiß copy&paste problem nen neuen thread aufzumachen und endlich die verdammte sprache lernen, bevor du hacks schreiben willst?
es hat so keinen sinn...

1. hat der process handle nix mit FindWindow zutun, meinst du also wirklich den oder den Window Handle?
2. das kann viele gründe haben, was sagt GetLastError?
04/30/2011 22:05 Evilkingg#3
problem tritt nur auf wenn ich FindWindow änder

hwnd = FindWindow
GetWindowThreadProcessId(hwnd,&Id)
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, false, Id);

die haben nix miteinander zu tun ?! :D:D:D:D::D:D:D
04/30/2011 22:27 yihaaa#4
Poste mal den Code richtig mit Code Tags.

MfG
04/30/2011 23:09 Evilkingg#5
Quote:
Originally Posted by yihaaa View Post
Poste mal den Code richtig mit Code Tags.

MfG
Code:
#include <windows.h> // Hier sind die Funktionen die wir später noch brauchen
#include <iostream> // Sollte klar sein

using namespace std; // Sollte auch klar sein ...

int main()  // Unsere Main Funktion...
{
HWND hwnd; // Unsere Variable die das Fensterhandle speichert.
hwnd = FindWindow(0,L"4Story_GSP");
DWORD Id; // Die ID wird in einer Variable des Typ's DWORD gespeichert.
HANDLE ProcessHandle;
    unsigned long address0 = 0x006EFFFC; 
	    unsigned long offset2 = 0x604; 						   
    unsigned long offset = 0x188; 
    unsigned long address1 ;
	unsigned long address2 ;

DWORD numBytesRead;
int hp ;

  

// Der Fenstertitel vom Solitärfenster ist "Solitär". Das erste Parameter ist der "ClassName" den wir aber getrost ignorieren können. Das zweite Parameter ist unser Fenstername. Das "L" steht für eine Typkonvertierung.. 

if(!hwnd) // Also das Fenster nicht vorhanden ist...
{
	cout << "Solitär nicht gefunden!" << endl; // Gebe das aus
	cin.get();
}
else  // ansonsten...
{
	cout << "Solitär gefunden!" << endl; // gebe das aus
        cout << "Fensterhandle: " << hwnd << endl; // Wir können uns das Handle auch nochmal angucken ...
       
        GetWindowThreadProcessId(hwnd,&Id); // Mit GetWindowThreadProcessId kann man die ID herausfinden. Das erste Parameter ist unser Fensterhandle. Das zweite gibt an, wo die ID gespeichert werden soll.
		cout << GetLastError <<
        cout << "ID "<< Id << endl;
        ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, false, Id);
	
	cout << "ProcessHandle: " << ProcessHandle << endl;
	

    ReadProcessMemory(ProcessHandle, (LPCVOID)address0, &address1, sizeof(long), &numBytesRead); 
    address1 = address1+offset ; 
    ReadProcessMemory(ProcessHandle, (LPCVOID)address1, &address2, sizeof(long), &numBytesRead);
	address2 = address2+offset2 ; 
	ReadProcessMemory(ProcessHandle, (LPCVOID)address2, &hp, sizeof(int), &numBytesRead);

	cout << "Punkte : " <<hp<< endl;

			cin.get();// Damit sich unser Programm nicht sofort schließt...
}


}
04/30/2011 23:18 yihaaa#6
Versuchs mal damit:
Code:
int GetProcessID( char* pName )
{
    HANDLE hProcessSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPALL, 0 );

    PROCESSENTRY32 ProcessEntry = { 0 };

    ProcessEntry.dwSize = sizeof( ProcessEntry );

    BOOL Return = Process32First( hProcessSnapShot, &ProcessEntry );

    do
	{
		if ( strcmp ( ProcessEntry.szExeFile,  pName ) == 0 )
		{
            return ( int )ProcessEntry.th32ProcessID;
		}
    }while( Process32Next( hProcessSnapShot, &ProcessEntry ) );

    CloseHandle( hProcessSnapShot );

    return -1;
}
Du musst noch eine Header einbinden, den musste dir aber selbst raussuchen. Etwas sollte man immerhin machen, wenn man schon alles c&p übernimmt.

MfG
04/30/2011 23:28 MrSm!th#7
Quote:
Originally Posted by Evilkingg View Post
problem tritt nur auf wenn ich FindWindow änder

hwnd = FindWindow
GetWindowThreadProcessId(hwnd,&Id)
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, false, Id);
was sagt GetLastError nach FindWindow? was sagt es nach GetWindowThreadProcessId? was sagt es nach OpenProcess?
Quote:
die haben nix miteinander zu tun ?! :D:D:D:D::D:D:D
Jo haben sie nicht.

Quote:
Du musst noch eine Header einbinden, den musste dir aber selbst raussuchen. Etwas sollte man immerhin machen, wenn man schon alles c&p übernimmt.
find ich albern, du solltest ihm lieber den header sagen und nicht, wie man ihn benutzt, als so rum.

außerdem kann man FindWindow bei konstantem Window Title genau so gut einsetzen und es spart Code-Zeilen und Laufzeit :p
04/30/2011 23:53 Evilkingg#8
danke das du versuchs mir zu helfen :P

hier ein pic hab jetzt die GetLastError drine :D

[Only registered and activated users can see links. Click Here To Register...]
05/01/2011 00:33 MrSm!th#9
Ähm, GetLastError ist ne Funktion, also GetLastError(), das weißt du oder?
Das da sieht mir eher danach aus, dass du die Adresse der Funktion im Speicher ausgibst, sprich die Klammern weglässt ;O
05/01/2011 00:54 Evilkingg#10
achso meinst du das dann vllt so :D ?

[Only registered and activated users can see links. Click Here To Register...]
05/01/2011 01:35 MrSm!th#11
[Only registered and activated users can see links. Click Here To Register...]

wie du leicht entnehmen kannst, starte das programm als admin (sollte eigentlich eh klar sein...)

und nun lern die sprache ;<
05/01/2011 03:57 KDeluxe#12
Bei dem Problem hätte dir hier nicht wirklich jemand helfen können. Es gibt nur einen Fehler, du addierst die Offsets falsch. Funktionieren würde es so:

PHP Code:
ReadProcessMemory(ProcessHandle, (LPCVOID)address0, &address1sizeof(long), &numBytesRead); 
address1 address1+offset2 
ReadProcessMemory(ProcessHandle, (LPCVOID)address1, &address2sizeof(long), &numBytesRead);
address2 address2+offset 
ReadProcessMemory(ProcessHandle, (LPCVOID)address2, &hpsizeof(int), &numBytesRead); 
Zusammen kopiert sieht das ganze natürlich nicht mehr so schön aus, hier noch mal etwas "sauberer":
PHP Code:
#include <windows.h>
#include <iostream>
using namespace std;

DWORD Base 0x6EFFFC;
DWORD Offset[2] = {0x6040x188};

int main(){
    
HWND hWnd FindWindow(0"4Story_GSP");

    if(!
hWnd){
        
cout << "4Story EG wurde nicht gefunden!" << endl;
    }else{
        
DWORD ProcessId;
        
GetWindowThreadProcessId(hWnd, &ProcessId);
        
HANDLE hProcess OpenProcess(0x1F0FFFfalseProcessId);

        
DWORD AddressV_HP;

        
ReadProcessMemory(hProcess, (LPCVOID)Base, &Address40); 
        
Address Address Offset[0]; 
        
ReadProcessMemory(hProcess, (LPCVOID)Address, &Address40);
        
Address Address Offset[1]; 
        
ReadProcessMemory(hProcess, (LPCVOID)Address, &V_HP40);

        
cout << "HP: " << V_HP << endl;
    }

    
system("PAUSE");
    return 
0;

Quote:
Originally Posted by MrSm!th View Post
und nun lern die sprache ;<
05/01/2011 10:25 Andrea1234567890#13
PHP Code:
ReadProcessMemory(ProcessHandle, (LPCVOID)address0, &address1sizeof(long), &numBytesRead); 
address1 address1+offset2 
ReadProcessMemory(ProcessHandle, (LPCVOID)address1, &address2sizeof(long), &numBytesRead);
address2 address2+offset 
ReadProcessMemory(ProcessHandle, (LPCVOID)address2, &hpsizeof(int), &numBytesRead); 
Don't use this. Try to use that code:

PHP Code:
UINT_PTR DeRefUINT_PTR _uiptrPointer )
{
    
UINT_PTR uiptrRet;
    if ( !::
ReadProcessMemoryhProcessreinterpret_cast<LPVOID>(_uiptrPointer), &uiptrRetsizeofuiptrRet ), NULL ) ) { return 0UL; }
    return 
uiptrRet;

So...

PHP Code:
addy1 DeRefDeRefDeRef0x123456 ) + 0x123 ) + 0x123 ) + 0x123;
WriteProcessMemory(hProcess,(LPVOID)addy,&value1,4,NULL); 
05/01/2011 11:15 MoepMeep#14
Quote:
Originally Posted by KillerDeluxe View Post
Bei dem Problem hätte dir hier nicht wirklich jemand helfen können. Es gibt nur einen Fehler, du addierst die Offsets falsch. Funktionieren würde es so:

PHP Code:
ReadProcessMemory(ProcessHandle, (LPCVOID)address0, &address1sizeof(long), &numBytesRead); 
address1 address1+offset2 
ReadProcessMemory(ProcessHandle, (LPCVOID)address1, &address2sizeof(long), &numBytesRead);
address2 address2+offset 
ReadProcessMemory(ProcessHandle, (LPCVOID)address2, &hpsizeof(int), &numBytesRead); 
Zusammen kopiert sieht das ganze natürlich nicht mehr so schön aus, hier noch mal etwas "sauberer":
PHP Code:
#include <windows.h>
#include <iostream>
using namespace std;

DWORD Base 0x6EFFFC;
DWORD Offset[2] = {0x6040x188};

int main(){
    
HWND hWnd FindWindow(0"4Story_GSP");

    if(!
hWnd){
        
cout << "4Story EG wurde nicht gefunden!" << endl;
    }else{
        
DWORD ProcessId;
        
GetWindowThreadProcessId(hWnd, &ProcessId);
        
HANDLE hProcess OpenProcess(0x1F0FFFfalseProcessId);

        
DWORD AddressV_HP;

        
ReadProcessMemory(hProcess, (LPCVOID)Base, &Address40); 
        
Address Address Offset[0]; 
        
ReadProcessMemory(hProcess, (LPCVOID)Address, &Address40);
        
Address Address Offset[1]; 
        
ReadProcessMemory(hProcess, (LPCVOID)Address, &V_HP40);

        
cout << "HP: " << V_HP << endl;
    }

    
system("PAUSE");
    return 
0;

Schonmal was von UINT_PTR gehört?
05/01/2011 11:31 xNopex#15
Quote:
Schonmal was von UINT_PTR gehört?
Ich nicht. Deshalb habe ich mal geschwind die MSDN besucht:

Quote:
typedef unsigned int UINT_PTR;
und

Quote:
typedef unsigned int UINT;
und

Quote:
typedef unsigned long DWORD;
Und jetzt darfst du mir erklären, warum man hier lieber UINT_PTR nehmen sollte. Ich verstehe es nämlich nicht, was mich davon abhalten sollte, einfach "unsigned int" zu verwenden, ist doch alles (fast) das gleiche... o,ô