OldSchoolHack

Registrieren / Anmelden Deutsch

[TUT] CSS Extern Radar + bunnyhop

icon Thema: [TUT] CSS Extern Radar + bunnyhop

Anmeldungsdatum: Mär 2011

Beiträge: 978

Benutzer-Bewertung:

89 positiv
6 negativ
*Achtung: wall of text incoming*

Hallo erstmal,


Ziele dieses tuts:
- Externer Radarhack
- Externer Bunnyhop 100% hit.


Anforderungen:
-C++ oder sonstige programmiersprache mit der man speicher von anderen prozessen auslesen kann und ein radar grafisch darstellen kann. (die code snippets von mir sind in c/c++)
-Umgang mit cheatengine o.ä. (finden von pointern)
-CS:S sollte man besitzen...

-kein copy paste, ich werde hier nur das prinzip erklären, ihr werdet fast alles selber machen müssen!
-das hier ist ein tut, fragt nicht nach download oder sonstwas.



1.: Radarhack:

1.1: Was soll das radar können?

*spieler auf externem fenster darstellen.
*hp und namen anzeigen.
*anzeigen ob der gegner über oder unter einem ist.
*sichtrichtung aller spieler anzeigen.
*möglichkeit zur vollen rotation geben, also, dass sich die map zur sichtrichtung ausrichtet

2.Was brauchen wir?

*fenster zum ausgeben des radars.
*koordinaten aller spieler.
*hp und namen aller spieler.
*sichtrichtung aller spieler.

3.Wie finden wir das alles?

freundlicherweise hat css ein playerstructarray, in dem alle erforderlichen informationen abgespeichert sind.
wie finden wir das array?
Jetzt beginnt auch schon der Punkt, an dem ihr anfangen dürft zu arbeiten^^

aber ein paar tipps:

-Das Array besteht aus 32 solcher playerstructs.
-jede struct ist 0x140 groß.
-die erste playerstruct beginnt bei client.dll+0x?????? -> 0x?????? == BaseAdress + 0x144, also 2 pointer führen zur baseadress.
-die offsets sind wie folgt:
TEXT Code:
  1.  
  2. char[32] name = 0x10
  3. DWORD Team = 0x30
  4. DWORD Hp = 0x34
  5. float x = 0x38
  6. float y = 0x3C
  7. float z = 0x40
  8. float pitch = 0x44
  9. float yaw = 0x48
  10. float roll = 0x4C
  11.  

Wie findet man diese offsets?

mit dem wissen, dass es so ein playerstructarray geben muss irgendwo, lässt sich das ganze ziemlich einfach filtern.
sucht zuerst nach dem eigenen namen, öffnet die adressen dann im memviewer, wenn ihr die namen der anderen spieler in direkter nähe seht, ist das ein gutes zeichen.
dann nach eurem leben scannen, dmg kriegen -> weitersuchen usw..., dann bei den gefundenen adressen ausschau nach adressen halten, die auch in der nähe von eurem namen sind.
dann die funktionen anschauen, die auf die vars zugreifen, den/die pointer darauf reversen = base. Adresse - Base = offset. Done.
dann noch allgemein gucken, was denn so in eurem struct passiert, wenn ihr nichts macht, oder euch was richtung norden bewegt, und raten, was was ist^^
z.b. speichert der anscheinend noch ne kleine history von den letzten paar x&y koordinaten, anscheinend für diese footsteps für den normalen radar.
die könnte man theoretisch auch noch einbauen...
ich hab am anfang versehentlich so einen history offset für die koordinaten genommen (mit meinem glück natürlich den letzten ) und mich gewundert, wieso mein radar nen ~3 sekunden delay hatte, aber mein yaw aktuell war^^

nochn kleiner tip beim suchen von adressen.
ihr solltet immer wenn ihr nach adressen sucht euch einen dedicated server ohne vac aufsetzen und dann dadrauf joinen.
Wenn ihr ein spiel über "spiel erstellen" startet, ist die hl2.exe nämlich zugleich server, als auch client, und dann könnt ihr beim suchen über adressen stolpern, die normalerweise nur dem server zur verfügung stehen.

wie lesen wir das ganze nun aus?

dazu erstellen wir erstmal ein kongruentes eigenes playerstructarray:
CPP Code:
  1.  
  2. struct player
  3. {
  4. BYTE hp;
  5. char name[32];
  6. BYTE team;
  7. float x;
  8. float y;
  9. float z;
  10. float pitch;
  11. float yaw;
  12. float roll;
  13. } players[32] = {0};
  14.  

