Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Autotrainer-botin tekeminen

Sivun loppuun

unto [20.09.2008 17:30:37]

#

Terve,

Aina silloin tällöin tulee mietitty, että miten nuo autotrainerit oikeen tehdään.

Muistan joskus nuorena pelanneeni runescape nimistä peliä ja siinä oli jos jonkinlaisia autotrainereita, aluksi kyseiset ohjelmat perustuivat värin etsintään ruudulta, joka on todella helppo toteuttaa, mutta myöhemmin tulivat ohjelmat, jotka mahdollistivat esim. koko ruudun piilottamisen ilman toiminnan keskeytymistä. Näissä ohjelmissa käytetettiin myös omaa clienttiä.

Kysymys kuuluukin, että miten tämmöinen oma clientti tehdään, joutuuko siinä ensin löytämään alkuperäisen clientin lähdekoodi vai onko se mahdollista purkaa jotenkin? esim. ihan c/c++ lähdekoodiin asti? Niin, että näkee kaikki funktiot jne. miten kaikki toimii?

Itse aivoillut, että esim. ukkelin liikuttaminen tai hyökkääminen tehdään käyttämällä alkuperäisen clientin funktioita hyödyksi esim. "MoveTo(x,y) { }" tai "AttackTo(targetId) { }". Jos toiminta perustuu tähän niin miten saadaan funktioiden nimet jne. selville alkuperäisestä clientistä? Eli lyhyesti: luulen, että tehokkaammat autotrainerit toimivat pelin moottoria hyväksi käyttäen toisin kuin vanhemmat käyttäjää esittävät versiot (esim. etsii värin ruudulta, liikuttaa hiiren kohdalle ja klikkaa sitä).

Olen tekemässä peliin autotrainerin, mutta puhtaasti opettelumielessä, enkä suinkaan huijatakseni.

PS. Peliä en ole vielä valinnut, mutta jos jollain on näyttää esimerkki jostain tekemästään autotrainerista johonkin peliin niin mielelläni katsoisin sitä ja luultavasti tekisin oman.

Metabolix [20.09.2008 18:13:28]

#

Nettipelissähän olennaista on saada selville, mitä dataa palvelin lähettää ja haluaa vastaukseksi. Millään muulla ei ole merkitystä. Tätä on todella helppo seurata millä tahansa verkkoliikennettä tallentavalla ohjelmalla, mutta pakettien datan ymmärtäminen vaatii syvällisempiä tutkimuksia. Joskus tehtävä on hyvinkin helppo, joskus taas hyvin vaikea. Kun liikenne on selvillä, dataa voi lähetellä vaikka käsin, jos osaa kirjoittaa riittävän nopeasti. ;)

Tutkimukset voi aloittaa ensinnäkin hankkimalla ja säätämällä kuntoon "vakoiluohjelman" ja kokeilemalla, mitä dataa liikkuu esimerkiksi eri käyttäjänimillä kirjauduttaessa tms. Olennaista on saada selville datan yhteys tapahtumiin eli havaita esimerkiksi yhteys klikkauksen ja tietyn viestin välillä. Tällaisen tutkimuksen tekeminen on sitä helpompaa, mitä vähemmän dataa liikkuu, eli kannattaa varmaankin ensin kipittää kauas muista pelaajista ja yleensäkin liikkuvista asioista, jotta mahdollisimman suuri osa viesteistä koskee omaa toimintaa.

unto [20.09.2008 18:18:26]

#

Metabolix kirjoitti:

Nettipelissähän olennaista on saada selville, mitä dataa palvelin lähettää ja haluaa vastaukseksi. Millään muulla ei ole merkitystä. Tätä on todella helppo seurata millä tahansa verkkoliikennettä tallentavalla ohjelmalla, mutta pakettien datan ymmärtäminen vaatii syvällisempiä tutkimuksia. Joskus tehtävä on hyvinkin helppo, joskus taas hyvin vaikea. Kun liikenne on selvillä, dataa voi lähetellä vaikka käsin, jos osaa kirjoittaa riittävän nopeasti. ;)

Tutkimukset voi aloittaa ensinnäkin hankkimalla ja säätämällä kuntoon "vakoiluohjelman" ja kokeilemalla, mitä dataa liikkuu esimerkiksi eri käyttäjänimillä kirjauduttaessa tms.

