V
ViscountPherget
PHP:
#include"stdafx.h" //Verwende die Headerdatei stdafx.h für Win32 Anwendungen
unsigned long process_id; //Variable vom Typ unsigned long (ziemlich lange Ganzzahlen) für die Nummer des CS 1.5 Prozesses
HWND cs_window; //Variable vom Typ HWND (handle window) damit wir mit dem CS-Fenster auch was anfangen können^^.
HANDLE process_handle; //Variable vom Typ HANDLE um Zugriff auf den CS-Prozess zu bekommen.
PVOID address = (PVOID)0x19D4588; //Variable vom Typ PVOID (pointer void) für einen Zeiger auf die Adresse des Textes im Speicher.
char data[1024]; //Variable vom Typ char (Zeichen), hier ist es ein string da sie Variable mehr als ein Zeichen beinhaltet. Strings nennt man auch Zeichenketten^^. Hier wurde eine maximale Länge von 1024 Zeichen gewählt was wohl für jede Server-Message ausreichen sollte.
void string_scan(HANDLE); //Protoytyp für die string_scan Funtion. Prototypen benötigt man, wenn eine Funktion hinter der Hauptfunktion steht. Da nur die Funktionen vor der Hauptfunktion aufgerufen werden. Dies ist also ein Hinweis für den Compiler, dass hinter der Hauptfunktion noch eine Funktion vorhanden ist. Bei den Empfangsvariablen (in Klammern) werden nur die Datentypen angegeben, nicht die Variablen.
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) /*Die Hauptfunktion WinMain für Win32 Anwendungen (bei Konsolenprogrammen ist dies main() ) . Die beiden Instance-Variablen empfangen die Process-IDs ihrer eigenen Instanzen (Programm im Speicher). Die Previous Instance dient dazu eine neue Instanz von gleichen Programm zu erstellen. LpCmdLine ist ein Pointer (Zeiger) auf den String des Befehlszeilenparameter (command-line parameter). Das koennte z.B in 'hl.exe -full' das '-full' sein.*/
{
bool window_found = false; //Variable vom Typ bool (wahr oder falsch, 1 oder 0) welche angibt ob das CS-Fenster gefunden wurde.
while(!window_found) //Schleife welche nach dem CS-Fenster sucht
{
if(FindWindow(0,"Counter-Strike")) //Wenn CS-Fenster gefunden...
{
window_found = true; //...dann ist die Variable window_found wahr.
}
Sleep(200); //200 ms warten, wir muessen ja nicht ununterbrochen nach dem Fenster suchen, was sich auch ziemlich auf die Systemressourcen auswirken wuerde^^.
}
cs_window = FindWindow(NULL,"Counter-Strike"); //Jetzt ordnen wir unserem Fenster-Handle das CS-Fenster zu.
GetWindowThreadProcessId(cs_window,&process_id); //Mit Hilfe des Fensters ermitteln wir die Prozessnummer von CS und geben diese an das Handle process_id.
process_handle = OpenProcess(PROCESS_ALL_ACCESS,false,process_id); //Jetzt stellen wir mit Hilfe der OpenProcess-Funktion eine Verbindung zum CS-Prozess her und ordnen dies dem Handle process_handle zu. PROCESS_ALL_ACCESS gibt an, dass unser Programm volle Rechte hat in den Prozess CS zu schreiben, zu lesen usw. Der zweite Wert gibt an ob das Handle vererbt werden kann. Da wir das hier nicht brauchen setzen wir es auf false (falsch). Der dritte Wert stellt der Funktion unsere process_id von CS zu Verfügung um den Prozess auch zu finden.
string_scan(process_handle);
return 0; //Wir geben 0 zurück um mitzuteilen, dass alles glatt gegangen ist. Hier ist 0 ein Integer-Wert wie man oben am int Rückgabewert der WinMain Funktion erkennt.
}
void string_scan(HANDLE process_handle) //Unsere eigene Funktionen um die Messages von CS auszulesen.
{
bool bomb_found = false; //Die Message, dass die Bombe geplanted wurde ist noch nicht aufgetreten.
while(!bomb_found) //Solange die Bomb-Planted Message nicht angezeigt wurde...
{
ReadProcessMemory(process_handle,address,&data,1024,0); //...lesen wir den Speicher aus...
if(strncmp(data,"Terrorists Win!",strlen(data)-1)==0) //...und vergleichen den Text mit der bekannten ingame Nachricht bei einer geplanteten Bombe. Da wir das unsichtbare zusätzliche Zeichen nicht kennen ziehen wir es von der Zeichenlaenge ab (-1).
{
bomb_found = true; //Falls der Text gefunden wurde ist die Variable bomb_found wahr, damit wir aus der Schleife rauskommen.
MessageBox(0,data,"Information",0); //Wurde der String gefunden zeigen wir diesen in einer Dialogbox an.
}
Sleep(50); //Hier lassen wir die Schleife 50 ms schlafen damit unser Programm nicht die CPU vergewaltigt.
} //Da bomb_found jetzt wahr ist springen wir aus der Schleife. Da in dieser Funktion nicht mehr steht springen wir zurück zur Hauptfunktion (hinter unserem Funktionsaufruf)... siehe return 0.
}
Das Programm ist nicht wirklich nützlich aber es ist ja nur ein Beispiel :].