Register for your free account! | Forgot your password?

Go Back   elitepvpers > Off-Topics > Tutorials
You last visited: Today at 07:10

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Simpler Bot mit der Win API

Discussion on Simpler Bot mit der Win API within the Tutorials forum part of the Off-Topics category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Apr 2007
Posts: 152
Received Thanks: 10
Welcome, Devil Boy! [Kasperle aus DMC 3]
Mein erstes Tutorial wird ein wenig beschreiben, wie man sich einen simplen kleinen Bot zum Automatisieren verschiedener Abläufe in C basteln kann.
Dies wird ein Pixel Bot. Also ein Programm, das nach vordefinierten Pixeln sucht, und auf bestimmte Ereignisse verschiedene Dinge vollbringt.
Wir nehmen als Beispiel einmal ein MMORPG.
Darin müssten verschiedene Kriterien erfüllt werden, um in den vollen Genuss eines funktionierenden Noob-Bots zu kommen:
  • Die Monster müssen von etwas bestimmten geprägt sein, wie z.B. einer HP-Bar (Anzeige)
  • Hotkeys für die Tastatur wären gut, um sich z.B. zu heilen oder um Items aufzuheben
  • Es wäre gut, wenn beim Angreifen eines Monsters etwas spezifisches angezeigt wird, wie z.B. dass der Cursor rot wird
Und am aller wichtigsten ist, dass das Spiel die benötigten API Funktionen nicht blockt, wie z.B. durch API-Hooking.

Leider habe ich keines dieser Art gefunden, deshalb kann ich nun nur die Funktionen posten und dazu etwas erklären und nicht beispielsweise Screenshots oder einen vollwertigen Bot mitliefern.

Jetzt fange ich mal langsam an.. (Jope, ich habe keine Ahnung von strukturierten Texten :err: )

Schritt 1: HWND
Als erstes müssen wir uns Zugriff auf das gewollte Fenster verschaffen.
Diesen bekommen wir, indem wir die API Funktion FindWindow benutzen. Ihr übergeben wir als zweiten Parameter den Fenster Titel und bekommen dafür ein Fensterhandle mit dem wir vorfahren. (Der erste Parameter hat uns hier nicht zu kümmern) Nun Können wir das Fenster in Originalgröße anzeigen, es in den Vordergrund holen und den Tastaturfokus drauf setzen. Das passiert alles mit dem Fensterhandle.
Code:
#include <windows.h> /*Um die Win32 API zu nutzen, müssen wir natürlich die Win Headerdatei inkludieren;-)*/

HWND game_hwnd; /*Eine globale Variable, da wir auch aus anderen Funktionen darauf zugreifen müssen.*/

int main( int argc, int *argv[]) {
game_hwnd = FindWindow(NULL, "Hier kommt nun der Fenstertitel hinein, welchen man in der Titelleiste des Fensters ablesen kann");
ShowWindow(game_hwnd, SW_RESTORE);
SetForegroundWindow(game_hwnd);
SetFocus(game_hwnd);
return 0;
}
Wenn alles geklappt hat, finden wir uns inklusive dem Tastaturfokus unmittelbar nach dem Programmstart im Fenster des Spiels wieder

Schritt 2: Pixel Suche
Nun müssen wir die gewünschten Informationen aus diesem Fenster bekommen.
Wie z.B. die Monsterjagd..
Über den Köpfen der Monster sind Anzeigebalken um die Hp derer zu verdeutlichen.
Jetzt machen wir uns einen Screenshot, und holen uns die Farbinformationen der Stelle, an der die HP-Anzeige ist, mit der Hilfe von Paint oder jemand anderem.
Wir wissen nun, nach welchem Pixel wir suchen müssen, nur wie stellen wir diese Suche nun an?
Der zum Fenster zugehörige Device Context (also die derzeitig angezeigte Bitmap) besteht aus einem Koordinatensystem, wir können deshalb jeden einzelnen Punkt abgehen und nachfragen, ob er der Punkt ist, den wir suchen.
Dazu müssen wir uns erst einmal einen Handle zu dem Device Context des Fensters holen, und zwar mit GetDC.
Auf die Bitmap können wir dann später mit GetPixel, welches uns das abfragen ermöglicht, zugreifen.
Folgender Code holt sich also den Device Context des Spiels, geht in einer Schleife, welche eine zweite Schleife enthält, jeden einzelnen Pixel der Bitmap ab (1024x768), und holt sich den RGB Wert des Pixels und vergleicht ihn mit dem gewünschten Pixel.
Code:
#define PIXEL_R 255 /*Präprozessorvariablen für den RGB Wert des Pixels*/
#define PIXEL_G 0
#define PIXEL_B 0
HDC dc; /*wieder global*/