Jep, koitin aikaisemmin tänään useita packet sniffer tyyppisiä ohjelmia, joista sain vain yhden toimimaan (useat ohjelmat vaativat tietyntyyppisen verkkokortin jne.). Ikävä kyllä tässä ohjelmassa ei ollut mitään packet filtteriä, joten pelkästään tietokone idle-tilassa lähettää/vastaanottaa n. 3-4 pakettia sekunnissa, joten datan seuraaminen on turhan työlästä.

Pelkästään datan lähettäminenhän serverille ei riitä sillä itse clienttiä pitää myös kontrolloida.

PS. Jos tiedätte jotain hyvää packet snifferiä, jossa on filtteri niin pistäkää ihmeessä viestiä.

Blaze [20.09.2008 18:34:34]

#

unto kirjoitti:

Jos tiedätte jotain hyvää packet snifferiä

Wireshark?

Metabolix [20.09.2008 18:43:19]

#

Wireshark ja ettercap ovat ainakin oikein päteviä, ja tietääkseni näillä ei ole erikoisempia vaatimuksia kortin suhteen. Jos vakoiltava ohjelma käyttää vain tiettyä porttia ja protokollaa, väliin voi melko vaivattomasti tunkea jonkin omatekoisenkin ohjelman.

unto [20.09.2008 18:44:28]

#

Blaze kirjoitti:

unto kirjoitti:

Jos tiedätte jotain hyvää packet snifferiä

Wireshark?

Ei lähtenyt aikasemmin pyöriin toi kun koitin, mutta nyt näköjään lähti. Koitan saada toimiin.

EDIT:

Outoa.. Toi Capture inferface (joka listaa verkkokortit yms.) näyttää paketteja menevän tällä verkkokortilla, mutta kun valitsen sen niin päänäkymään ei tule mitään ja alhaalla lukee vain "No Packets".

EDIT2:

Lähtihän se toimiin, otin pois päältä ton "Capture packets in promiscuous mode" kun WiFi käyttäjille tätä suositeltiin.

Mites se exejen purkaminen?

Metabolix [20.09.2008 19:09:09]

#

EXE ja DLL ovat sisällöltään käytännöllisesti katsoen aivan samaa, joten ks. DLL-tiedoston lähdekoodin katseleminen. Mitään järkevää siitä ei ainakaan saa pienellä vaivalla irti.

unto [20.09.2008 19:19:20]

#

Metabolix kirjoitti:

EXE ja DLL ovat sisällöltään käytännöllisesti katsoen aivan samaa, joten ks. DLL-tiedoston lähdekoodin katseleminen.

Tarkoittaako tämä, että autotrainerclientin tekemiseen tarvitaan alkuperäisen lähdekoodin?

Metabolix [20.09.2008 19:22:37]

#

Ei tietenkään. Voit edelleenkin tutkia niitä paketteja ja kokeilla, osaatko ehkä muunnella niiden sisältöä. Onhan esimerkiksi MSN Messengerillekin kymmeniä vapaan lähdekoodin korvaajia, vaikkei alkuperäisen ohjelman koodia ole saatavilla eikä protokollastakaan ole mitään virallista tietoa. Kokeilemalla ja päättelemällä selviää (jos selviää).

unto [20.09.2008 19:43:55]

#

Metabolix kirjoitti:

Ei tietenkään. Voit edelleenkin tutkia niitä paketteja ja kokeilla, osaatko ehkä muunnella niiden sisältöä. Onhan esimerkiksi MSN Messengerillekin kymmeniä vapaan lähdekoodin korvaajia, vaikkei alkuperäisen ohjelman koodia ole saatavilla eikä protokollastakaan ole mitään virallista tietoa. Kokeilemalla ja päättelemällä selviää (jos selviää).

Sehän tarkoittaisia, että minun pitäisi tallentaa kaikki lähtevät ja tulevat komennot ja ohjelmoida identtinen pelimoottori, joka toimii kyseisillä komennoilla. Tämähän olisin uskomattoman iso projekti ja silti autotrainereita pukkaa vähän väliä. Pakko olla muita keinoja.

Kray [20.09.2008 20:08:04]

#

unto kirjoitti:

Metabolix kirjoitti:

