Lumea de barca tancuri cu mâinile lor

După ce la un moment dat a existat o lume MMO de tancuri. Și pentru a descrie aceasta nu vede punct, cel puțin ați auzit despre ea.

El a început să-l joace cât mai curând a deschis MBT. Dar dragostea săpăturilor în codul altcuiva nu este bântuit. A doua zi a venit și IDA (dezasamblor puternic) a fost lansat.

Sentimentele mele personale sunt puțin probabil să fie interesați de cineva, așa că trecem la afaceri.

Pentru a scrie cu succes un bot este necesar să existe informații cu privire la:

  • montator
  • limbajul C / C ++
  • limbajul Python (motor de joc ruleaza pe el)
  • integrat Python
  • tehnologia COM
  • tehnologia Direct3D
  • introducerea într-un alt proces
  • Funcții de interceptare - hukah
  • limbaj care este scris bot (fie, de exemplu: C #)

Materialul este scris pentru versiunea 0.9.7 beta test. Mai târziu, în același articol va fi scris sub versiunea curentă va fi comentariile dacă au existat schimbări fundamentale.

Jocul foloseste motorul BigWorld.
Python - aceasta bază, numai că nu se face. Python nu este implementat un dll terță parte, dar cusute în însuși clientul, de unde va trebui să-l rulați.
De ce rula Python? In toate jocurile, toate datele de joc este stocat în care structurează caracteristicile specifice ale limbii este scris, iar aceste informații pot fi citite din proces. În acest caz, cadru Python folosit structura PyObject și succesorii săi.
Din nou, de ce rula Python? Pentru informații prin citirea memoriei de proces, este necesar să se scrie interpretul de limbă. Nu are nici un sens să reinventeze roata. Linia de jos vine în jos la punerea în aplicare a funcțiilor Python direct la client prin intermediul bibliotecii încorporat sau codul mașină. Există două opțiuni pentru a lucra cu date în joc. Fiecare linie de timp pentru a rula cod în Python. Sau încărcați un modul care va cache problema de date și costul în barcă.

Pregătirea datelor reale, a căror stare nu se schimbă în timpul procesului de extracție, se realizează cel mai bine la finalul etapei de redare (caracteristica Direct3D EndScene). În acest moment, imaginea este complet format, dar nu sunt afișate pe ecran, datele nu a fost încă reînnoit, și sunt așa cum au fost în stare congelată. Această funcție și aveți nevoie pentru a prinde, și anume a pus pe cârlig ei.

În implementarea curentă a motorului este construit pe Direct3D versiune nouă, dar există o nuanță. Motorul poate utiliza una dintre interfețele sau IDirect3D9 (standard) sau IDirect3D9Ex (avansat), în funcție de caracteristicile calculatorului / sistem de operare. Cu aceste interfețe oferă, de asemenea, diverse dispozitiv Direct3D (IDirect3DDevice9 / IDirect3DDevice9Ex), în care punctul de intrare într-o închidere funcție de redare scenă diferite. Schema comună de interceptare, au loc următoarele: bibliotecă încărcate d3d9.dll, creat IDirect3D9, creat IDirect3DDevice9, cârlig încorporat în EndScene. Avem o problemă, preluarea de la IDirect3DDevice9 EndScene, nu putem obține controlul dacă IDirect3DDevice9Ex va fi creat. Nu vedeți punctul de interceptare a celor două funcții, numai unul va funcționa.

Prin urmare, este mai ușor să aștepte un dispozitiv și apoi pus pe cârlig atunci versiunea care va motorului. Clientul are o structură (nu este frică să nu Python), este responsabil pentru redare (numesc RenderContext), care cuprinde o pereche de câmpuri și Direct3D Direct3DDevice. Sarcina noastră este în așteptare pentru o alta decât zero în aceste domenii de valoare. Odată ce acestea sunt finalizate, vom ști că el și dispozitivul Direct3D este creat, și puteți închide cârlig.

Dar ce putem spune despre diferențele și IDirect3D9 IDirect3D9Ex? Diferențele sunt mai multe funcții în IDirect3D9Ex, de fapt, interfața IDirect3D9Ex este succesorul IDirect3D9, astfel încât funcțiile IDirect3D9 au aceleași indicii în IDirect3D9Ex, dar au un punct de intrare diferit, din moment ce ele reprezintă clase diferite. Același lucru este valabil și pentru IDirect3DDevice9 / IDirect3DDevice9Ex. EndScene are un indice în ambele interfețe, dar un punct de intrare diferit. Linia de fund: nu suntem de tip creat importante dispozitive Direct3DDevice este important pentru noi punctul de intrare. Cunoașterea pointerul la instanța dispozitivului (a RenderContext), obținem punctul de intrare necesar.

Asta este tot. În următorul articol vom căuta RenderContext, indicatorul de offset la Direct3D instanță. Stoc disassembler IDA.

articole similare