Byte Variable Problem

12/18/2011 07:06 freehuntx#1
Hallo.

Ich schreibe an einem programm, das mit der funktion "WriteASM" einen Byte in eine Bestimmte Addresse schreiben soll.

Dieser Byte, soll aus einer EditBox ausgelesen werden.

In die Editbox soll nun z.B. FD, FE, FC oder irgendein Byte geschrieben werden.

Dann soll WriteASM eben diesen byte so übernehmen und in die Addresse schreiben.

Mein problem ist, dass ich nicht weiß wie ich das anstellen soll :S

Wenn ich es so mache:

Code:
MessageBoxA(0,"Jetzt sollte Combo Beschrieben werden.","Yeah!",MB_ICONINFORMATION);
    int combo = GetDlgItemInt(hwndDlg,IDC_EDIT1,0,0); //Hier sollte der Byte ausgelesen, und in Combo geschrieben werden.

  WriteASM(ADR_COMBO, (DWORD)(PBYTE)combo, 1); //Nach dieser Zeile stürzt der Prozess ab :S
  MessageBoxA(0,"Jetzt sollte Combo Beschrieben sein.","Yeah!",MB_ICONINFORMATION);
Stürzt der Prozess ab.
12/18/2011 09:59 Dr. Coxxy#2
GetDlgItemText(...)
wcstoul(...)
writeprocessmemory(...)

siehe msdn

getdlgitemint holt eine dezimalzahl aus der dialogbox, das sind aber hexadezimalzahlen.
musst dir also den text holen, den als hex behandeln und umwandeln, und das dann reinschreiben.
wie deine WriteASM funktion aussieht weiß ich nicht, vermute aber mal, dass damit asm befehle geschrieben werden können und keine einzelnen bytes, dafür solltest du writeprocessmemory oder wenn du im programm bist memcpy benutzen.
12/18/2011 19:07 freehuntx#3
Also in meinem Beispiel, soll eine zahl zwischen 1 und 50 reingeschrieben werden.

Und diese sollen dann auch so als byte beschrieben werden, also 0x50 oder 0x34 etc.

Tut mir leid wenn ich es falsch erklärt habe.

z.B. man schreibt 45 rein.
Dann soll die addresse mit "\x45" beschrieben werden.

Und hier die WriteASM funktion.

Code:
void WriteASM(DWORD dwAddy, DWORD dwASM, int len)
{
    unsigned long Protection;
    VirtualProtect((void*)dwAddy, len, PAGE_EXECUTE_READWRITE, &Protection);
    memcpy((void*)dwAddy, (const void*)dwASM, len);
    VirtualProtect((void*)dwAddy, len, Protection, NULL);
}
12/18/2011 19:07 warfley#4
Ein Byte ist eine zahl des bereichs 0..255, und das was du hast ist ein text (string).
trage den byte als byte ein und nicht als string und dann passt das
12/18/2011 19:18 freehuntx#5
Quote:
Originally Posted by warfley View Post
Ein Byte ist eine zahl des bereichs 0..255, und das was du hast ist ein text (string).
trage den byte als byte ein und nicht als string und dann passt das
Das verstehe ich nicht ganz.

Also dass ein Byte in Decimaler(?) sicht 1-255 ist weiß ich.
Und ich habe gemacht, dass die Editbox nur Zahlen annimmt, weil wie gesagt nur ein byte bereich von 1 - 50 eingetragen werden soll.
1-50 in hexdecimaler sicht.
12/18/2011 19:31 MrSm!th#6
Das Problem ist aber, dass GetDlgItemInt die Zahl als Dezimalzahl interpretiert! Hexadezimalzahlen werden nicht erkannt, die Buchstaben werden ignoriert!
12/18/2011 19:39 freehuntx#7
Quote:
Originally Posted by MrSm!th View Post
Das Problem ist aber, dass GetDlgItemInt die Zahl als Dezimalzahl interpretiert! Hexadezimalzahlen werden nicht erkannt, die Buchstaben werden ignoriert!
Das ist schon klar.

12 oder 23 oder 50 ist ja in dem fall schon der byte in hexdecimaler sichtweise.

Es enthält keine Buchstaben, sondern nur 1-50.
Naja Smith du kennst doch in S4 die Combo Addresse.
Als byte hat diese standartmäßig den wert 01.
Und man kann ihn von 01 bis 50 ändern.

Und das möchte ich eben realisieren.
Ich möchte eine art Ingame Hack Panel per dlg box machen, weil d3d lw ist.
12/18/2011 23:18 MrSm!th#8
Nein ich kenne sie nicht.

Quote:
12 oder 23 oder 50 ist ja in dem fall schon der byte in hexdecimaler sichtweise.

Es enthält keine Buchstaben, sondern nur 1-50.
Damit überspringst du aber die ganzen Buchstaben-Zahlen.

Oder meinst du, dass man eine Dezimalzahl eingeben soll? (also sie wird nicht als 0x23, sondern als 23 interpretiert)
Das wäre aber ein Widerspruch, zu deinen bisherigen Posts.
Du sagtest ja, wenn man 50 eingibt, wird 0x50 geschrieben.
Wird es aber eben nicht, sondern 0x32!

Aber das sollte nichts mit deinem Crash zu tun haben. Hast du mal geprüft, ob am Ende dort eine valide Instruction steht? Vielleicht beschädigst du sie, weil du an eine falsche Stelle schreibst.
12/18/2011 23:35 warfley#9
du vertauschst da wohl etwas, 50 in dezimal sind nicht 0x50 in hexa, sondern x32 (3*16+2*1)
12/18/2011 23:39 freehuntx#10
Hmm kann es sein dass ich gerade etwas falsch verstehe?

Also in Cheat Engine habe ich eine Addresse, die den Typ Array of Byte hat.
Dieser ist Standartmässig auf 01.

Wenn ich ihn z.B. auf 10 stelle wird im spiel, die Combo pro attacke mit 10 multipliziert.

wenn ich es auf 45 stelle, wird sie mit 45 multipliziert.

Und es hat ja den typ byte.
12/19/2011 09:50 xNopex#11
Lass die Leute das halt gleich im Zehnersystem in die Editbox eingeben. Das sind wir eh eher gewohnt als das 16er. Der Computer speichert das eh dual. Von daher ist es egal ob du es im 10er, 12er, 16er, 124er System einliest. Dann hast du aber weniger Probleme. Wenn es unbedingt im 16er System sein soll, dann lese den Inhalt der Editbox als String ein und wandle den String z.B. mithilfe des Hornerschemas in eine Zahl zur Basis Zehn um.
12/19/2011 12:39 MrSm!th#12
Quote:
Originally Posted by freehuntx View Post
Hmm kann es sein dass ich gerade etwas falsch verstehe?

Also in Cheat Engine habe ich eine Addresse, die den Typ Array of Byte hat.
Dieser ist Standartmässig auf 01.

Wenn ich ihn z.B. auf 10 stelle wird im spiel, die Combo pro attacke mit 10 multipliziert.

wenn ich es auf 45 stelle, wird sie mit 45 multipliziert.

Und es hat ja den typ byte.
Weil CE es dezimal einliest und du übrigens auch.
Wenn man 50 eingibt, wird auch 50 geschrieben und nicht 0x50 und das ist ja auch absolut richtig so.