BOOL find_pixel(void) {
int x, y;
COLORREF pixel;
for(x = 0; x < 1024; x++) {
for(y = 0; y < 768; y++) {
pixel = GetPixel(dc, x, y);
if(GetRValue(pixel) == PIXEL_R && GetGValue(pixel) == PIXEL_G && GetBValue(pixel) == PIXEL_B)
return TRUE; /*ein Pixel mit den gleichen Farbinformationen wurde gefunden*/
}
}
return FALSE; /*ein Pixel mit den gleichen Farbinformationen wurde NICHT gefunden*/
}
Schritt 3: Maus bewegen
Wollen wir den Mauszeiger bewegen, brauchen wir wieder ein paar API Funktionen, doch bevor diese zum Einsatz kommen, brauchen wir Hintergrund Wissen:
Der Bildschirm besteht, unabhängig von der Größe, aus 65.535x65.535 Mickeys.
Wir müssen also die absoluten Bildschirmkoordinaten aus den zum Fenster relativen Pixelkoordinaten errechnen.
Dafür brauchen wir eine kleine Berechnung, die unter anderem unsere Auflösung enthält. (GetSystemMetrics)
Die Maus bewegen wir mit mouse_event und den Koordinaten. Ich habe das jetzt einmal alles in einem kleinen Makro zusammen gefasst.
Code:
#define move(x, y) mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, ((posx + x) * (65535 / GetSystemMetrics(SM_CYSCREEN))), ((posy + y) * (65535 / GetSystemMetrics(SM_CXSCREEN))), 0, 0); mouse_event(MOUSEEVENTF_LEFTDOWN, 0,0,0,0); mouse_event(MOUSEEVENTF_LEFTUP, 0,0,0,0);
Dieses Makro setzt die Maus auf die gewünschten Pixelkoordinaten und drückt direkt danach die linke Maustaste herunter und lässt sie wieder los. (Warum auf die Pixelkoordinaten? Man übergibt als Parameter die Pixelkoordinaten und die werden in dem Makro in Mickeys umgerechnet. [Zu dem posx und posy komme ich noch])

Schritt 4: Erweiterung von main()
Nun erwitern wir die Funktion main und holen uns noch ein paar mehr Infos über das Fenster.
Vorerst der Code:
Code:
int main(int argc, char *argv[]) {
int i = 0;
BOOL ismonster, isattacking;
char bar[] = "/-\\|";
coprint(CL_WHITE, "Waiting for Game [ ]");
game_hwnd = NULL;
while(game_hwnd == NULL) {
	cuprint(18, 0, "%c", bar[i]);
	game_hwnd= FindWindow(NULL, "FensterTitel");
	if(++i > 3) i = 0;
	Sleep(100);
}
cuprint(0, 2, "");
coprint(CL_YELLOW, "Process found! Bot is initializing...\n");
ShowWindow(game_hwnd, SW_RESTORE);
SetForegroundWindow(game_hwnd);
SetFocus(game_hwnd);
get_dc();
Sleep(1500);
while(TRUE) {
/*MAIN LOOP*/
}
return 0;
}
(Zu coprint/cuprint komme ich später)
Wie man sieht, wird nach dem Fenster gesucht, falls es nicht gefunden wird, bleibt das Programm solange in der Schleife, bis es gefunden wird. Außerdem wird, während es nicht gefunden wird, eine nette kleine "Ich.bin.am.arbeiten."-Anzeige gemalt. (mit cuprint s. oben)
Wenn es dann gefunden wird, wird es erst einmal in originaler Größe gezeigt (und in den Vordergrund/Tastaturfokus drauf) und dann werden Informationen über den Device Context des Fensters besorgt. Und zwar über die Funktion get_dc():
Code:
int posx, posy; /*global: x/y Position des Anfangs des Fensters*/
int width, height; /*global: Breite/Höhe des Fensters*/

int get_dc(void) {
RECT prect;
dc = GetDC(game_hwnd);
GetWindowRect(game_hwnd, &prect);
width = prect.right - prect.left; /*Hier müsste man eigentlich noch die Ränder an der Seite subtrahieren*/
height = prect.bottom - prect.top; /*Und hier wird auch die Titelleiste mitgezählt*/
posx = prect.left;
posy = prect.top;
return 0;
}
So, in der Funktion wird also über noch mehr API Funktionen einmal den DC des Fenster heran geschafft, die Breite und Höhe berechnet und die Position des Fenster in zwei Variablen gespeichert.

Schritt 5: Monster, wo?
Nun werden wir also nach einem Monster suchen, und über unser Maus-Makro den Cursor auf es setzen und außerdem noch angreifen.
Code:
int monx, mony; /* Global für andere Funktionen :-)*/
/*Dann noch die Pixel Farb-Präprozessorvariablen*/

BOOL ismonster(void) {
int x, y;
COLORREF pixel;
for(x = 0; x < width; x++) {
for(y = 0; y < height; y++) {
pixel = GetPixel(dc, x, y);
if(GetRValue(pixel) == PIXEL_R && GetGValue(pixel) == PIXEL_G && GetBValue(pixel) == PIXEL_B) {
monx = x;
mony = y;
return TRUE; /*ein Pixel mit den gleichen Farbinformationen wurde gefunden*/
}
}
}
return FALSE;
}
Sieht so aus, wie der Code von gerade eben, nur jetzt haben wir hinzugeschrieben, dass er die Schleife von 0 bis zur Breite des Fenster machen soll, dass gleiche mit y und der Höhe des Fensters und dann haben wir noch die globalen Variablen monx und mony mit den Koordinaten des Monsters gefüllt

Jetzt können wir noch einbauen, dass man nach dem roten Cursor suchen soll, also dass das Programm guckt, ob man gerade ein Monster angreift, dass geht genauso:
Code:
BOOL isattacking(void) {
int x, y;
COLORREF pixel;
for(x = 0; x < width; x++) {
for(y = 0; y < height; y++) {
pixel = GetPixel(dc, x, y);
if(GetRValue(pixel) == CURSOR_R && GetGValue(pixel) == CURSOR_G && GetBValue(pixel) == CURSOR_B)
return TRUE; /*Wir sind gerade mit einem Monster am kämpfen*/
}
}
return FALSE; /*Wir kämpfen momentan nicht!*/
}
Man muss nur wieder einen Screenshot von dem Cursor machen, und die Farbinformationen des Cursors in neuen Präprozessorvariablen speichern.

Schritt 6: Items plz!
Will man Items aufheben, oder benutzen, so kann man das mit Hotkeys machen, die man mit keybd_event einfach nur drückt. Man könnte auf diese Weise auf durchgehend die Tasten zum Itemsaufheben schicken, und somit hebt man dann alle Items, die einem begegnen, auf.
Code:
#define pickup(key) keybd_event(key, 0, 0, 0); keybd_event(key, 0, KEYEVENTF_KEYUP, 0);
Muss man um Monster anzugreifen, um deren HP zu sehen, um Items auf zuheben oder wofür auch immer, eine Taste, wie z.B. Shift gedrückt haben, so kann man folgenden Code verwenden:
Code:
int shift(const BOOL mode) {
if(mode) keybd_event(VK_SHIFT, 0, 0, 0);
else keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
return 0;
}
Das kann man natürlich auch noch mit anderen Tasten machen, genauso wie beim Makro:
z.B. pickup(VK_F1) oder pickup(VK_CONTROL)
Um alle Tastencodes zu sehen, drücke .
Beachte, dass die Werte in hexadezimal dargestellt sind, also für 'A' nicht pickup(41), sondern pickup(0x41).

Schritt 7: Der Main Loop
In der Hauptschleife wird nun alles geregelt, es wird geguckt, ob ein Monster in der Nähe ist, ob du gerade am Attackieren eines Monsters bist usw. Beim pickup brauchst du eigentlich keine Abfrage für irgendetwas, du kannst es genauso gut spammen.
Ach und, man könnte noch siene HP kontrollieren, wenn sie aus einem Balken besteht.
Du machst einen Screenshot, holst dir die Farbinformationen der Pixel und die Position, wo die Leiste anfängt und aufhört.
Beispiel, Farbe der Pixel von der Leiste: R > 100 und G < 20 (Max HP: 100, Leiste liegt bei y auf 50, und bei x auf 80 + 0(Anfang)-100(Ende)) :
Code:
int HP&#40;void&#41; {
int i, hp = 0;
COLORREF pixel;
for&#40;i = 0; i &#60; 100; i++&#41; {
pixel = GetPixel&#40;dc, 80 + i, 50&#41;;
if&#40;GetRValue&#40;pixel&#41; &#60; 100 && GetGValue&#40;pixel&#41; > 20&#41; {
hp = 100 - i;
break;
}
}
return 100 - hp;
}
MAIN LOOP (in main()):
Code:
while&#40;TRUE&#41; {
ismonster = is_monster&#40;&#41;;
isattacking = is_attacking &#40;&#41;;
if&#40;ismonster && !isattacking&#41; { /*Monster da, und man attackiert gerade keines, also los&#58; Attacke!*/
coprint&#40;CL_GREEN, &#34;Monster on Position %d/%d&#092;n&#34;, monx + 25, mony + 50&#41;; /*Ach.. die HP Anzeige ist ja über den Köpfen, deswegen addiert man noch etwas dazu, damit der Cursor auch auf das Monster trifft*/
move&#40;monx + 25, mony + 50&#41;;
}
else if&#40;!ismonster && !isattacking&#41; { /*kein Monster und nicht am kämpfen? dann kann man ein bisschen suchen, s. etwas weiter unten*/
randmove&#40;&#41;;
Sleep&#40;1500&#41;;
}
pickup&#40;VK_F2&#41;;
if&#40;GetAsyncKeyState&#40;VK_F9&#41;&#41; /*Willst du das Programm schließen?*/
exit&#40;0&#41;;
Sleep&#40;500&#41;;
}
Hier noch schnell ein Makro um per Zufall irgendwo hin zugehen, dazu muss man zu Beginn noch <time.h> inkludieren:
Code:
#define randmove srand&#40;time&#40;NULL&#41;&#41;; move&#40;rand&#40;&#41;%width, rand&#40;&#41;%height&#41;;
Das war es auch schon, so glaube ich zumindest.

Dann noch einige wenige Tipps und darunter sind alle Funktionen zusammen gehauen.

1. Wenn sich der Title immer ändert, dann kannst du auch den Klassennamen benutzen. Den findest du z.B. mit Spy++ heraus. Dann also nicht FindWindow(NULL, "FensterTitel"), sondern FindWindow("KlassenName", NULL).

2. Je kleiner die Auflösung und der DC ist, umso schneller werden die Loops in der "Finde.das.Monster"-Funktion, man verzichtet zwar auf gute Grafik und Fullscreen, aber man spürt einen erheblichen Unterschied in der Schnelligkeit.

3. Die Pixel ändern sich je nach Grafikkarte. Du kannst die Pixelfarbinformation aber auch mit > oder < abfragen:
if(GetRValue(pixel) > 95 && GetGValue(pixel) < 30 && GetBValue(pixel) < 20)

