Zitat von
himitsu:
Wie gesagt, wenn du innnerhalb deines eigenen Programms daten auslesen willst, kannst du das direkt machen und mußt nicht über Read-/WriteProcessMemory gehen.
Delphi-Quellcode:
Var P: Pointer;
P := StartCode;
Du hast also sofort einen Pointer auf den StartCode, welchen man z.B. einfach kopieren könnte
Delphi-Quellcode:
Var P: Pointer;
P := GetMem(StopCode - StartCode + 1);
Move(StartCode, P, StopCode - StartCode + 1);
Und schon hast du eine Kopie des Codes in einen neuen Speicherbereich (P) kopiert und kannst damit machen, was du willst.
z.B. den ausgelesenen Teil wieder entschlüsseln und dann die enthaltene Prozedur aufrufen.
wobei im OriginalCode die Prozedur ProtectedCode ja eine bestimmte Anzahl an Bytes hinter der dem StartCode liegt, also liegt jetzt die entschlüsselte Prozedur die selbe Anzahl Bytes hinter dem StartCode im neuen Speicherbereich, wo du diese nun aufrufen könntest.
ProtectedCode - StartCode = Anzahl der Bytes (Abstand)
Delphi-Quellcode:
Var P, P2: Pointer;
P := GetMem(StopCode - StartCode + 1);
Move(StartCode, P, StopCode - StartCode + 1);
Encode(P, StopCode - StartCode + 1);
{Pointer, Length}
P2 := P + (ProtectedCode - StartCode);
ASM
CALL &P2
End;
FreeMem(P);
@himitsu
Zunächst einmal vielen vielen Dank, dass du mich unterstützt bei meinem Vorhaben.
Ich bin eigentlich nur über ReadProcessMemory gegangen, weil "Move(StartCode, P, StopCode - StartCode + 1)" irgendwie Probleme (
Exception wird ausgelöst) bereitet.
Zitat von
himitsu:
Vergiß aber nicht die Hinweise von Hagen ... es darf nichts in der gesicherten Funktion/Prozedur drin sein, was mit relativen Sprüngen etwas außerhalb versucht anzuspringen, es sei denn du holst dir vorher die direkten adressen und springst diese an (wie hier z.B. die neue Adresse der Prozedure ProtectedCode ermittelt und angesprungen wurde).
Das mit den relativen Sprüngen wird wohl noch eine Grosse Hürde sein. Aber derzeit suche ich noch eine Methode aus der project1.exe die relevante Stelle zwischen CODESTART und CODESTOP auszulesen.
Ein Problem, das ich auf mich zukommen sehe, ist, dass die Verschlüsselungslänge wahrscheinlich länger sein kann als die ursprüngliche Länge. Das muß ich auch noch irgendwie hinkriegen.
Also wenn jemand zu meinen Problem Lösungsvorschläge weiß, bin ich ganz Ohr.
jus