Read String

Discussion in 'Tipps & Tricks' started by validati0n, Aug 9, 2012.

  1. validati0n

    validati0n Guest

    Hey, erstmal danke für den Sourcecode vom Spec Ops Hack, der hilft schon sehr weiter. Allerdings würde ich gerne neben den zahlen (Integer/Long) auch gerne Text (String) lesen können. Ich habe versucht etwas zu schreiben, allerdings ist das mit dem Memory noch nicht so meine Sache.

    Lg
     
  2. AimBRoT

    AimBRoT Addicted Member Inventar

    Joined:
    Aug 1, 2012
    Messages:
    529
    Likes Received:
    0
    Ähm Ich mach mal nen Thread auf wie Du ein Byte (Zahl) zu Text machst und Andersrum :D

    Das wird dir sehr helfen :D
     
  3. hoschi111

    hoschi111 Administrator Staff Member Administrator

    Joined:
    Dec 19, 2017
    Messages:
    1,147
    Likes Received:
    2
    Das geht so nicht.
    Du musst dafür ein anderes Memory Modul benutzen (von AimBRot hier gepostet).
    Mit meiner Readmemory Funktion ist es nicht möglich, Byte oder Strings zu lesen.
     
  4. krusty

    krusty Addicted Member Inventar

    Joined:
    Sep 8, 2012
    Messages:
    175
    Likes Received:
    0
    Strings sind immer so ne Sache,
    als erstes sollte man wissen, dass ein String im Speicher nicht viel mit der String Klasse aus Vb.Net oder C# zu tun hat.
    Wenn man von String im Speicher spricht, so sind das sogenannte C-Strings, weil sie in C wie folgt definiert werden:
    Code:
    char *c_string = "blablabla";
    Da der Speicher keine Buchstaben, sondern nur Zahlen kennt, werden alle Buchstaben in Zahlen umgewandelt, meistens mit dem ASCII Format (hier gibts eine Tabelledazu)
    Jeder Buchstabe des Strings im Speicher ist genau 1 Byte groß. (Weil das inzwischen nicht mehr ausreicht und man mit 1Byte = 0-255 Zeichen nicht mehr genug Buchstaben darstellen kann (japanische Zeichen), gibt es inzwischen auch sogenannte WideString, da ist jeder Buchstabe 2 Bytes groß, ist aber nicht so wichtig).

    Aber woher weiß denn das Programm, dass der String zu ende ist... im Speicher stehen ja überall Zahlen.
    Ganz einfach, jeder String wird mit einem sogenannte Nullbyte terminiert.
    Das bedeutet ein String "hallo1234" ist im Speicher 9 Bytes groß, 8 davon sind die Buchstaben und das 9. ist das Nullbyte.
    "hallo1234" würde im Speicher so aussehen:
    Code:
                  104 97 108 108 111 49 50 51 52  0
    Und genau so können wir auch Strings im Speicher auslesen,
    Wenn wir wissen, wo ein String anfängt, lesen wir einfach solange Byte für Byte, bis wir auf ein NullByte treffen, dann ist der String zu ende.
    Dann wandeln wir jedes Byte in einen Buchstaben (char) um und ketten diese aneinander (daher sagt man auch Zeichenkette als String).
    Das einzige was man also braucht ist eine Funktion um ein Byte auszulesen.

    Ich schreibe mal Pseudocode:

    Code:
    func String readString(DWORD address){
        String result = ""
        Byte charByte = 1
        int count = 0
        while (charByte != 0){
            charByte = readByteFromProcessMemory(ProcessHandle, address + count)
            result += Chr(charbyte)
            count +=1
        }
        return result
    }
    
    eleganter ist natürlich eine Do-While schleife:


    Code:
    func String readString(DWORD address){
        String result = ""
        Byte charByte = 0
        int count = 0
        do{
            charByte = readByteFromProcessMemory(ProcessHandle, address + count)
            result += Chr(charbyte)
            count +=1
        }while (charByte != 0)
        return result
    }
    
    Die Chr Funktion gibt es in fast jeder Prorammiersprache, ich glaube in .Net heißt sie dogar Chr().
    In C/C++ braucht man die garnicht, da gehts so
    Code:
    char c = 100
    ganz ohne Funktion.
     
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.