4. cuprint und coprint sind Funktionen, die ich mir geschrieben habe, um das setzen des Cursors oder der Farbe in der Konsole zu verändern.


.::CODE::.
Die Code Snippets oben können Fehler enthalten und stimmen mit dem Code hier drunter nicht ganz über ein, das liegt daran, dass ich den ganzen Code noch einmal zusammen gefasst und kompiliert habe.
Die Codes oben sind aus dem Kopf heraus aufgeschrieben worden. Jetzt folgt halt noch einmal der ganze Code.

bot.c
Code:
#include &#60;windows.h>
#include &#60;time.h>
#include &#60;stdio.h>
#include &#34;showmsg.h&#34;

#define move&#40;x, y&#41; mouse_event&#40;MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, &#40;&#40;posx + x&#41; * &#40;65535 / GetSystemMetrics&#40;SM_CYSCREEN&#41;&#41;&#41;, &#40;&#40;posy + y&#41; * &#40;65535 / GetSystemMetrics&#40;SM_CXSCREEN&#41;&#41;&#41;, 0, 0&#41;; mouse_event&#40;MOUSEEVENTF_LEFTDOWN, 0,0,0,0&#41;; mouse_event&#40;MOUSEEVENTF_LEFTUP, 0,0,0,0&#41;;
#define pickup&#40;key&#41; keybd_event&#40;key, 0, 0, 0&#41;; keybd_event&#40;key, 0, KEYEVENTF_KEYUP, 0&#41;;

#define PIXEL_R 255
#define PIXEL_G 0
#define PIXEL_B 0

#define CURSOR_R 0
#define CURSOR_G 255
#define CURSOR_B 255

HWND game_hwnd;
HDC dc;
int posx, posy;
int width, height;
int monx, mony;

int shift&#40;const BOOL mode&#41; {
	if&#40;mode&#41; keybd_event&#40;VK_SHIFT, 0, 0, 0&#41;;
	else keybd_event&#40;VK_SHIFT, 0, KEYEVENTF_KEYUP, 0&#41;;
	return 0;
}

int get_dc&#40;void&#41; {
	RECT prect;
	dc = GetDC&#40;game_hwnd&#41;;
	GetWindowRect&#40;game_hwnd, &prect&#41;;
	width = prect.right - prect.left;
	height = prect.bottom - prect.top;
	posx = prect.left;
	posy = prect.top;
	return 0;
}

int HP&#40;void&#41; {
	int i, hp = 0;
	COLORREF pixel;
	for&#40;i = 0; i &#60; 100; i++&#41; {
 pixel = GetPixel&#40;dc, 80 + i, 50&#41;;
 if&#40;GetRValue&#40;pixel&#41; &#60; 100 && GetGValue&#40;pixel&#41; > 20&#41; {
 	hp = 100 - i;
 	break;
 }
	}
	return 100 - hp;
}

int randmove&#40;void&#41; {
	srand&#40;time&#40;NULL&#41;&#41;;
	move&#40;rand&#40;&#41;%width, rand&#40;&#41;%height&#41;;
	return 0;
}

BOOL is_monster&#40;void&#41; {
	int x, y;
	COLORREF pixel;
	for&#40;x = 0; x &#60; width; x++&#41; {
 for&#40;y = 0; y &#60; height; y++&#41; {
 	pixel = GetPixel&#40;dc, x, y&#41;;
 	if&#40;GetRValue&#40;pixel&#41; == PIXEL_R && GetGValue&#40;pixel&#41; == PIXEL_G && GetBValue&#40;pixel&#41; == PIXEL_B&#41; {
  monx = x;
  mony = y;
  return TRUE;
 	}
 }
	}
	return FALSE;
}

BOOL is_attacking&#40;void&#41; {
	int x, y;
	COLORREF pixel;
	for&#40;x = 0; x &#60; width; x++&#41; {
 for&#40;y = 0; y &#60; height; y++&#41; {
 	pixel = GetPixel&#40;dc, x, y&#41;;
 	if&#40;GetRValue&#40;pixel&#41; == CURSOR_R && GetGValue&#40;pixel&#41; == CURSOR_G && GetBValue&#40;pixel&#41; == CURSOR_B&#41;
  return TRUE;
 }
	}
	return FALSE;
}

