String to HEX Char



  • tagchen zusammen,
    ich habe ein Programm geschrieben, welches den Speicher eines anderen Programms nach einem bestimmten Muster absucht und falls es gefunden wird, die Speicheradresse zurückgibt. Soweit so gut...

    Aussehen tut diese Signatur nach der gesucht wird zum Beispiel so:

    char msk[] = "\x9A\x80\x7C\x27\x09\x83\x7C";
    

    Doch wie mache ich das ganze jetzt dynamisch mit Eingaben von einem Benutzer?
    Als Beispiel gibt der Besucher nun "9A807C2709837C" ein und das soll nun umgewandelt werden.
    Mein letzter (erfolgloser) Versuch sah so aus:

    char msk[] = "";
    for(int j = 1; j <= masknormal.Length(); ++++j)
    {
    	String mask = masknormal[j] + masknormal[j+1];
    	sprintf(msk,"%x",mask);
    }
    

    Doch irgendwie verrät mir der Absturz, dass das ganze nicht hinhaut. 😉
    Ein anderer Versuch war, das ganze einfach wie beim Char nachzubauen:

    String mask = "";
    for(int j = 1; j <= masknormal.Length(); ++++j)
    {
    	mask += "\x" + masknormal[j] + masknormal[j+1];
    }
    

    Aber funktionieren tut auch das nicht, da bei dem ganzen nichts umgewandelt wird.

    Wäre für Hilfe sehr dankbar.

    greetz KN4CK3R



  • Moin KN4CK3R,

    der Absturz kommt daher, daß msk nur 1 Byte lang ist, so wie Du es definiert hast, und Du in der Schleife darüber hinausschreibst. Außerdem willst Du in der Maske ja nicht die Hexbytes als String haben, sondern als Bytes. Du mußt also die String-Eingabe des Benutzers erst in Zahlen umwandeln. Eine Möglichkeit:

    String strInput = "0123456789abcdef";
    int nInputLength = strInput.Length();
    unsigned char *pchMask = new unsigned char[nInputLength / 2];
    
    int nNumBytes;
    for(nNumBytes = 0; nNumBytes < nInputLength / 2; nNumBytes++)
    {
        String strHexByte = String("0x") + strInput.SubString(2 * nNumBytes + 1, 2);
        pchMask[nNumBytes] = (unsigned char)StrToInt(strHexByte);
    }
    

    Der String strInput enthält die Benutzer-Eingabe, und in nNumBytes steht anschließend die Anzahl (8) der in pchMask enthaltenen Bytes (0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef).

    Das Ganze muß natürlich noch um Fehlerbehandlung und Beseitigung des vorhandenen Memory-Leaks erweitert werden...

    Gruß,
    Stefan



  • danke für die Hilfe. Ich bin nur etwas verwirrt durch das \x in dem char und dem 0x, da vorhin beim Testen immer verschiedene Werte ausgegeben wurden. Ich werd mal etwas mit deinem Code rumspielen.

    Edit: works perfect thx

    greetz KN4CK3R



  • so, ich bins nochmal mit ner kleinen Erweiterung. Der Scanner funktioniert jetzt soweit, allerdings hat er an manchen Stellen Probleme.

    http://www.abload.de/img/asmwc9.jpg

    An solchen Stellen gebe ich als Maske "0F8476040000" ein. Doch damit findet er die Stelle nicht. Nun ist mir aufgefallen, dass er die Stelle aber findet, wenn ich nur den ersten Block bis zu dem Leerzeichen (welches ja in Wirklichkeit überhaupt nicht da ist) als Maske benutze. Der Scanner findet alle Stellen, bei denen OllyDbg ein Leerzeichen in den Code macht, nicht. Mache ich das ganze allerdings als statische Version mit

    char msk[] = "\x0F\x84\x76\x04\x00\x00";
    

    findet er die Stelle. Wenn ich die statische Variable mit der vom Programm erzeugten dynamischen Variable vergleiche sind beide logischerweise genau gleich. Doch es funktioniert trotzdem nur bei der statischen Version?

    greetz KN4CK3R


Log in to reply