Search the Community
Showing results for tags 'Memory Adressen'.
-
Deel 1: Uitlezen en schrijven Inleiding In deze tutorial wil ik jullie laten zien wat je met geheugen (adressen) m.b.v. CLEO kan doen. Ik ga er in deze tutorial vanuit dat je al (enige) ervaring hebt met SCM, dus deze tutorial is niet voor iedereen. Uiteraard kan je hier zelf mee gaan experimenteren, maar als je niet weet wat je doet dan heb je grote kans dat GTA SA crasht. Wat zijn geheugenadressen? Voordat je aan de slag gaat met het manipuleren van het geheugen van een programma, is het wel handig om te weten wat geheugenadressen zijn. Elke computer heeft "tijdelijk" geheugen waar data in staat die gebruikt worden door programma's, dit geheugen wordt ook wel het "RAM (Random Access Memory)" geheugen genoemd. Als een programma opgestart wordt, dan krijgt deze geheugen toegewezen waar het de gegevens in kwijt kan. Dus alles wat het programma nodig heeft om te functioneren staat in het geheugen. We hebben de mogelijkheid om dat geheugen aan te passen, waardoor je dingen van het programma kan wijzigen, wat normaal niet kan. Een variabel met een geheugen adres, ook wel een pointer genoemd, is niets anders dan een waarde die verwijst naar een bepaalde locatie in het geheugen van het programma. Op die locatie in het geheugen kan een waarde staan die gebruikt wordt door het programma, maar het kan ook een functie zijn die je kan aanroepen. Een geheugenlocatie wordt vaak aangeduid met een hexadecimale waarde (voor meer informatie en een simpele uitleg hierover, zie mijn tutorial van talstelsels). In Sannybuilder kan een hexadecimale waarde herkennen doordat er de volgende tekens voor staan: 0x. Mogelijkheden De mogelijkheden die je met geheugenadressen kan doen zijn eigenlijk oneindig, omdat je letterlijk het geheugen kan manipuleren. De opcodes die je gebruikt in SCM zijn in de basis vaak een tekstuele weergaven van een functie die een geheugenadres aanroept, leest of er naartoe schrijft. Opcodes Het aanpassen van geheugenadressen is met een CLEO opcode is erg simpel, gemaakt. Zowel CLEO 3 en 4 hebben deze functionaliteit. In deze tutorial wordt er gebruik gemaakt van CLEO 4. Er zijn 2 opcodes voor geheugen adressen: 0A8C: write_memory <geheugenadres> size <aantal_bytes> value <hexadecimale waarde> virtual_protect < 0_of_1 > memory (<geheugenadres>): hier geef je de geheugenlocatie op waarnaartoe geschreven moet worden size: Hier geef je op hoeveel bytes je weg gaat schrijven, dit is afhankelijk van het datatype (zie verderop in de tutorial) value: Hier geef je de waarde of variabel met de waarde op die je wilt wegschrijven. virtual_protect: Hier geef je aan of het om geheugen gaat wat normaal alleen gelezen kan worden en niet geschreven. (1 = true, 0 = false) 0A8D: <variabel> = read_memory <geheugenadres> size <aantal_bytes> virtual_protect < 0_of_1 > Eerste waarde (<variabel>) is waar het resultaat van de gelezen bytes in komen te staan memory (<geheugenadres>): hier geef je de geheugenlocatie op waar gelezen moet worden size: Hier geef je op hoeveel bytes je weg gaat lezen, dit is afhankelijk van het datatype (zie verderop in de tutorial) virtual_protect: Hier geef je aan of het om geheugen gaat wat normaal alleen gelezen kan worden en niet geschreven. (1 = true, 0 = false) Data type Voordat je een waarde met deze opcodes kan schrijven of lezen moet je wel weten met wat voor datatype je moet werken. Bijvoorbeeld: Als in het geheugen waardes staan die gelezen moeten worden als een tekst, en ze worden gelezen als nummers (integers) dan krijg je een hele andere waarde dan je zou moeten hebben. Als voorbeeld: als ik in het geheugen de tekst “gtaforum.nl” ga opslaan dan zou dat de volgende hexadecimale waardes hebben: 67 74 61 66 6f 72 75 6d 2e 6e 6c Als ik deze waarde als (decimale) nummers zou uitlezen dan zou ik de volgende waarde krijgen: 125068950647738996618063468 Het is dus erg belangrijk dat je weet met wat voor datatype je te maken hebt. In het geheugen van GTA SA waar je mee werkt kom je de volgende datatypes (het meeste) tegen: Byte: Dit datatype bestaat uit 1 byte en word vaak als boolean (true of false) gebruikt. WORD (short): Een WORD heeft een lengte van 2 bytes, deze word vaak gebruik voor het opslaan van een ID. Dit datatype kan geen decimalen achter de komma hebben. DWORD (integer): Een DWORD (double WORD) is een gewone (32 bit) integer die een lengte heeft van 4 bytes. Dit datatype kan geen decimalen achter de komma hebben. Float: Een float is een getal die decimalen achter de komma kan hebben. In SA is een float doorgaans 4 bytes lang. Short string: Een short string is een tekenreekswaarde waarin maximaal 7 karakters in opgeslagen kunnen worden. Dit datatype is 8 bytes lang Long string: Een long string is een tekenreekswaarde waarin maximaal 15 karakters in opgeslagen kunnen worden. Dit datatype is 16 bytes lang. Welke geheugenadressen kan ik aanpassen? Allemaal leuk en aardig, maar hoe weet ik nu welk geheugenadres ik moet aanpassen? Je kan niet zomaar in het geheugen overal allerlei waardes schrijven, want elk stuk geheugen heeft een bepaald nut. Het ligt er dus aan wat je wilt gaan doen. Oké, dus ik moet precies weten wat het adres is voor wat ik wil gaan doen en ik moet het datatype weten. Maar hoe kom je nou achter al deze gegevens? Gelukkig hebben al vele andere modders uitgezocht wat de meeste gebruikte geheugenadressen zijn en wat voor datatypes erbij hoort. Hier zijn hele lijsten van te vinden. Je kan eens een kijkje nemen op: Gtamodding.com Gtaforums.com (Documenting GTA-SA memory adresses topic) Een andere manier om zelf geheugenadressen op te zoeken zijn via speciale programma’s waarmee je in het geheugen kan zoeken van een programma. Een van de veelgebruikt, en gemakkelijk voor beginners te gebruiken programma is: Cheat engine. Toepassen in de praktijk Als voorbeeld om een waarde in het geheugen aan te passen, gaan we het geld van de speler aanpassen. De geheugenlocatie van het geld is reeds bekend, als we kijken op gtamodding.com dan staat er: 0xB7CE50 - [dword] Money Wat word hiermee bedoelt wordt is: 0xB7CE50: Dit is een hexidecimale weergaven van het geheugen adres hier kan je de waarde van het geld vinden. [dword]: Dit is het datatype, als we in de lijst hierboven kijken dan weten we dat dit een nummer (integer) is van 4 bytes lang. Laten we een heel simpel script maken waarin het geld kunnen weergeven en het geld kunnen aanpassen: {$CLEO .cs} thread 'MONEY' //Geef de variable 0@ de naam MONEY const MONEY = 0@ end :MONEY1 wait 60 if 0AB0: key_pressed 0x4D // Toets M then if 0AB0: key_pressed 0x11 // Toets Ctrl then gosub @GIVE_MONEY else gosub @SHOW_MONEY end end jump @MONEY1 :SHOW_MONEY 0A8D: MONEY = read_memory 0xB7CE50 size 4 virtual_protect 0 //Lees 4 bytes op het geheugenadres 0xB7CE50 en schrijf het naar de variable 0@ (MONEY) 0ACE: show_formatted_text_box "Money: %i" MONEY //Laat een textbox zien me het de tekst Money: en de integer waarde van de variable 0@ (MONEY) return :GIVE_MONEY 0A8D: MONEY = read_memory 0xB7CE50 size 4 virtual_protect 0 //Lees 4 bytes op het geheugenadres 0xB7CE50 en schrijf het naar de variable 0@ (MONEY) 000A: MONEY += 0x2710 //Voeg de waarde 0x2710 aan het resultaat van de variable 0@ (MONEY) toe. (0x2710 = hexidecimale waarde voor 10000, hier kan je ook gewoon de decimale waarde neerzetten.) 0A8C: write_memory 0xB7CE50 size 4 value MONEY virtual_protect 0 //Schrijf 4 bytes naar de geheugenlocatie 0xB7CE50 met de waarde die staat in de variable 0@ (MONEY) return 0A93: end_custom_thread Zoals je in bovenstaand script kan zien is het zeer makkelijk het geheugen uit te lezen en om naartoe te schrijven. Dit was het eerste deel van deze tutorial. In de volgende delen zal ik uitleggen hoe je in een script zelf geheugen kan aanmaken om daar gegevens in te bewaren, en gaan we complexere dingen doen met geheugen(adressen). Als je fouten of onjuiste informatie in deze tutorial vind, meldt het dan a.u.b.