int main&#40;int argc, char *argv&#91;&#93;&#41; {
	int i = 0;
	BOOL ismonster, isattacking;
	char bar&#91;&#93; = &#34;/-&#092;&#092;|&#34;;
	coprint&#40;CL_WHITE, &#34;Waiting for Game &#91; &#93;&#34;&#41;;
	game_hwnd = NULL;
	while&#40;game_hwnd == NULL&#41; {
 cuprint&#40;18, 0, &#34;%c&#34;, bar&#91;i&#93;&#41;;
 game_hwnd= FindWindow&#40;NULL, &#34;Fenstertitel&#34;&#41;;
 if&#40;++i > 3&#41; i = 0;
 Sleep&#40;100&#41;;
	}
	cuprint&#40;0, 2, &#34;&#34;&#41;;
	coprint&#40;CL_YELLOW, &#34;Process found! Bot is initializing...&#092;n&#34;&#41;;
	ShowWindow&#40;game_hwnd, SW_RESTORE&#41;;
	SetForegroundWindow&#40;game_hwnd&#41;;
	SetFocus&#40;game_hwnd&#41;;
	get_dc&#40;&#41;;
	Sleep&#40;1500&#41;;
	while&#40;TRUE&#41; {
 ismonster = is_monster&#40;&#41;;
 isattacking = is_attacking &#40;&#41;;
 if&#40;ismonster && !isattacking&#41; {
 	coprint&#40;CL_GREEN, &#34;Monster on Position %d/%d&#092;n&#34;, monx + 25, mony + 50&#41;;
 	move&#40;monx + 25, mony + 50&#41;;
 }
 else if&#40;!ismonster && !isattacking&#41; {
 	randmove&#40;&#41;;
 	Sleep&#40;1500&#41;;
 }
 if&#40;HP&#40;&#41; &#60; 30&#41;
 	pickup&#40;VK_F3&#41;;
 pickup&#40;VK_F2&#41;;
 if&#40;GetAsyncKeyState&#40;VK_F9&#41;&#41;
 	exit&#40;0&#41;;
	}
	return 0;
}
Das ist noch die Headerdatei zu dem Ausschnitt aus meinem showmsg.c
showmsg.h
Code:
#define CL_BOLD 0x08
#define CL_BG_BOLD 0x80
#define CL_SPACE &#34;     &#34;
#define CL_SSPACE &#34;   &#34;
#define CL_LSPACE &#34;        &#34;

#define CL_BLACK 0x00
#define CL_BLUE 0x01
#define CL_GREEN 0x02
#define CL_CYAN 0x03
#define CL_RED 0x04
#define CL_MAGENTA 0x05
#define CL_YELLOW 0x06
#define CL_GRAY 0x07

#define CL_BT_BLACK 0x00 | CL_BOLD
#define CL_BT_BLUE 0x01 | CL_BOLD
#define CL_BT_GREEN 0x02 | CL_BOLD
#define CL_BT_CYAN 0x03 | CL_BOLD
#define CL_BT_RED 0x04 | CL_BOLD
#define CL_BT_MAGENTA 0x05 | CL_BOLD
#define CL_BT_YELLOW 0x06 | CL_BOLD
#define CL_WHITE 0x07 | CL_BOLD /* CL_BT_GRAY */

#define CL_BG_BLACK 0x00
#define CL_BG_BLUE 0x10
#define CL_BG_GREEN 0x20
#define CL_BG_CYAN 0x30
#define CL_BG_RED 0x40
#define CL_BG_MAGENTA 0x50
#define CL_BG_YELLOW 0x60
#define CL_BG_GRAY 0x70

#define CL_BG_BT_BLACK 0x00 | CL_BG_BOLD
#define CL_BG_BT_BLUE 0x10 | CL_BG_BOLD
#define CL_BG_BT_GREEN 0x20 | CL_BG_BOLD
#define CL_BG_BT_CYAN 0x30 | CL_BG_BOLD
#define CL_BG_BT_RED 0x40 | CL_BG_BOLD
#define CL_BG_BT_MAGENTA 0x50 | CL_BG_BOLD
#define CL_BG_BT_YELLOW 0x60 | CL_BG_BOLD
#define CL_BG_WHITE 0x70 | CL_BG_BOLD /* CL_BG_BT_GRAY */

#define cuprint ShowCCursor
#define coprint ShowColor

int ShowCCursor&#40;const int x, const int y, const char *message, ...&#41;;
int ShowColor&#40;const WORD color, const char *message, ...&#41;;
Füge das hier unter int monx, mony; und über int shift(const BOOL mode) { ein
Code:
int set_cursor&#40;const char *message, va_list ap, const int x, const int y&#41; {
	CONSOLE_SCREEN_BUFFER_INFO info;
	HANDLE handle = GetStdHandle&#40;STD_OUTPUT_HANDLE&#41;;
	GetConsoleScreenBufferInfo&#40;handle, &info&#41;;
	info.dwCursorPosition.X = x;
	info.dwCursorPosition.Y = y;
	SetConsoleCursorPosition&#40;handle, info.dwCursorPosition&#41;;
	vprintf&#40;message, ap&#41;;
	return 0;
}

int set_color&#40;const char *message, va_list ap, const WORD color&#41; {
	CONSOLE_SCREEN_BUFFER_INFO info;
	HANDLE handle = GetStdHandle&#40;STD_OUTPUT_HANDLE&#41;;
	GetConsoleScreenBufferInfo&#40;handle, &info&#41;;
	info.wAttributes = color;
	SetConsoleTextAttribute&#40;handle, info.wAttributes&#41;;
	vprintf&#40;message, ap&#41;;
	SetConsoleTextAttribute&#40;handle, CL_GRAY&#41;;
	return 0;
}

int ShowCCursor&#40;const int x, const int y, const char *message, ...&#41; {
	va_list ap;
	va_start&#40;ap, message&#41;;
	set_cursor&#40;message, ap, x, y&#41;;
	va_end&#40;ap&#41;;
	return 0;
}

int ShowColor&#40;const WORD color, const char *message, ...&#41; {
	va_list ap;
	va_start&#40;ap, message&#41;;
	set_color&#40;message, ap, color&#41;;
	va_end&#40;ap&#41;;
	return 0;
}

