STL mit unsigned chars und WriteProcessMemory



  • Ich möchte eine kette von unsigned chars mit Hilfe von 'STL' bzw 'std' speichern.
    z.B.: "\x8A\x8D\xAC\x00\x00\x00" Das ganze sind Opcodes nicht zu verwechseln mit einem String oder signed chars. Es ist also wichtig das der Typ unsigned char ist.

    Die unsigned chars sollen so abgespeichert werden das ich dabei NICHT die Größe eines Array oder die nötigen Bytes dafür angeben muss. (Deswegen STL)

    Am Ende soll es möglich sein das ganze an WriteProcessMemory() zu übergeben als *sourcebuffer*.

    Ich habe bisher std::string probiert jedoch funtkioniert das nicht. Problem dabei war das "\x90" nicht als einzelner char geschrieben wird sondern als 4 chars. Sprich WriteProcessMemory() hat mir Datenmüll in den anderen Prozess geschrieben:
    anstatt '\x90' was dem opcode für No Operation entspricht wurde '\','x','9','0' geschrieben.

    mein Idee war jetzt:

    std::vector <unsigned char> opcode;
    opcode.push_back("\x8A\x8D\xAC\x00\x00\x00"); // error C2664: 'std::vector<_Ty>::push_back' : cannot convert parameter 1 from 'const char [7]' to 'const unsigned char &'
    

    ... funktioniert allerding nicht 😕

    Kann mir jemand sagen wie ich das richtig mache?



  • bockwurst schrieb:

    Die unsigned chars sollen so abgespeichert werden das ich dabei NICHT die Größe eines Array oder die nötigen Bytes dafür angeben muss. (Deswegen STL)

    Wie soll dann das Ende der Kette erkannt werden? Oder hat die Kette immer eine feste Länge?

    Ich habe bisher std::string probiert jedoch funtkioniert das nicht. Problem dabei war das "\x90" nicht als einzelner char geschrieben wird sondern als 4 chars.

    Dann machst Du was falsch (TM). 🙂

    std::vector <unsigned char> opcode;
    opcode.push_back('\x8A');
    opcode.push_back('\x8D');
    ...
    


  • Wie soll dann das Ende der Kette erkannt werden? Oder hat die Kette immer eine feste Länge?

    Die Größe der Kette ist unterschiedlich. Zur Not könnte ich die Anzahl der Bytes angeben. Ich will es aber um jeden Preis vermeiden.

    std::vector <unsigned char> opcode;
    opcode.push_back('\x8A');
    opcode.push_back('\x8D');
    ...
    

    Gibt es keine Möglichkeit die Kette in Form von "\x01\x02\x03\04..." zu übergeben?

    Das ist meine Version ohne STL, die gefällt mir nicht, ist mir zu umständlich:

    // vereinachte Version, ist bei mir bissl komlizierter das einiger in einer Klasse liegt
    unsigned long bytes=6;
    unsigned char *opcodes;
    opcodes=new unsigned char[bytes];
    memcpy(opcodes,"\x8A\x8D\xAC\x00\x00\x00",bytes);
    // ... jede Menge anderer Code ...
    WriteProcessMemory(hproc, (LPVOID)addr, (LPVOID)opcodes, bytes, 0)
    

    Müsste es nicht möglich sein das STL die Anzahl der übergeben Bytes erkennt. Ich weiß nicht genau wie das bei std::string mit .append("sometext"); funktioniert - aber eigentlich übergebe ich ja dort auch keine 0. oder!?



  • bockwurst schrieb:

    ...Ich habe bisher std::string probiert jedoch funtkioniert das nicht. Problem dabei war das "\x90" nicht als einzelner char geschrieben wird sondern als 4 chars. ...

    😕
    Da bin ich aber ziemlich sicher, dass das klappt ... wenn man es denn richtig macht.
    Aber ein wesentlicher Vorteil von std::string ist die enge Anbindung an "0-terminierte char*" ... und da klappt halt Vieles nicht mehr mit Binärdaten.
    Deswegen muss man sich halt überlegen, ob std::string wirklich die Passendste Wahl ist.

    Gruß,

    Simon2.



  • Also mit std::string kann man das knicken, gibt zu viele Probleme.



  • Mit dem range-insert oder einem back_inserter kannst Du eine ganze Kette übergeben. Da ein Vector aber keine Kenntnis von nullterminierten Strings hat, musst Du die Länge hier mit übergeben. Das geht am einfachsten so (Achtung: rawdata muss ein Array, kein Zeiger, sein):

    // irgendwo
    static char const rawdata[] = "\x8A\x8D\xAC\x00\x00\x00";
    
    ...
    
    opcode.insert(opcode.end(), rawdata, rawdata + sizeof rawdata / sizeof *rawdata - 1); // - 1 deshalb, weil dem Array noch ein weiteres \x00 durch den Compiler hinzugefügt wurde.
    

Anmelden zum Antworten