Ei tietenkään. Voit edelleenkin tutkia niitä paketteja ja kokeilla, osaatko ehkä muunnella niiden sisältöä. Onhan esimerkiksi MSN Messengerillekin kymmeniä vapaan lähdekoodin korvaajia, vaikkei alkuperäisen ohjelman koodia ole saatavilla eikä protokollastakaan ole mitään virallista tietoa. Kokeilemalla ja päättelemällä selviää (jos selviää).

Sehän tarkoittaisia, että minun pitäisi tallentaa kaikki lähtevät ja tulevat komennot ja ohjelmoida identtinen pelimoottori, joka toimii kyseisillä komennoilla. Tämähän olisin uskomattoman iso projekti ja silti autotrainereita pukkaa vähän väliä. Pakko olla muita keinoja.

millä ihmeen komennoilla? Jos tarkoitat että se matkii klientin liikennettä, niin ei se ole temppu eikä mikään. Ja mikä ihmeen pelimoottori? Riittää että se matkii tarpeeksi hyvin klientin liikennettä.

Deffi [20.09.2008 20:42:44]

#

As far as I know runescapeen suunnitellut macro-ohjelmat toimii pääsääntöisesti niin, että luetaan värejä, kuvia ja tekstiä näytöltä ja sitten niiden perusteella klikkaillaan sitä sun tätä. Tätä varten on ohjelma SCAR, joka pyörittelee delphiin perustuvia skriptejä ja tarjoaa valtavan kasan funktioita vakaiden skriptien tekoon nopeasti (note: SCAR toimii muidenkin pelien kanssa mainiosti). Toinen vaihtoehto runescapen tapauksessa on ollut käyttää decompiloitua ja deobfuskatoitua clienttiä (oikeesti, en tiedä miten ne sen tekee... kertokaa :D), jolloin pääsee käsiksi clientin helppokäyttöisiin funkkareihin.

Javasta ja runesta sikseen. Bottien tekemiseen on pari vähemmän aikaavievää ja helpompaa tapaa, kuin koodata identtinen pelimoottori tai räpellellä värien kanssa. Oon joskus itse koodannut semmosen viritelmän helbreath nimiseen peliin, että verkkoliikenne kulkee tähän malliin: Peli <-> Proxy <-> Serveri. Koodataan siis proxy, joka toimii clientin ja serverin välissä, jolloin voidaan kätevästi seurata kaikkia tapahtumia ja lähetellä omia paketteja milloin vaan halutaan. Helbreathin kanssa tämä toimi oikein hyvin: kun lähetti ylimääräsen komennon serverille, niin client seuras tapahtumia mukavasti - ainakin taikojen castaamisen, puhumisen ja esineiden käytön osalla. Jotta saadaan client yhdistämään alkuperäisen serverin sijasta proksyyn, tarvitaan vain pari hookkia. Melko yksinkertainen tapa sinänsä eikä vaadi turhan paljon protokollaan perehtymistä, että saadaan perusjutut kuntoon.

Toinen tapa on juuri tämä mistä keskustelitte, eli etsitään binääristä pelin sisäiset funktiot sekä muuttujat ja hyödynnetään niitä. Varmaan paras tapa ja pitäis toimii poikkeuksetta, mutta kuten Metabolixkin jo totes, niin niiden funktioiden ja muuttujien osotteiden ettimisessä voi kestää todella kauan (monessa tapauksessa suunnilleen ikuisuus, jos ei kokemusta löydy). Funktioiden etsimiseen tarvitaan debuggeri tai disassembleri, sekä muuttujien etsimisessä auttaa mukavasti jonkin sortin memory searcher. Jos debuggeria tai disassembleria aikoo käyttää, vaaditaan aika vankkaa assemblyn tuntemusta ja mielummin kokemusta ko. hommasta :D Memory searcherin käyttö on varsin helppoa ja Cheat Enginen mukana tulee tutorial.exe, jonka avulla pitäis tyhmempikin päästä hommasta perille. Näitä funkkareita hyödynnetään sitten vaikka injektaamalla oma .DLL pelin prosessiin, kutsutaan niitä ja tehdään muita taikoja. Tosin, sitten kun pelin clienttiä päivitetään, joudutaan yleensä tekemään koko työ uudestaan.