Es mag sein, dass ich nonsense Müll geschrieben habe und dafür muss ich mich mal eben rechtfertigen
1. Bin ich heute morgen um 8 Uhr ins Bett gegangen.
2. Bin ich heute um 15 Uhr aufgestanden. (Man kann anhand der Differenz der Zeiten nicht sagen, dass ich zu diesem Zeitpunkt hätte wach sein müssen)
3. Trafen 1. und 2. auf die letzte Woche so gut wie immer zu
4. Hör ich laut SOAD und singe mit
...Das lenkt ab O_o

Ich werde diesen Text irgendwann noch einmal auf Fehler überprüfen..
Mir ist gerade spontan die Idee gekommen... nur leider ein wenig spät :?



Wenn möglich bitte einmal durchlesen, und mich auf alle Fehler aufmerksam machen...
Ich wusste während des Schreibens nicht einmal mehr, was ich schreiben wollte
P0!NT3R is offline  
Thanks
10 Users
Old 07/04/2007, 18:39   #2
 
elite*gold: 0
Join Date: Apr 2007
Posts: 66
Received Thanks: 15
Uhm ja. Bei so Pixelbots ist es glaub ich für die Geschwindigkeit besser, wenn man nicht pixelweise springt (ich hab den Code nur überflogen, wenn das hier nicht gemacht wird auch egal, ich sags nochmal), sondern in sagen wir 4er-Sprüngen. Zumal die Chance, dass ein Monster nichtmal 4 Pixel breit auf dem Bildschirm ist kaum passieren wird, vorher wirds wohl weggeclippt. Das macht immerhin in der Horizontalen/Vertikalen jeweils 1/4 Aufwand uns insgesamt 1/16 und damit ganz grob gesagt 16 mal so schnell. Das lohnt sich mit Sicherheit.
wiz is offline  
Old 07/06/2007, 13:49   #3
 
elite*gold: 0
Join Date: Sep 2006
Posts: 199
Received Thanks: 26
Dafür gibts i.d.r ne Menge Fehler.

Weil der Bot ja relativ zum jeweiligem Pixel clicken muss. Der einzige wirkliche Mittelweg ist zeilenweise zu scannen und bei einem Treffer die jeweilige Zeile nicht weiter zu scannen und zusätzlich ein paar Zeilen nach unten zu skippen (je nachdem wieviele Pixel der Monstername vertikal umfasst). Auf die Art verpasst man nur Monster wenn die Namen exakt auf den gleichen Y Werten stehen.

Alternativ dazu kann man auch nach einem Hit die Ergebnisse um den Hit herum ausklammern. Ist etwas auwändiger aber auch nützlich.

Btw: Pointer hast du auch ein Tutorial auf Deutsch um nicht Pixeldaten sondern d3d Daten auszuwerten (also die Modelle zu CRCen) ?
Christoph_ is offline  
Old 07/06/2007, 18:47   #4
 
elite*gold: 0
Join Date: Apr 2007
Posts: 152
Received Thanks: 10
Was meinst du genau?
Es wird nach einem Monster gesucht, wenn das Programm eines findet, attackiert es dieses.
Und dann bekommt man einen neuen Cursor, wenn das Programm nun wieder ein Monster findet, außerdem aber noch diesen Cursor, dann macht es nichts, sondern attackiert einfach weiter.
Das setzt voraus, dass man nur einmal auf das Monster klicken muss, um es dauerhaft anzugreifen.
Und auch noch, dass sich die Farbe des Cursors dann ändert.

Man könnte es natürlich auch für Spiele, die sich in den Punkten ein klein wenig unterscheiden, spezifizieren.
Quote:
Alternativ dazu kann man auch nach einem Hit die Ergebnisse um den Hit herum ausklammern. Ist etwas auwändiger aber auch nützlich.
Und was meinst du damit?..

Ja, hier so zufällig in meiner Hosentasche, sowie tausend andere Tutorials für alle möglichen Themen? O_o

Ich habe das scheiß Tutorial irgendwann mitten in der Nacht gemacht, und ich habe momentan Ferien, heute war ich wieder bis 9 Uhr am PC und bin gerade aufgewacht...
Mein Kopf dröhnt noch total und ich habe Augenschmerzen.
Und so ging das die letzte Woche jeden Tag, da kann man nicht viel erwarten :?
P0!NT3R is offline  
Old 08/19/2007, 20:17   #5
 
elite*gold: 0
Join Date: Oct 2005
Posts: 2,487
Received Thanks: 215
Hi,

erstmal danke für den Thread, kam wie ein Geschenk vom Himmel, als ich meine au3 Makros in ne Hochsprache umschreiben wollte. Aber VS Express unterstützt keine winAPI Muss ich mir jetzt tatsächlich die Studentenversion kaufen, um bei Microsoft zu bleiben?

Bloodshed geht zwar, aber ich find den nich so prickelnd, sieht nicht so gut aus, ist aber verdammt nebensächlich

Kann man die RGB Farbcode auch umrechnen, zb aus den Hexadezimalen oder Dezimalen Wert? Denn das au3 Window Info Tool bietet auch RGB Werte, sieht dann so aus:
RGB: Hex: 0xFFFFFF Dec: 16777215



Für andere: Falls jemand eine Sleepfunktion braucht:
Diese ist in der WinAPI definiert.. Also #include <windows.h>
und sie ist case sensitiv also Sleep(int millisekunden);
Term!nX is offline  
Old 10/07/2007, 18:46   #6
 
bawynne90's Avatar
 
elite*gold: 0
Join Date: Oct 2007
Posts: 16
Received Thanks: 0
translated page

here is a link translating all this german to english
bawynne90 is offline  
Old 11/07/2007, 16:55   #7
 
elite*gold: 0
Join Date: Apr 2006
Posts: 2,524
Received Thanks: 74
umrechnung von 0xFFFFFF zu den farben
normalerweise ists recht einfachbeispiel 0xFFFFFF)
das 0x weg
--> FFFFFF
alle 2 stellen sind eine Farbe, also
FF FF FF (R G B)
das einfach in hex-converter oder windows-taschenrechner und zu dezimal machen
tada, 255 255 255
4C1D^ is offline  
Old 11/07/2007, 17:41   #8
 
elite*gold: 20
Join Date: Dec 2006
Posts: 839
Received Thanks: 91
@Term!nX

Visual C++ Express unterstützt die WinAPI, lediglich für die MFC müsste man sich eine Studio-Version kaufen. Eine Anleitung zur Einrichtung des Windows Platform SDKs und damit der WinAPI-Unterstützung in Visual C++ Express-Version findest Du hier:


Musst eventuell oben noch auf "Using the Platform SDK" klicken.
Assass1n is offline  
Old 01/24/2008, 17:47   #9
 
elite*gold: 0
Join Date: Sep 2007
Posts: 5
Received Thanks: 0
Moin

#include <windows.h> /*Um die Win32 API zu nutzen, müssen wir natürlich die Win Headerdatei inkludieren;-)*/

ich kann damit gerade nix anfangen.Kann mir mal einer von euch sagen was ich da machen muss?
seb19881 is offline  
Old 02/18/2008, 01:26   #10
 
elite*gold: 0
Join Date: Feb 2008
Posts: 2
Received Thanks: 0
Ja also erstmal danke für das gute Tut aber ich hab doch noch ne frage...
Wenn ich den bot so nehmen das richtige fenster(KalOnline) angebe und der das auch öffnet dann dürfte mein HDC dc nicht NULL sein oder? Woran kann das liegen? Wenn ich zb ein anderes fenster (calc.exe) nehme dann klappt das wunderbar nur bei Kal nicht

in dem sinne Mfg Blechdose
Blechdose is offline  
Old 02/19/2008, 00:55   #11
 
elite*gold: 0
Join Date: Feb 2008
Posts: 2
Received Thanks: 0
Also ich hab hier GLE fehlercode 5 das heißt ja kein zugriff kann man da was machen? bzw. das iwie umgehen oder so zb. einfach nen anderen HDC nehmen von nem fenster das daneben liegt?

edit:

Lösung des Problems ist einfach den HDC von einer anderen anwendung zu benutzen z.b. so:
int get_dc(void)
{
system("fake.exe"); // Sollte eine Anwendung mit hdc sein
fake_hwnd = FindWindow(NULL, "fake.exe");
dc = GetDC(fake_hwnd);
GetWindowRect(game_hwnd, &prect);
width = prect.right - prect.left;
height = prect.bottom - prect.top;
posx = prect.left;
posy = prect.top;
return 0;
}
(sry für offtopic)
Blechdose is offline  
Old 06/18/2009, 10:38   #12
 
neofox's Avatar
 
elite*gold: 0
Join Date: Oct 2007
Posts: 88
Received Thanks: 2
Question

Hi ich habe versucht ein aimbot draus zu machen plos was mach ich falsch das spiel öffnet er aber er aimt nicht auf den Gegner bez er macht Garnichts ausehr das spiel öffnen er gibt noch Nichtmal die naricht raus für den gefundenen Gegner hier mal der code:
Code:
#include <windows.h>
#include <time.h>
#include <stdio.h>
#include "showmsg.h"

#define move(x, y) mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, ((posx + x) * (65535 / GetSystemMetrics(SM_CYSCREEN))), ((posy + y) * (65535 / GetSystemMetrics(SM_CXSCREEN))), 0, 0); mouse_event(MOUSEEVENTF_LEFTDOWN, 0,0,0,0); mouse_event(MOUSEEVENTF_LEFTUP, 0,0,0,0);
#define pickup(key) keybd_event(key, 0, 0, 0); keybd_event(key, 0, KEYEVENTF_KEYUP, 0);

#define PIXEL_R 218
#define PIXEL_G 3
#define PIXEL_B 8

#define CURSOR_R 255
#define CURSOR_G 255
#define CURSOR_B 255

HWND game_hwnd;
HDC dc;
int posx, posy;
int width, height;
int monx, mony;

int set_cursor(const char *message, va_list ap, const int x, const int y) {
	CONSOLE_SCREEN_BUFFER_INFO info;
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	GetConsoleScreenBufferInfo(handle, &info);
	info.dwCursorPosition.X = x;
	info.dwCursorPosition.Y = y;
	SetConsoleCursorPosition(handle, info.dwCursorPosition);
	vprintf(message, ap);
	return 0;
}

int set_color(const char *message, va_list ap, const WORD color) {
	CONSOLE_SCREEN_BUFFER_INFO info;
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	GetConsoleScreenBufferInfo(handle, &info);
	info.wAttributes = color;
	SetConsoleTextAttribute(handle, info.wAttributes);
	vprintf(message, ap);
	SetConsoleTextAttribute(handle, CL_GRAY);
	return 0;
}

