Spørsmål:
Reverse Engineering av en pakkekrypteringsfunksjon for et spill
Renan Moura
2015-05-05 05:48:59 UTC
view on stackexchange narkive permalink

Jeg prøver å lage en spillserveremulator for en bestemt MMORPG (Perfect World). Jeg vet det grunnleggende om hvordan nettverket til spillet fungerer og strukturen for noen pakker, men de er alle kryptert, bortsett fra brukernavnet i påloggingspakken.

Jeg bruker Olly for å prøve å finne kryptefunksjon for pakkene som sendes fra klienten til serveren for å vite hvordan spillet krypterer dataene, og jeg trenger hjelp til å finne kryptfunksjonen. Jeg tok noen skjermbilder av Olly under feilsøkingen og kommenterte det jeg har analysert i koden.

Dette er før jeg finner anropet å sende, når jeg sender en chatmelding i spillet ser jeg dette:

b

Nå, det var da jeg fant funksjonen som samtalen sendte, og dumpen for hver linje i denne funksjonen til sendeanropet:

c

Jeg har flere skjermbilder av dumpen for de andre linjene, men jeg har ikke rykte for å legge ut mer enn to lenker per gang , så jeg vil legge ut de andre senere hvis noen vil ha dem.

Spørsmålet mitt er, hvor er kryptfunksjonen? Og hvordan fungerer det på et språk som C ++?

En svar:
Dominik Antal
2015-05-05 16:11:02 UTC
view on stackexchange narkive permalink

Først vil jeg kjøre litt statisk analyse på applikasjonen, for eksempel Findcrypt eller ProtectID og PEID's Kanal-plugin for å skanne etter kjente statiske verdier som brukes i forskjellige krypteringsalgoritmer. Hvis du finner noe, sjekk hvilken funksjon som får tilgang til dem med kryssreferanser (X i IDA, CTRL + r i olly), så kommer du til krypteringsfunksjonen (ene) eller i det minste veldig nær dem.

Hvis den tilnærmingen mislykkes, kan du begynne å spore i en dynamisk feilsøking som olly. Du fant sendefunksjonen, du kan begynne å spore tilbake på samtalestakken. Velg toppen av bunken og klikk follow in disassembler, som fører deg til funksjonen som kalte sendefunksjonen. Plasser et bruddpunkt på toppen av den funksjonen. Gjenta dette flere ganger, med kurs tilbake i ringetreet, og observer variablene funksjonen kalles til til du ser dataene som skal krypteres.

På det andre bildet ditt viser du funksjonen som samtaler sender ( ) med de krypterte dataene. Du bør gå flere nivåer tilbake for å komme i nærheten av krypteringsmetoden.

Søk etter relevante strenger i binær (Shift + F12 i IDA), for eksempel: "nøkkel", "krypt", "passord", og kryssreferanse for å finne ut hvilken funksjon som bruker den.

Du kan også sette et maskinvarebrytpunkt på dataene du vet vil bli kryptert på et tidspunkt, og sjekke hvor de er tilgjengelige.

Også for å bekrefte at applikasjonen bruker en statisk nøkkel eller ikke, kan du sette opp et nytt miljø for spillet med en annen konto på en annen maskin og se om de krypterte dataene er kryptert til de samme byte som du har funnet på bildet 1. Hvis det er det samme, bruker krypteringen en statisk nøkkel.

Det er også noen få innlegg om dette spillet på ragezone og elitepvpers, hvis alt annet mislykkes, kan de kanskje hjelpe deg:)

takk for at du hjalp, men søkeordet fant ingenting. Jeg har valgt toppen av funksjonen som ringesending og plassert et brytpunkt på toppen, men ikke fungerer igjen. Den eneste måten jeg har funnet noe på er når jeg setter et minne / harware-brytpunkt på dataene som skal krypteres, jeg går til et stykke kode der det ser ut som en looping-funksjon som trekker chatmeldingen som " hei "," hallo "," llo "og så videre, men jeg kan ikke finne noen logikk på koden til den funksjonen
Prøvde du alle gjenkjenningsverktøyene eller bare findcrypt? Det er absolutt mulig at de ikke oppdager noe, men det er fortsatt noe. Hva mener du med "men ikke jobber igjen"? Når du ser loopingen, kopierer det sannsynligvis dataene til en annen buffer, du bør observere hvor de kopieres til og plassere et HW-brytpunkt på det også. Det vil trolig bli brukt til kryptering litt senere. Vennligst rediger spørsmålet ditt med fremdriften din med så mye informasjon du kan.


Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 3.0-lisensen den distribueres under.
Loading...