Btw, Tibia oli jännä peli :) Sen clientistä löytyi (pari vuotta sitten, ja varmaan vieläkin löytyy?) muuttujat jotka mm. kertoivat mihin koordinaattiin ollaan liikkumassa ja vihollinen mihin ollaan hyökkäämässä. Sen lisäks tarvitsi pelin struktuureihin sen verran perehtyä, että löysi mapissa näkyvät örmökit iideineen ja tadaa :) Enään vain koodattiin ohjelma, jolla luettiin tarvittava data pelin prosessista ReadProcessMemoryllä ja kirjoiteltiin WriteProcessMemoryllä näitä muuttujia. "Autotraineri" oli valmis, eikä tarvittu lainkaan debuggeria.

editjoo.

unto kirjoitti:

Jep, koitin aikaisemmin tänään useita packet sniffer tyyppisiä ohjelmia, joista sain vain yhden toimimaan (useat ohjelmat vaativat tietyntyyppisen verkkokortin jne.). Ikävä kyllä tässä ohjelmassa ei ollut mitään packet filtteriä, joten pelkästään tietokone idle-tilassa lähettää/vastaanottaa n. 3-4 pakettia sekunnissa, joten datan seuraaminen on turhan työlästä.

Jeps. Itse käytän ja suosittelen WPE Prota, joka ei nyt mitenkään hieno ole, mutta riittävä. Se kiltisti seuraa vain yhden valitun prosessin verkkoliikennettä, tukee yksinkertaisia filttereitä ja mahdollistaa omien pakettien lähettelyn.

unto [20.09.2008 21:09:15]

#

Toi autto jo valtavasti. Itsekin olen Helbreathia pelannut (hyvä peli!).

Mites toimii esim Diablo II:ssa olevat botit, jotka juoksevat mappeja läpi ja tappavat mobeja? Muistan ainakin, että piti käynnistää ohjelma ennen diabloa.

Voiko toinen ohjelma lähettää komentoja alkuperäiselle clientille, esim liikuttaakseen ukkoa?

Metabolix [20.09.2008 21:32:03]

#

Deffi kirjoitti:

Toinen vaihtoehto runescapen tapauksessa on ollut käyttää decompiloitua ja deobfuskatoitua clienttiä (oikeesti, en tiedä miten ne sen tekee... kertokaa :D), jolloin pääsee käsiksi clientin helppokäyttöisiin funkkareihin.

En osaa Java-ohjelman sielunelämästä aivan hirveästi kertoa, mutta Java-sovelluksista tosiaan saa kuin saakin pulautettua ulos jonkinlaisen lähdekoodin. Niitähän ei ole käännetty loppuun asti vaan vain Javan korkeamman tason tavukoodiksi, jota täytyy vielä ajovaiheessa tulkata. Obfuskoidun koodin taas saa nolifettäjä hoidettua järkeväksi kovalla käsityöllä.

Lähdekoodia tai funktioiden nimiä ja osoitteita saattaa muutenkin saada EXE:stä vaihtelevassa määrin ulos siinä tapauksessa, että se erityisesti sisältää näihin liittyviä ylimääräisiä tietoja. On siis mahdollista, että jokin EXE sisältää debug-tietoina vaikka koko lähdekoodin, mutta tämä on poikkeustapaus, jonka perusteella ei voi varsinaisesti väittää, että lähdekoodin saisi purettua EXE:stä. Käännettyä konekieltä ei saa palautettua alkuperäiseen muotoon.

Deffi [20.09.2008 21:56:48]

#

unto kirjoitti:

Mites toimii esim Diablo II:ssa olevat botit, jotka juoksevat mappeja läpi ja tappavat mobeja? Muistan ainakin, että piti käynnistää ohjelma ennen diabloa.

En oo paljoa Diabloa pelannut, niin en osaa kovin sivistyneitä arvauksia pelimoottorista antaa :D Jos Diablossa voidaan liikkua haluttuun "tileen" hiirtä klikkaamalla, niin luultavasti peli tallentaa koordinaatit joihinkin muuttujiin ja ne on sieltä löydettävissä Memory Searcherilla. Sitten tarvitaan vielä hieman tuuria, että peli reagoi jos niitä suoraan sörkkii jollain 3rd party ohjelmalla (jos ei, debuggerilla selvitetään missä kohdassa ohjelmaa näitä muuttujia sörkitään ja sitä kautta toivottavasti löydetään se funktio, jolla varsinainen liikkuminen tapahtuu).