int ShowCCursor(const int x, const int y, const char *message, ...) {
	va_list ap;
	va_start(ap, message);
	set_cursor(message, ap, x, y);
	va_end(ap);
	return 0;
}

int ShowColor(const WORD color, const char *message, ...) {
	va_list ap;
	va_start(ap, message);
	set_color(message, ap, color);
	va_end(ap);
	return 0;
}

int get_dc(void) {
	RECT prect;
	dc = GetDC(game_hwnd);
	GetWindowRect(game_hwnd, &prect);
	width = prect.right - prect.left;
	height = prect.bottom - prect.top;
	posx = prect.left;
	posy = prect.top;
	return 0;
}

BOOL is_monster(void) {
	int x, y;
	COLORREF pixel;
	for(x = 0; x < width; x++) {
 for(y = 0; y < height; y++) {
 	pixel = GetPixel(dc, x, y);
	if(GetRValue(pixel) > 150 && GetGValue(pixel) < 70 && GetBValue(pixel) < 55)
	{
		monx = x;
		mony = y;
		return TRUE;
 	}
 }
	}
	return FALSE;
}

int main(int argc, char *argv[]) {
	int i = 0;
	BOOL ismonster;
	char bar[] = "/-\\|";
	coprint(CL_WHITE, "Warte auf test[ ]");
	game_hwnd = NULL;
	while(game_hwnd == NULL) {
 cuprint(18, 0, "%c", bar[i]);
 game_hwnd= FindWindow(NULL, "test");
 if(++i > 3) i = 0;
 Sleep(100);
	}
	cuprint(0, 2, "");
	coprint(CL_YELLOW, "test gefunden! Bot ist Aktiv\n");
	ShowWindow(game_hwnd, SW_RESTORE);
	SetForegroundWindow(game_hwnd);
	SetFocus(game_hwnd);
	get_dc();
	Sleep(1500);
	while(TRUE) {
 ismonster = is_monster();
  if(ismonster) {
 	coprint(CL_GREEN, "Fadenkreuz auf Position %d/%d\n", monx + 25, mony + 50);
 	move(monx + 25, mony + 50);
 }
 if(GetAsyncKeyState(VK_F9))
 	exit(0);
	}
	return 0;
}
neofox is offline  
Old 06/20/2009, 22:59   #13
 
elite*gold: 0
Join Date: May 2009
Posts: 642
Received Thanks: 336
HammaTut thx für die mühe
<c0d3r> is offline  
Old 06/21/2009, 00:39   #14
 
elite*gold: 0
Join Date: Nov 2008
Posts: 576
Received Thanks: 191
Quote:
Originally Posted by <c0d3r> View Post
HammaTut thx für die mühe
was holst du da für alte threads hoch :P? maaan der code turnd mich ja ma total ab
__wadim is offline  
Reply


Similar Threads Similar Threads
Simpler Angelbot
03/18/2010 - Metin2 Private Server - 3 Replies
Hi suche nach nen Simplen Angelbot der auf jeder Version von Metin2 funktioniert! Hatte damals mal einen von Banjo wo man Köder auf F1,F2,F3 angelfetrigkeit F4 legen musste sowas such ich wd! Kein Großes einstellen rumfummeln ectpp! Wer einen Angelbot besitzt der sau einfach zu bedienen ist ohne Große Einstellungen bitte in einer Privaten Naricht an mich senden gebe auch THX! Danke^^
simpler Macro Bot
01/27/2010 - Aion Hacks, Bots, Cheats & Exploits - 7 Replies
Heyho alle, hab mir aus langeweile mal nen Macro Bot gebaut hab den heute erst geschrieben, wollt mal sehn wie der so funzen würd weil bin jetzt neu bei Aion ^^ der funktioniert jetzt auch schon gut, nur hatte paar probleme mit postmessage und keybd_event :o How to use: Einfach wie in Aion die makros schreiben :D
simpler Flaschenbot!!
05/25/2009 - Browsergames - 7 Replies
kann nicht einer von euch super genialen (ernst gemeint!) scripter einen simplen und gut laufenden flaschenbot erstellen..?? ich würde es ja selber gerne machen aber so schlau bin ich da auch nicht -.- z.B.: wie die alten flaschenbots für Hamburg... einfach einen für berlin scripten... Mfg brausebrocken..
SIMPLER SPAMBOT HIIILFE :(
02/20/2009 - GW Bots - 12 Replies
hiho community ich bräuchte dringend einen simplen spambot für gw..... er muss auch nur jede 15 oder 20 sekunden arrow up und danach enter drücken pls helft mir :(
Simpler Spam Bot
01/10/2009 - Metin2 Hacks, Bots, Cheats, Exploits & Macros - 4 Replies
Hier mein universal spambot funkt net nur bei metin2 einfach text eingeben und starten gechwindigkeitseinsellung 1000 entspricht 1 sekunde Ihr solltet den Spambot nur benutzen wenn ihr metin im fenstermodus spielt damit ihr jederzeit den stopbuton klicken könnt Bei einsellungen unter o,5 sekunden also unter 500 macht das das Siel nicht mehr mit und ihr fliegt vom server. http://renuwell.beepworld.de/files/Chat%20Spamer% 20lolomgwtf.exe



All times are GMT +1. The time now is 07:12.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.