Heute wieder angefangen mit Delphi seit langem und schon hab ich 3 Fragezeichen auf dem Kopf.
Hier ein kleiner Ausschnitt der Funktion
Delphi-Quellcode:
function TCore.GetGlobal: DWORD64;
var
Registers: TContext;
Key0, Key1: DWORD64;
Globals: array[0..20] of DWORD64;
I: Integer;
begin
with Registers do
begin
Key0 := GLOBAL_INIT_KEYS[0];
Key1 := GLOBAL_INIT_KEYS[1];
ConstructKeys(Key0, Key1);
Rax := Key1;
R8 := Process.Read64(Process.RvaToVa(GLOBAL0));
Rdx := DWORD(R8);
Rax := ROL(DWORD(Rax), 1) + Rdx;
R8 := R8 shr $20;
Delphi-Quellcode:
function TProcess.Read64(AFrom: DWORD64): DWORD64;
var
ReadCount: NativeUInt;
begin
ReadProcessMemory(FProcessHandle, Pointer(AFrom), @Result, SizeOf(DWORD64), ReadCount);
end;
In der Funktion Read64 ist der Wert von Result eine 64-Bit Addresse und nach dem Return ist der zugewiesene Wert irgendwas anderes.
Screenshots im Anhang. Wtf?
Edit:// Okay liegt scheinbar an dem with keyword. Was zeigt mir der Debugger denn da an bei R8? Mit Registers.R8 wird es korrekt dargestellt... War einfach nur sehr verwirrend weil genau der Wert sowieso die Ursache dafür ist dass etwas in der Decryption falsch läuft und dann sah es halt so aus als ob der Grund dafür dass der Wert falsch ist die Funktion ist.
Ich wünschte man könnte wie in Visual Studio einfach global alle Werte als Hex anzeigen und ich könnte einfach über die Variablen hovern beim Debuggen, das ist ja echt zum Ktzen umständlich, Ctrl + F5, Rechtsklick Edit, "Showas Hex"... Wer denkt sich sowas aus? Yep, der Debugger spinnt komplett, bekomme einfach teilweise mal ne 32 Bit Addresse angezeigt, mal den richtigen Wert.