Gå til innhold

ProgrammeringsBaren! Småprat, om det du elsker!


Anbefalte innlegg

Videoannonse
Annonse

Hva er den praktiske forskjellen på en Wrapper å en injector? :hmm:

 

Når det kommer til DirectX burde det jo være en smal sak, alle spillene bruker samme .dll til å "tegne" på skjermen. Ergo samme offsett er aktuell, pluss en muligens base-adress. Og det er vel bare en funksjon som tegner oppdateringene til skjermen, så ved å hooke den og bruke den versjonen av .dll som spillet har lastet inn i minne til å tegne f.eks en in-game msn klient på bufferen før jeg lar oppdateringen av skjermen kjøre så burde vel det funke?

Endret av Frysning
Lenke til kommentar

Wrapper og inject er to vidt forskjellige ting som brukes til forskjellige ting.

 

Wrapper er at noen skriver kode i et språk som er på et lavere nivå (som regel C++) for å få utvidet mulighetene til et språk i et høyere nivå (f.eks. Java)

F.eks. for å få OpenGL eller OpenAL støtte.

Mange velger å skrive wrappere selvom det strengt tatt ikke er nødvendig også, for å få bedre kontroll på hva som foregår, eksempler på det er OpenGL wrappers i .NET, siden alle .NET språkene kan bruke både OpenGL og OpenAL gjennom DllImport attributten. (eller *sukk* Declare funksjonen i VB, hvis man er av den gamle skolen)

 

Code injection er at man etter at programmet er i gang, legger til kode, men da bruker man som regel de fasiliteter som allerede er brukt i programmet, f.eks. kalle glPolygonMode(GL_LINE) for å skru på wireframe rendring. (tenker på jukseprogrammet til Half-Life nå)

Lenke til kommentar
Hva er den praktiske forskjellen på en Wrapper å en injector? :hmm:

9261519[/snapback]

 

vel... en wrapper pakker jo ting inn i et ekstra lag, som f. eks. lage et lag som gjør dx mulig i python eller lignende.

en injector vel "pumper" data inn i programmet.. som f. eks. en msn klient på bufferen.

 

Det blir som å sammenligne en jakke med en stikkpille... nesten

 

Når det kommer til DirectX burde det jo være en smal sak, alle spillene bruker samme .dll til å "tegne" på skjermen. Ergo samme offsett er aktuell, pluss en muligens base-adress. Og det er vel bare en funksjon som tegner oppdateringene til skjermen, så ved å hooke den og bruke den versjonen av .dll som spillet har lastet inn i minne til å tegne f.eks en in-game msn klient på bufferen før jeg lar oppdateringen av skjermen kjøre så burde vel det funke?

9261519[/snapback]

 

Du får det til å virke så enkelt :)

Lenke til kommentar

Kunsten er å ta bilde av MSN, lagre det i minnet til programmet som skal ha det, deretter å finne pekeren til Direct3D devicen, vite hvilken versjon dette er, og deretter kalle GetBackBufferSurface eller hva nå en den heter, deretter hente pekeren til surfacets minnedata (eller bruke BitBlt funksjonen), og kopiere bildet over.

 

Lett som bare det, hehe.

Lenke til kommentar

At jeg får det til å høre enkelt ut vil vel egentlig bare si jeg ikke har forstått det :wee:

 

Nei, men la oss si vi har et sample program i DirectX som har den berømte cuben.

Hvis jeg ønsker å printe ut tekst, oppå dette i venstre hjørne via directX.

Hvordan gjør jeg dette da egentlig?

Kjøre programmet igjennom Ollydbg, sjekke alle executable-modules og få base til directx dll?

Offsettene til funksjonene kan jeg kanskje regne meg frem til via headeren? Eller?

Lenke til kommentar

hmmmmm nei.

Funksjoner blir eksportert i biblioteker, så du må sjekke import tabellen til TheCube® etter funksjonene, samt at du må ha pekeren til Direct3D devicen, som da selvsagt mest sannsynlig ligger på samme sted hver gang.

Det du gjør, er at du sjekker etter et kall til CreateDirect3D (eller hva denne funksjonen heter igjen) for når den funksjonen er kalt, vil pekeren til D3D Devicen ligge i EAX, og da er det å sjekke etter en MOV [Adresse], EAX etter det.

Adressen vil da inneholde pekeren til D3D devicen.

Denne må du bruke som basis for å kalle Direct3D funksjoner.

 

Det er også mulig du må se etter en Direct3D::ctor() (vet ikke hva constructoren kalles da)

 

OpenGL er en del enklere, for så lenge du er i samme tråd, vil alle gl funksjoner bli kalt mot OpenGL contexten som er aktiv.

 

edit: UnDecorateSymbolName funksjonen kan være grei å bruke for å se hvorfdan funksjonene fungerer.

Endret av GeirGrusom
Lenke til kommentar
Først må du lete etter en referanse til Direct3D9Create()

9262147[/snapback]

 

Jeg fant dette i kildekoden:

 

DXUTInit( true, true, true ); // Parse the command line, handle the default hotkeys, and show msgboxes

    DXUTCreateWindow( L"SimpleSample" );

    DXUTCreateDevice( D3DADAPTER_DEFAULT, true, 640, 480, IsDeviceAcceptable, ModifyDeviceSettings );

 

Er det den linjen med CreatveDevice jeg leiter etter i Ollydbg?

 

Edit:

Teorien er veldig grei den, men skal si det ikke er så lett i praksis.

Hmm har lastet ned koden til en injector, så der får jeg litt input.

Men den funksjonen over var vanskelig å spore.

Endret av Frysning
Lenke til kommentar

hva skal du med å injecte kode hvis du har kildekoden? :p

 

Uansett, jeg har aldri hørt om DXUT funksjoner, men de ser ut til å hjelpe med å hoppe over den plagsomt vanskelige initialiseringen av Direct3D.

 

Denne kaller nok Direct3D9Create() også, men da vil jeg tro at all kode skjer i DXUT biblioteket, jeg vet ikke.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...