dann das ganze auslesen:

CPP Code:
  1.  
  2. for (int i = 1; i <= 32; i++)
  3. {
  4. tempAdress = BaseAdress + 0x140*i + HP_OFFSET;
  5. //auslesen des speichers @ tempAdress von größe von sizeof(BYTE) und speichern in players[i].hp.
  6. //usw...
  7. }
  8.  

Das ganze ist extrem unperfomant und lässt sich deutlich optimieren indem man das ganze array auf einmal ausliest

dann haben wir schonmal alle relevanten daten in unserer struct.



4. Wie bringen wir das jetzt auf unser fenster?

z.b. so in c++: http://www.virtual-maxim.de/tilemap-1/
mit den beiden klassen von dort lässt sich schnell was in nen fenster zeichnen.

Frisch hat uns hier noch eine funktion zum zeichnen von text in d3d9 bereitgestellt (danke!):
CPP Code:
  1.  
  2. void gDrawing::DrawText(LPD3DXFONT font,D3DCOLOR color,int x,int y,const char* text,...)
  3. {
  4. va_list va_alist;
  5. char szBuffer[1024] = { '1' };
  6.  
  7. va_start( va_alist, text );
  8. vsprintf( szBuffer, text, va_alist );
  9. va_end( va_alist );
  10.  
  11. RECT r = {x,y,0,0};
  12. font->DrawText(0,szBuffer,-1,&r,DT_CALCRECT,color);
  13. font->DrawText(0,szBuffer,-1,&r,DT_CENTER,color);
  14. }
  15.  

vorher noch einmalig den font erstellen:
CPP Code:
  1.  
  2. LPD3DXFONT Fontname;
  3. D3DXCreateFont(g_pDevice,15,0,FW_BOLD,0,false,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH
  4.  

was die parameter bedeuten verrät uns die msdn:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb172773%28v=vs.85%29.aspx

ich kann ebenfalls GDI+ empfehlen, ist vllt sogar etwas einfacher.
http://www.codeproject.com/KB/GDI-plus/startinggdiplus.aspx

koordinaten berechnen:
wie rechnen wir nun die css koordinaten in koordinaten für unser radar um?


z.b. so für ein 400x400 fenster:
CPP Code:
  1.  
  2. x=((players[focusindex].x-players[i].x)/AUFLOESUNG)*-1+200; // aufloesung = zahl, z.b. 10. - je größer, desto größer die range.
  3. y=(players[focusindex].y-players[i].y)/AUFLOESUNG+200; // +200 weil ich nen 400x400 fenster habe und es relativ zum 200x200 punkt sein soll.
  4.  


ok, nice, aber woher krieg ich den urspungsspieler, also bestenfalls mich, also den focusindex zu dem ich die relativen koordinaten berechne?

spielername des focusses ist in client.dll+0x?????? abgespeichert.
allerdings kann man da auch pfuschen und einfach den namen vergleichen...
also:
CPP Code:
  1.  
  2. if (strcmp(Myname, players[i].name) == 0)
  3. {
  4. focusindex = i;
  5. }
  6.  
allerdings gilt dabei aufzupassen, dass ihr nicht euch selber noch in den kaputten structs findet...
also nur den zuerst gefundenen namen nehmen - danach breaken, oder wenn ihr alles in einer schleife macht ne kontrollvariable setzen.


damit können wir uns nun namen, hp, team und das auch noch an der richtigen stelle ausgeben lassen!

vergesst nicht zu prüfen, ob das ganze sich überhaupt noch in eurem fenster befindet...


CPP Code:
  1.  
  2. wchar_t NameBuffer[33] = {0};
  3. wchar_t xBuffer[4] = {0};
  4.  
  5. size_t origsize = strlen(players[i].name) + 1;
  6. const size_t newsize = 33;
  7. size_t convertedChars = 0;
  8. mbstowcs_s(&convertedChars, NameBuffer, origsize, players[i].name, _TRUNCATE);
  9. d3d.DrawText(NameBuffer,mapplayers[i].x,mapplayers[i].y, 0xaaffff00);
  10.  
  11. _itow_s(players[i].hp, xBuffer, 10);
  12. d3d.DrawText(xBuffer,mapplayers[i].x,mapplayers[i].y + 14, 0xaaffff00);
  13.  
  14. _itow_s(players[i].team, xBuffer, 10);
  15. d3d.DrawText(xBuffer,mapplayers[i].x,mapplayers[i].y + 25, 0xaaffff00);
  16.  

mapplayers.x/y??????????

ich hab mir die umgerechneten koordinaten nochmal in ner extra struct abgespeichert, darauf kann man auch verzichten, und direkt die umgerechneten koordinaten eintragen.
CPP Code:
  1.  
  2. //(players[focusindex].x-players[i].x)/6*-1+200
  3. //(players[focusindex].y-players[i].y)/6+200;
  4.  

über/unter einem ausgeben:
CPP Code:
  1.  
  2. if (players[i].z + 50 < players[focusindex].z)
  3. {
  4. map_sprites[29].SetPosition(mapplayers[i].x + 5, mapplayers[i].y);
  5. map_sprites[29].Draw();
  6. }
  7. else if (players[i].z - 50 > players[focusindex].z)
  8. {
  9. map_sprites[29].SetPosition(mapplayers[i].x + 5, mapplayers[i].y - 12);
  10. map_sprites[29].Draw();
  11. }
  12. else
  13. {
  14. map_sprites[28].SetPosition(mapplayers[i].x + 5, mapplayers[i].y - 5);
  15. map_sprites[28].Draw();
  16. }
  17.  

Entfernung ausgeben: (Thanks to Frisch)

CPP Code:
  1.  
  2. float GetDistance(float Pl1[3],float Pl2[3]) //xyz 1. spieler, xyz 2. spieler
  3. {
  4. float x = Pl1[0] - Pl2[0];
  5. float y = Pl1[1] - Pl2[1];
  6. float z = Pl1[2] - Pl2[2];
  7.  
  8. return (float)sqrt(x*x + y*y + z*z);
  9. }

5. Yaws anzeigen lassen.

wie geben wir die sichtrichtung aus?

die yaw bewegt sich zwischen -180 - +180.
was wohin zeigt, dürft ihr selbst herausfinden^^

wofür sind pitch und roll?
theoretisch sind darin die pitch: sicht nach oben/unten (-89 - +89), und die roll - neigung, wobei ich mir nicht die mühe gemacht habe roll zu überprüfen...
wofür man das brauchen könnte, ka^^


6. wie lassen wir die map zur sichtrichtung rotieren?

dafür sind einige kleiner codeänderungen nötig, hier das prinzip:

-spielermapcoords berechnen (schon getan)
-relation zum ursprung herstellen.
-die koordinaten entsprechend dem yaw des focusplayers ausrichten.

formel zur koordinatenberechnung:
TEXT Code:
  1. x = x' * cos(alpha) - y' * sin(alpha)
  2. y = x' * sin(alpha) + y' * cos(alpha)

in cpp könnte das dann so aussehen:

CPP Code:
  1.  
  2. float RadToDeg(float alpha)
  3. {
  4. return alpha/180.0*3.1415926535;
  5. }
  6.  
  7. int tmpx, tmpy;
  8.  
  9. tmpx = ((players[focusindex].x-players[i].x)/12)+200;
  10. tmpy = (players[focusindex].y-players[i].y)/12*-1+200;
  11.  
  12. tmpx -= mapplayers[focusindex].x;
  13. tmpy -= mapplayers[focusindex].y;
  14.  
  15. mapplayers[i].x = tmpx * (float) cos((long double) RadToDeg(players[focusindex].yaw)) - tmpy * sin((long double) RadToDeg(players[focusindex].yaw)) + 200;
  16. mapplayers[i].y = tmpx * (float) sin((long double) RadToDeg(players[focusindex].yaw)) + tmpy * cos((long double) RadToDeg(players[focusindex].yaw)) + 200;
  17.  

jetzt müssen wir noch die yaws der spieler anpassen, das geht einfach:

CPP Code:
  1.  
  2. players[i].yaw -= players[focusindex].yaw;
  3.  

das sollte es im großen und ganzen gewesen sein, ein paar kleinere sachen könnten noch anfallen, aber nichts, was nicht zu lösen wäre^^


7. Wie sieht das ganze dann aus?

z.b. so:
http://img825.imageshack.us/img825/3205/radaru.png
oder so:
http://img832.imageshack.us/img832/2667/radarlol.jpg

Remarks:
-yaw ist auch ein bisschen tricky, aber geht.
-css muss im fenstermodus gespielt werden um das overlay zu haben. wenn ihr wie ich 2 monitore habt und das radar auf dem 2. habt könnt ihr auch vollbild spielen solange ihr zum anzeigen des radars gdi+ benutzt.
-css kann im fenstermodus ohne rand mit den startparametern '-windowed -noborder' gespielt werden. die kann man z.b. in der steam bibliothek einstellen
-EDIT: achja nochwas. css räumt den speicher NICHT auf wenn ihr vom server runtergeht/raufjoint, die kaputten spielerstructs müsst ihr also selber rausfiltern, wenn auf dem nächsten server weniger spieler sind. (tipp: x,y und hp auf != 0 testen)


todo?:
was man jetzt noch machen könnte, wären folgende sachen:
-nicht externes fenster -> overlay
-das ganze 3dimensional umsetzen -> esp
-filter -> nur gegnerisches team, etc...
-maphintergrundradarbild laden.


Bunnyhop:

das geht ganz einfach, gibt ne statische adresse, client.dll + 0x??????.
die auslesen und dann noch einen konstanten offset rauf und man hat seine auslese adresse.
BYTE inair != 255 wenn auf boden.
achtung die adresse ändert sich seit dem 13.10.11 update, wenn man vom server runter/wieder raufgeht also muss man permanent die adress auslesung machen.

zum senden der leertaste:
http://msdn.microsoft.com/de-de/library/ms932719.aspx
http://msdn.microsoft.com/de-de/library/aa453247.aspx

z.b. sieht das dann so aus für die alt taste:
CPP Code:
  1.  
  2. if(GetKeyState(VK_LMENU) & 1<<15)
  3. {
  4. if(value != 255)
  5. {
  6. m_jump();
  7. }
  8. }
  9.  

Credits:
KN4CK3R (für die tolle Seite hier: https://www.oldschoolhack.me/)
sMp (externer triggerbot tut: https://www.oldschoolhack.me/forum/tutorials/6198,css-externer-triggerbot.html)
GameDeception (an die muss man einfach credits geben: http://www.gamedeception.net/)
SilverDeath (guess what)


bei fragen, einfach hier schreiben...
bitte keine requests^^

Mfg SilverDeath

PS:tut darf gerne kopiert werden, aber bitte link auf den original artikel hier auf osh, und mir volle credits geben.
wäre auch nett, wenn derjenige den link dann einmal hier postet, damit ich auch in dem anderen forum auf fragen eingehen kann.


(Letzte Aktualisierung: 16.10.2012 21:40)

Paar Noobcopypastefallen entfernt weil mir die leute dann im irc auf den geist gingen...


__________________

http://www.abload.de/img/signfj5o.png
Spoiler
Vids:
Zitate:
Spoiler

Zitat von xst
Vater KN4CK3R, der du hängst im irc, geheiligt werde dein Botnet, dein P7 v1.337 komme, die Bannwelle geschehe, wie in CS:S als auch in CS:GO, führe uns nicht in Versuchung, sondern erlöse uns von all dem c+p-Shit.
Zitat von f4gsh0t_h4x
VAC ist an,immer,überall
Zitat von gibson.w
Ich mag braune Würstchen
Zitat von irc
<SilverDeath> KN4CK3R bistn nub
<~KN4CK3R> kk
Zitat von irc
<OrkSchamane> das prob is das viele dieser eig. recht guten bücher englisch sind ...
<OrkSchamane> da habe ich's ja doppelt schwer
<~KN4CK3R> falsch
<~KN4CK3R> das prob is dass du programmieren willst ohne englisch zu können
Zitat von irc
<SilverDeath> Ich schwöre dir Dr_Pepper Ich bumms deine Mutter tot Mann!
<Dr_Pepper> danke.
<SilverDeath> bitte
Zitat von irc
<~KN4CK3R> dann liegts wenigstens an mir
<~KN4CK3R> nur noch rausfinden warum -.-
<SilverDeath> ja sicher
<SilverDeath> an wem sonst?
* You were kicked by KN4CK3R (kick)
Zitat von Dr_Pepper
ihr seit beide dumm
Tutorials:
Releases:
Gifs:
Spoiler
http://www.abload.de/img/uberesp2sgul2.gif
https://i.imgur.com/Z5VQMrV.gif
http://www.abload.de/img/minesweeperzgaef.gif