Hyökkääminen/hakkaaminen on varmaan se hankalin osa, kun kuvittelisin että tässä tapauksessa muistista tuskin löytyy suoraan vihollisen tunnusta jota hakataan tai jotain vastaavaa (kuten tibiassa), saati että sitä muokkaamalla saisi ukkelin hyökkäämään. Tarvitaan siis täsmällinen funktio jolla lyödään ja paljon tietoa parametreista. Ja vaikka olisi funktion osoite ja parametrit tiedossa, niin sen käyttäminen ei välttämättä ole niin yksinkertaista (joudutaan esimerkiksi alustamaan joitain globaaleja muuttujia tai kutsua juuri tietyssä säikeessä tietyssä kohdassa pelin suoritusta)

Näin siis ottaen "hyöty" clientistä tai yksinpelissä, mutta kun on moninpelistä kyse, niin botti kannattaa toteuttaa jollakin tapaa paketteja räpläämällä. Paljon helpompaa ja ton "käynnistä ohjelma ennen diabloa" perusteella voisi olettaa muidenkin bottien toimivan siihen malliin. Googlesta uskois löytyvän valmiiden bottien sorsia, joten kannattaa varmaan niihin ensiksi perehtyä.

unto kirjoitti:

Voiko toinen ohjelma lähettää komentoja alkuperäiselle clientille, esim liikuttaakseen ukkoa?

CreateRemoteThread API:lla voidaan kutsua funktioita jotka ottaa joko yhden tai ei yhtään parametria. Parempi tapa on tehdä oma DLL, injektata se pelin prosessiin ja sitten tehdä mitä lystää (asennella hookkeja, lukea muuttujia ja kutsua funktioita).

User137 [20.09.2008 23:04:55]

#

Diablo 2:sta pystyy kyllä ohjaamaan simuloimalla hiirtä. Oli joskus aika purkkaviritelmä yksinpelissä mutta ajoi asiansa. Kunhan nauhoittaa liikkeet hitaasti ja varmasti.

unto [20.09.2008 23:08:44]

#

Hmm.. Mielenkiintoisia vastauksia kyllä. Täytyy vakavasti harkita näiden testaamista!

ville-v [21.09.2008 15:18:00]

#

Deffi kirjoitti:

Btw, Tibia oli jännä peli :) Sen clientistä löytyi (pari vuotta sitten, ja varmaan vieläkin löytyy?) muuttujat jotka mm. kertoivat mihin koordinaattiin ollaan liikkumassa ja vihollinen mihin ollaan hyökkäämässä. Sen lisäks tarvitsi pelin struktuureihin sen verran perehtyä, että löysi mapissa näkyvät örmökit iideineen ja tadaa :) Enään vain koodattiin ohjelma, jolla luettiin tarvittava data pelin prosessista ReadProcessMemoryllä ja kirjoiteltiin WriteProcessMemoryllä näitä muuttujia. "Autotraineri" oli valmis, eikä tarvittu lainkaan debuggeria.

Tibiaan löytyy muuten avoimen lähdekoodin botti TibiaTek Bot.

Viitapiru [24.09.2008 12:32:00]

#

Joskus tuli tämmöistä Diablo II:n bottia katseltua. Se toimi niin, että jollakin tapaa "model editoi" ( .mpq tiedostojen muokkaus, http://en.wikipedia.org/wiki/MPQ ) halutun örkin vaikkapa kauttaaltaan punaiseksi, jonka jälkeen oli helppo kirjoittaa tämmöinen haluttu macro joka liikuttaa hiirtä yms.

Tämmöisellä tekniikalla pystyttiin ainakin helposti tsekkaamaan, että mille ukkelille puhutaan ja mikä örvelö pistetään hengiltä.

unto [27.09.2008 11:28:45]

#

Viitapiru kirjoitti:

Joskus tuli tämmöistä Diablo II:n bottia katseltua. Se toimi niin, että jollakin tapaa "model editoi" ( .mpq tiedostojen muokkaus, http://en.wikipedia.org/wiki/MPQ ) halutun örkin vaikkapa kauttaaltaan punaiseksi, jonka jälkeen oli helppo kirjoittaa tämmöinen haluttu macro joka liikuttaa hiirtä yms.

Tämmöisellä tekniikalla pystyttiin ainakin helposti tsekkaamaan, että mille ukkelille puhutaan ja mikä örvelö pistetään hengiltä.

Ovelaa!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta