Terve kaikille,
Kaikki on varmaa nytten heti tuomitsemassa tätä aihetta, joka on kyllä aivan selvää. Noh siitä huolimatta aijon esittää kysymykseni.
Eli tarkoitus olisi kehittää jonkinlainen aimbotti, peliksi valitsin luultavasti helpon Counter-Striken. Eli aikomukseni olisi koittaa luoda aimbottia, mutta vakuutan tässä että en tule jakamaan sitä verkossa tai missään muuallakaan ja itse käytän tuota vain ja ainoastaan testinä.
Eli tarkoitus ei ole alkaa käyttämään tuota aimbottia, vaan tykkään vaan haasteista jotka ovat vaikeita. Tämän avulla voin oppia kehittämään jotain muuta hyödyllistä ei huijaus softaa.
Vakuutuksena annan vielä sen, että en halua menettää omaa Steam accoa vain tyhmän aimbotin takia. Eli tarkoituksena on tehdä vain ja ainoastaan testinä aimbot.
...noh nytten kun kerran ole saanut selitettyä epätoivosesti, että mitä aijon aimbotilla tehdä ja miksi koitan tehdä sitä, niin kysyisinkin teiltä jotka tietävät asiasta jotain vähän algorytmeistä.
Eli hakulla löytyi täältä ohjelmointiputkastakin aikasempia aihetta käsitteleviä viestejä. Tosin siinä kaikki halusivat käyttää pikselin väri hakua aimbotissa.
Minusta tuo pikselin ruudusta haku tekniikka on hieman kökkö, eli millä tavalla tuo ns. kunnon aimbotit tehdään?
Toimiiko se niin, että otetaan kartasta kopio ja etsitään muistipaikasta toisten pelaajien koordinaatit. Tämän jälkeen koordinaatteja verrataan karttaan ja jos kartan mukaan pelaaja näkyy niin hiiri siirtyy osoittamaan pelaajaa?
Eli onko yllä kertomani tekniikka hyvä vai onko vielä parempia tekniikoita?
-.Kiitos
Ota selvää miten verkkoprotokolla toimii. Sitten teet clientin ja serverin väliin oman ohjelmasi joka pitää listaa pelaajista ja niin halutessasi lähettää luoteja koordinaatteihin, joissa headshot onnistuu.
Jos haluat selvitä helpommalla, vaihdat vain tekstuurit kirkkaan keltaisiksi ja poistat valot ja varjot käytöstä. Sitten botti etsii ruudulta pikseleitä ja ampuu niitä kohti. Värisävyllä voit määrittää parhaat osuma-alueet.
Eikös tuo verkkoprotokollan selvittäminen ole miltein mahdotonta? Itse olen käsittänyt asian niin, että tieto joka kulkee clientin ja serverin väillä on cryptattua ja todella vaike selvittää.
Ja eikös ohjelman pitäisi tietää missä kohdassa ovat seinät, koska eihän headshot mahdollisuutta voi selvittää muuten paitsi, jos tiedetään että vastustajan pää todella näkyy minulla eikä välissä ole seinää...
Itse koodasin CS1.6 ESPin (joka on helposti laajennettavissa aimbotiksi) lukemalla tarvittavat koordinaatit suoraan hl.exen muistista. Kun tiedetään kameran ja pelaajien koordinaatit, niin yläastetrigonometrialla pystytään selvittämään mihin kohtaan näyttöä se tähtäin pitää siirtää. Tästä lähestymistavasta löytyy hyvä tutoriaali täältä: http://sraeg.net/work/aimbottut/
Harvat cs-aimbotit tai muutkaan quake-xiitit toimii tällä tavalla. Quaken engine on open sourcea ja ksiitterit osaavat ottaa siitä hyödyn irti, varsinkin cl_enginefuncs-struktuurista. AFAIK counter-strike haksit ovat yleensä .DLL-tiedostoja (injektetaan prosessiin tai koodataan esimerkiks opengl.dll-wrapperi, jolloin näytölle piirtelykin hoituu aika vaivatta), jotka sitten kutsuvat tarvittavia enginefunktioita tuon struktuurin kautta. En tiedä miten kyseisen struktuurin osoite haetaan, mutta joissakin koodeissa olen nähnyt sen ihan vaan hardkoodattuna ohjelmaan.
Kun päästään käsiksi käteviin enginefunktioihin, niin ei aimbotin koodaaminen vaadi paljoa vaivaa. pEngfuncs->GetEntityByIndex(i):llä voidaan käydä cl_entity_s-struktuurit läpi, joista löytyy mm. pelaajan koordinatit (oikeastaan 64 viimeistä koordinaattia), modelit, indeksit ja vaikkapa tähtäimen kulma. Koordinaateista ei tarvitse edes itse laskea mihin kohtaan kursori pitää siirtää, vaan voi käyttää Source SDK:sta löytyvää CalcScreen-funktiota
Eli kaikessa kauneudessaan enginefunktioilla näin:
float aimhere[2]; cl_entity_t *ent, *pLocal = pEngfuncs->GetLocalPlayer(); for(int i = 0; i < 33; i++) { if(i == pLocal->index) continue; cl_entity_s *ent = pEngfuncs->GetEntityByIndex(i); if(ent != NULL && isValidEnt(ent)) if(CalcScreen(ent->origin, aimhere)) { // aimhere-taulukossa koordinaatit joihin tulisi tähdätä, // hiirenkin voi varmaan kivasti siirtää funktiolla // pEngFuncs->pfnSetMousePos(int x, int y); } }
Deffi kirjoitti:
Itse koodasin CS1.6 ESPin (joka on helposti laajennettavissa aimbotiksi) lukemalla tarvittavat koordinaatit suoraan hl.exen muistista. Kun tiedetään kameran ja pelaajien koordinaatit, niin yläastetrigonometrialla pystytään selvittämään mihin kohtaan näyttöä se tähtäin pitää siirtää. Tästä lähestymistavasta löytyy hyvä tutoriaali täältä: http://sraeg.net/work/aimbottut/
Ahaa, en tiennytkään että tuollaisia oppaita on edes olemassa.
Kiitos paljon
...tuli yksi ollennainen ongelma eteen. Eli miten voin selvittää, että onko seinä edessä eli näkyykö vihollinen omalle pelaajalleni vai ei. Tuossa opas ei taida sitä kertoa.
Luultavasti on mahdotonta luoda sellasta ns. yleispätevää näkyvyys tarkistusta, mutta mikäs voisi olla tapa jota käytetään CS:ssä seinien tarkistukseen? Olisiko itse kartta?
Eiköhän tuo CS:n törmäily tapahdu polygoneista/kolmioista. Se on 3D-matematiikkaa jossa melkeen väistämättä joutuu hyödyntämään enginen optimointitekniikoita (quadtree tvs.) joilla laskenta tapahtuu riittävän nopeasti. Kartoissa itessään on kenties kymmeniä tuhansia polygoneja.
Mikä ettei, ehkä fysiikkaenginen puolelta saa jotain kaapattua bottiinkin?
Eli siis, miten tämä liittyy aimbottiin? Pitääkö minun vai luoda ns. oma törmäyksen tarkistus botille, jotta saan selville näkyykö vastustaja?
Pitää. Toinen vaihtoehto on tietenkin tutkia asiaa graafisesti (tai vaikka sapluunapuskurilla), jos olet sen OpenGL:n koukuttanut.
Hmm. Eikös minun pidä tutkia sitten mapin koordinaatteja ja luoda sitten niitten kautta törmäys kartta? Eikös sillon pidä olla sen mappi formaatin loaderi, vai etsitäänkö nekin muistista?
...olen vähän hakoteillä, kuten varmaan huomaatte.
Niin, ne ovat taas vaihtoehtosi, jos etenet matematiikan etkä grafiikan kautta.
Noh siis puhutaas nytten ihan yleis tasolla. Millä tavalla yleisimmät aimbotit luodaan? Onko se tuo grafiikan kautta? Eikös tuo matemaattisesti laskemalla tuo pieniä ongelmia siinä, että jos ei omista tuollasta mapin lataus funktiota.
Eikös se tuo OpenGL:än "koukuttaminen" ole yleisin vai tai ainakin helpoin tapa?
Mites tuo pelin OpenGL injectointi tapahtuu? Voiko sen tehdä niinkin simppelisti kuin etsin eka pelin ikkunan WinAPI:n FindWindow funktiolla ja tämän jälkeen piirrän ihan normaalisti opengl funktioilla FindWindow palauttamaan hwnd:en?
Sainkin sen itse toimimaan. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.