Wie ihr sicherlich wissts lässt VisualStudio kein inline ASM zu wenn man x64-Bit Applikationen erstellt.
Ich habe dann ein bisschen rumgegoogelt und gefunden wie man in VS ASM mit x64 Code verbinden kann.
Soweit so gut, aber ich bekomme einen error und ich weiß nicht wieso
Die Errors sind als comment zu meinem Code aufgeschrieben:
Code:
.code
noReload proc
mov [rax+98],1e ; Fehler 1 error A2048: nondigit in number
mov eax,[rax+98]
jmp 7FF95517C177 ; Fehler 2 error A2206: missing operator in expression
noReload endp
end
Ich hoffe um Hilfe den wenn ich ähnlichen Code in x86 inline ASM schreibe, bekomme ich solche Errors nicht..
Ich habe etwas länger rumgegoogelt und rausgefunden das MASM64 irgendwie Base-10 nutzt statt Base-16.
Also sieht mein neuer Code so aus: (Trotzdem Compiler Error beim jmp, siehe unten wieso)
Was ich ebenfalls durchlesen konnte ist das man keine direkten jmps machen kann wie im obrigen Beispiel.
Also versuche ich es mit Umwegen die aber das Programm/Spiel crashen.
falsch, falsch, falsch, guck dir bitte erstmal nen bissle den assembler code an, lern wie ein detour funktioniert und dann mach das ganze mal im debugger per hand, oder guck dir an wie der cheatengine autoassembler und dessen templates funktionieren.
Im debugger per Hand funktioniert es. Bzw. ich besitze einen autoassembler template in CE, also hab ich eine Vorlage, aber dieses übersetzen klappt irgendwie nicht.
Ich bin nicht auf ein Detour richtig eingegangen, da ich ja eine Codecave erstellen möchte, und ich deshalb nur einen JMP zur Funktion mache und die Funktion dann springt dann wieder zurück.
Meinen alten Detour Code habe ich noch nicht ausprobiert:
Edit: Mit meiner alten DetourFunktion funktioniert es teilweise, irgendwie hat er die Munition in die Hälfte geschnitten :/
Edit2: Was mich brainfuckt ist, wieso ich normales DWORD verwenden kann und nicht DWORD64 da ja die Anwendung x64-Bit ist und deshalb eine x64-Bit Addressierung hat
du kannst nicht einfach von 32bit nach 64bit alles übernehmen, das klappt so nicht.
benutz mal das ce autoassembler codecave template und guck dir mit dem debugger genau an, was ce da gemacht hat.
ok, ich umreiße eben kurz, was du falsch machst:
1. writejump schreibt einen e9 jump - unter 64bit ist das nur ein short jump -> springt maximal 32bit weit, du brauchst aber (wenn du es sauber machst) einen far jump - immediate jumps sind unter x86 relativ, und @ 64bit gibts keinen 64bit jump immediate - musst also über nen register springen.
2. in deiner no reload "funktion" in assembler hast du zuerst versucht nen immediate absolute jump zu machen, was aus obengenannten 2 gründen nicht geht, das hast du dann korrigiert - allerdings dabei aber rax überschrieben, wo zu dem zeitpunkt allerdings anscheinend etwas sinnvolles drinsteht (zmdst benutzt dus 2 zeilen drüber) -> crash.
Lösung:
writejmp neu für 64bit schreiben.
in deinem assembler entweder ein register nehmen was nicht benutzt wird, oder die registerwerte wieder herstellen.
ok, ich umreiße eben kurz, was du falsch machst:
1. writejump schreibt einen e9 jump - unter 64bit ist das nur ein short jump -> springt maximal 32bit weit, du brauchst aber (wenn du es sauber machst) einen far jump - immediate jumps sind unter x86 relativ, und @ 64bit gibts keinen 64bit jump immediate - musst also über nen register springen.
Das hatte ich gefunden, es hieß auch das ein JMP im 64-Bit den Bytecode 0xFF verwendet, aber laut den ganzen gesammelten Informationen kam es mir dann so rüber, als würde dieser Fall nicht immer auftreten müssen(?)
Quote:
Originally Posted by Dr. Coxxy
2. in deiner no reload "funktion" in assembler hast du zuerst versucht nen immediate absolute jump zu machen, was aus obengenannten 2 gründen nicht geht, das hast du dann korrigiert - allerdings dabei aber rax überschrieben, wo zu dem zeitpunkt allerdings anscheinend etwas sinnvolles drinsteht (zmdst benutzt dus 2 zeilen drüber) -> crash.
Lösung:
writejmp neu für 64bit schreiben.
in deinem assembler entweder ein register nehmen was nicht benutzt wird, oder die registerwerte wieder herstellen.
Werde mich an die korrektur setzen und dementsprechend melden!
warum einmal malloc und einmal virtualalloc?
außerdem brauchts execute rechte, entweder direkt bei virtualalloc angeben, oder per virtualprotect ändern.
lass erstmal unnötigen mist wie das checken auf big/small jump weg, sondern nimm einfach erstmal immer big jumps, abstrahier noch nicht in funktionen (lohnt sich bei midfunction hooks eh kaum) und bekomm das ganze erstmal zum laufen.
danach kannste dich um feinheiten und optimierungen kümmern, das da ist aber erstmal spaghetticode, bei dem man kaum erkennen kann, was du da überhaupt probierst.