Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi ASM in Delphi "nop" umsetzen (https://www.delphipraxis.net/135542-asm-delphi-nop-umsetzen.html)

buster55 12. Jun 2009 22:41


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:
begin

  asm
...
  end;

end;
Nun möchte ich im Arbeitspeicher ein Befehl praktisch "überspringen lassen"
Also in ASM:
Delphi-Quellcode:
0008359A: //Adresse
nop //No Operation
Allerdings bringt mich
Delphi-Quellcode:
begin

  asm
0008359A: //Adresse
nop //No Operation
  end;

end;
nur zu der Aussage das ein ASM Synatax Fehler vorliegt.

Muss ich das ganze irgendwie noch einleiten?

Dank im Vorraus
buster

Meflin 12. Jun 2009 22:46

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.

Die Muhkuh 13. Jun 2009 00:51

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.

himitsu 13. Jun 2009 09:18

Re: ASM in Delphi "nop" umsetzen
 
jupp, NOP einzeln geht und Addresen kann man nicht angeben.

jaenicke 13. Jun 2009 09:27

Re: ASM in Delphi "nop" umsetzen
 
Zitat:

Zitat von buster55
Nun möchte ich im Arbeitspeicher ein Befehl praktisch "überspringen lassen"

Die Adresse ist aber im eigenen Programm? Oder (mal ganz vorsichtig zur Sicherheit gefragt) willst du auf diese Weise etwa etwas in einem anderen Programm ändern? :shock:

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?

himitsu 13. Jun 2009 09:39

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

buster55 13. Jun 2009 09:47

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:

Zitat von Die Muhkuh
...als wolle er an die angegebene Adresse ein "nop" schreiben bzw. einfach den Befehl an der Adresse überspringen.

Richtig, wie wäre das den in ASM unzusetzen?

buster

mkinzler 13. Jun 2009 09:51

Re: ASM in Delphi "nop" umsetzen
 
Langsam frage ich mich, ob wir uns in einem Delphi oder einem Hacker-Forum befinden :gruebel:

DP-Maintenance 13. Jun 2009 09:52

DP-Maintenance
 
Dieses Thema wurde von "mkinzler" von "Sonstige Fragen zu Delphi" nach "Programmieren allgemein" verschoben.
Geht zudem nicht um die Sprache

himitsu 13. Jun 2009 09:59

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.

Zacherl 13. Jun 2009 10:31

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.

Fridolin Walther 13. Jun 2009 19:45

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.

buster55 14. Jun 2009 14:01

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?

jaenicke 14. Jun 2009 14:33

Re: ASM in Delphi "nop" umsetzen
 
Die Stichworte hat Zacherl doch schon genannt...
http://www.delphipraxis.net/internal...048261#1048261

buster55 14. Jun 2009 15:44

Re: ASM in Delphi "nop" umsetzen
 
ok done :)
Danke für die Hilfe :)
Lösung für den, dens interessiert:

Delphi-Quellcode:
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);
...
grácias

buster

himitsu 14. Jun 2009 15:47

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:

buster55 14. Jun 2009 16:41

Re: ASM in Delphi "nop" umsetzen
 
japs :-P
Pointer suchen, selbstverständlich nen statischen, der auf die sich ändernde Adresse verweist :stupid: :stupid:

Fridolin Walther 14. Jun 2009 23:53

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:
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;
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).

buster55 15. Jun 2009 16:00

Re: ASM in Delphi "nop" umsetzen
 
auch wahr ;)
Dank dir für die Ratschläge und die Funktion :thumb:

QuickAndDirty 15. Jun 2009 16:49

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?

Fridolin Walther 15. Jun 2009 23:27

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:
  //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");
  }
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 ;).


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