ASM in Delphi "nop" umsetzen
Hallo ich möchte Assembler Code in Delphi verwenden, was mir natürlich schon klar ist dass, das so ausehen muss:
Delphi-Quellcode:
Nun möchte ich im Arbeitspeicher ein Befehl praktisch "überspringen lassen"
begin
asm ... end; end; Also in ASM:
Delphi-Quellcode:
Allerdings bringt mich
0008359A: //Adresse
nop //No Operation
Delphi-Quellcode:
nur zu der Aussage das ein ASM Synatax Fehler vorliegt.
begin
asm 0008359A: //Adresse nop //No Operation end; end; Muss ich das ganze irgendwie noch einleiten? Dank im Vorraus buster |
Re: ASM in Delphi "nop" umsetzen
Was soll das auch für eine Syntax sein?!
Mit nop kannst du keinesfalls bestimmen, dass irgendeine Anweisung übersprungen wird - nop bedeutet einfach nur: mache einen Takt lang nichts. |
Re: ASM in Delphi "nop" umsetzen
Schaut eher danach aus, als wolle er an die angegebene Adresse ein "nop" schreiben bzw. einfach den Befehl an der Adresse überspringen.
|
Re: ASM in Delphi "nop" umsetzen
jupp, NOP einzeln geht und Addresen kann man nicht angeben.
|
Re: ASM in Delphi "nop" umsetzen
Zitat:
Und wenn sie im eigenen Programm ist: Sobald du etwas im Code änderst, ändern sich auch die Adressen ggf., das würde also nicht klappen, selbst wenn du es so schreiben könntest. Was hast du denn vor? |
Re: ASM in Delphi "nop" umsetzen
nein, vermutlich nicht ... diese Adresse ist standardmäßig nicht im eigenem Programm:
$0008359A ... Delphi-Programme fangen normaler Weise bei $00400000 an |
Re: ASM in Delphi "nop" umsetzen
jop ich greif auf ein andres programm zu, wenns mein eigens wäre könnt ich mir diesem ASM mist ja schenken :stupid:
Wie vll. durch meinen Beitrag durchklingen mag hab ich nicht viel Ahnung von ASM :P Zitat:
buster |
Re: ASM in Delphi "nop" umsetzen
Langsam frage ich mich, ob wir uns in einem Delphi oder einem Hacker-Forum befinden :gruebel:
|
DP-Maintenance
Dieses Thema wurde von "mkinzler" von "Sonstige Fragen zu Delphi" nach "Programmieren allgemein" verschoben.
Geht zudem nicht um die Sprache |
Re: ASM in Delphi "nop" umsetzen
Inline-ASM, wird, wie der Name schon sagt in das eigene Programm eingebaut
Zugriffsrechte des Speichers ändern, und dann direkt den ByteCode von NOP da reintragen und dann die Rechte wieder zurücksetzen. |
Re: ASM in Delphi "nop" umsetzen
Am einfachsten ist denke ich WriteProcessMemory und CreateRemoteThread. Hatte aber auch mal eine Methode entwickelt, die einen laufenden Thread einer Zielanwendung mittels SetThreadContext auf meinen Code umgebogen hat (und dann wieder zurückspringt zur Ausgangsposition). Gibt da recht viele Möglichkeiten. Ein injiziertes LoadLibrary wäre auch möglich .. Dann könntet du deinen Code sogar komplett in eine DLL packen.
|
Re: ASM in Delphi "nop" umsetzen
Wobei ein einfaches Überschreiben der Bytes mit 0x90 (-> der Opcode für NOP) reichen sollte. Code Injection an sich ist da gar nicht notwendig.
|
Re: ASM in Delphi "nop" umsetzen
aha, das heißt also man kann mit delphi bytes in einen prozess schreiben oder auch via ASM? Wenn ja wie geht das?
|
Re: ASM in Delphi "nop" umsetzen
Die Stichworte hat Zacherl doch schon genannt...
http://www.delphipraxis.net/internal...048261#1048261 |
Re: ASM in Delphi "nop" umsetzen
ok done :)
Danke für die Hilfe :) Lösung für den, dens interessiert:
Delphi-Quellcode:
grácias
WriteProcessMemory(HandledesProzesses,ptr($000000),buf,1,write);
// das dann noch weitere 5mal für die nächstgelegenen adressen, da bei 0x90 5 Bytes zuschreiben wären aber die Adresse nur 1 Byte // fasst. WriteProcessMemory(HandledesProzesses,ptr($000001),buf,1,write); WriteProcessMemory(HandledesProzesses,ptr($000002),buf,1,write); ... buster |
Re: ASM in Delphi "nop" umsetzen
Und um den Spaß noch zu erhöhen ... du weißt auch, daß Adressen im Virtuellen Adressraum nicht immer gleich bleiben müssen und sich auch mal ändern können?
bzw. viele machen das sogar ständig :stupid: |
Re: ASM in Delphi "nop" umsetzen
japs :-P
Pointer suchen, selbstverständlich nen statischen, der auf die sich ändernde Adresse verweist :stupid: :stupid: |
Re: ASM in Delphi "nop" umsetzen
Dein Code ist auf mehreren Ebenen schlecht:
1. Wieso schreibst Du 5x 1 Byte, statt 1x 5 Bytes? 2. ptr($000000) -> Null Page des Prozesses (ist die bei Windows per Default überhaupt gemapped?). Du schreibst also an Adresse 0 Deines Zielprozesses. Das kann irgendwie nicht so ganz stimmen. 3. Write ist ein reserviertes Wort. Merke: Wenn der Syntaxhighlighter ein Wort dick schreibt, sollte man es tunlichst nicht als Variablen Namen benutzen. Ich wunder mich das es überhaupt compiliert ;). Besser gelöst wäre die Sache in dieser kleinen Funktion:
Delphi-Quellcode:
Man übergebe ein Process Handle mit Write Access, die gewünschte Adresse wo die NOPs hin sollen und die Anzahl der NOPs die gewünscht sind und erhält die Anzahl der geschriebenen Bytes zurück (oder halt 0 bei Fehler).
function WriteNOPsToProcess(ProcessHandle : THandle; StartAddress : Pointer; NumberOfNOPsToWrite : Integer) : Integer;
var BufferToWrite : Pointer; begin Result := 0; GetMem(BufferToWrite, NumberOfNOPsToWrite); FillChar(BufferToWrite^, NumberOfNOPsToWrite, $90); WriteProcessMemory(ProcessHandle, StartAddress, BufferToWrite, NumberOfNOPsToWrite, Result); FreeMem(BufferToWrite); end; |
Re: ASM in Delphi "nop" umsetzen
auch wahr ;)
Dank dir für die Ratschläge und die Funktion :thumb: |
Re: ASM in Delphi "nop" umsetzen
Erfahre ich auch noch was so ein Hack bewirkt?
Wenn ich ne "CD im laufwerk" Abfrage Mit NOPS überschreibe oder eine sonstige Sicherheitsprüfung, das könnte was bringen aber sonnst ist der Code wohl für nichts gut ja? |
Re: ASM in Delphi "nop" umsetzen
Generell kannst Du damit Code mehr oder weniger deaktivieren. Das muss nicht zwangsläufig der Code des Kopierschutzes sein. Ein Beispiel aus der Malwarebekämpfung: Viele Conficker Remover überschreiben den injezierten Conficker Code im Speicher mit einer NOP Slide und einem kleinen Shellcode um eine aktive Infektion zu deaktivieren. Siehe dazu z.B. den Quelltext des Conficker Cleaners der Uni Bonn:
Code:
Meiner Ansicht nach wäre es zwar eleganter zu überprüfen welche Threads eine Startadresse innerhalb der von Conficker erstellten Memorybereiche haben und diese dann zu suspenden bzw. zu terminieren, aber jeder macht das halt anders ;).
//create nop slide
memset(buffer, 0x90, pageSize); for (addr=start; addr < nopslide_end; addr+=write_size){ write_size = min(pageSize, nopslide_end - addr); if (!WriteProcessMemory(hProcess, (void *) addr, buffer, write_size, &written)) PrintErrorMessage("WriteProcessMemory"); } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz