Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Luckies "myIsDebuggerPresent" liefert immer true (https://www.delphipraxis.net/150049-luckies-myisdebuggerpresent-liefert-immer-true.html)

TheMiller 6. Apr 2010 11:35


Luckies "myIsDebuggerPresent" liefert immer true
 
Hallo,

ich möchte mich ein bissl mit AntiCracking beschäftigen. Habe jetzt Luckies "AntiCracking"-Artikel gelesen und - weil ich keine Ahnung von ASM habe - voerst einfach per Copy&Paste ins Projekt eingefügt. Beim Programmstart lasse ich mir das Ergebnis anzeigen und erhalte aber immer true - auch außerhalb von der IDE. Was mache ich falsch?

Delphi-Quellcode:
function MyIsDebuggerPresent: Boolean; assembler;
var
  BeingDebugged: Boolean;
begin
  asm
   push eax;
   push ebx;
   mov eax, fs:[$18];
   mov ebx, [eax+$30];
   mov eax, [ebx+2];
   mov [BeingDebugged], al;
   pop ebx;
   pop eax; // Wichtig! POP immer in umgekehrter Reihenfolge von PUSH
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  ...
begin
  ...

  if (myIsDebuggerPresent) then
    ShowMessage('Ja');

  ...
end;
Ich habe sogar Delphi geschlossen und ich bekomme trotzdem "ja" angezeigt. Vielleicht könnt ihr mir helfen!

Danke im Voraus

thkerkmann 6. Apr 2010 11:40

Re: Luckies "myIsDebuggerPresent" liefert immer tr
 
Hi,

liefert AX nicht den Rückgabewert einer boolschen Funktion ?

Dann ist push eax - pop eax kontraproduktiv und restauriert eax anstatt das Ergebnis zu liefern.

Vielleicht fehlt da noch ne Zeile, die IsBeingDebugged in AX lädt?

Gruss

TheMiller 6. Apr 2010 11:42

Re: Luckies "myIsDebuggerPresent" liefert immer tr
 
Ehm...okay...

ich kann echt KEIN asm... garkein bissl... Könntest du mir unter die Arme greigen? Das wäre nett... :zwinker:

Teekeks 6. Apr 2010 11:44

Re: Luckies "myIsDebuggerPresent" liefert immer tr
 
Delphi-Quellcode:
function MyIsDebuggerPresent: Boolean; assembler;
var
  BeingDebugged: Boolean;
begin
  asm
//   push eax;
   push ebx;
   mov eax, fs:[$18];
   mov ebx, [eax+$30];
   mov eax, [ebx+2];
   mov [BeingDebugged], al;
   pop ebx;
//   pop eax; // Wichtig! POP immer in umgekehrter Reihenfolge von PUSH
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  ...
begin
  ...

  if (myIsDebuggerPresent) then
    ShowMessage('Ja');

  ...
end;

TheMiller 6. Apr 2010 11:48

Re: Luckies "myIsDebuggerPresent" liefert immer tr
 
Hallo,

danke - aber ich erhalte auf die Weise das gleiche Verhalten

himitsu 6. Apr 2010 11:49

Re: Luckies "myIsDebuggerPresent" liefert immer tr
 
POP EAX würde das Result (welches ja in EAX liegt) überschreiben.


Delphi-Quellcode:
function MyIsDebuggerPresent: Boolean;
var
  BeingDebugged: Boolean;
begin
  asm
    push eax
    push ebx
    mov eax, fs:[$18]
    mov ebx, [eax+$30]
    mov eax, [ebx+2]
    mov [BeingDebugged], al
    pop ebx
    pop eax
  end;
  Result := BeingDebugged;
end;

Delphi-Quellcode:
function MyIsDebuggerPresent: Boolean; assembler;
asm
  push ebx
  mov eax, fs:[$18]
  mov ebx, [eax+$30]
  mov eax, [ebx+2]
  pop ebx
end;
Delphi-Quellcode:
function MyIsDebuggerPresent: Boolean; assembler;
asm
  mov eax, fs:[$18]
  mov edx, [eax+$30]
  mov eax, [edx+2]
end;

function MyIsDebuggerPresent: Boolean; assembler;
asm
  mov eax, fs:[$18]
  mov eax, [eax+$30]
  mov eax, [eax+2]
end;

TheMiller 6. Apr 2010 11:55

Re: Luckies "myIsDebuggerPresent" liefert immer tr
 
Hi.

Das mit dem "Result" hat funktioniert. Er liefert jetzt die richtigen Ergebnisse. Aber warum hast du noch drei verschiedene Codeblöcke eingebaut? Kannst du dazu noch was sagen?

rollstuhlfahrer 6. Apr 2010 12:04

Re: Luckies "myIsDebuggerPresent" liefert immer tr
 
die 3 anderen Code-Blöcke sind im Grunde nur Alternativen zu der ersten Funktion. Sie liefern alle exakt das gleiche Ergebnis, nur wird das Ergebnis immer etwas verschieden berechnet.
In der 1. Alternative wird das Ergebnis in ebx berechnet und dann nach eax verschoben und ebx aus dem Stack entfernt.
In der 2. Alternative wird das Ergebnis in edx berechnet und dann nach eax verschoben.
In der 3. Alternative wird das Ergebnis gleich in eax berechnet.

Bernhard

TheMiller 6. Apr 2010 12:12

Re: Luckies "myIsDebuggerPresent" liefert immer tr
 
Ah okay.

Vielen Dank. Ist irgendeine Methode zu bevorzugen, oder ist es im Grunde egal?

rollstuhlfahrer 6. Apr 2010 12:16

Re: Luckies "myIsDebuggerPresent" liefert immer tr
 
kommt ganz darauf an, wie du das machen willst. Wenn es etwas unsichtbarer sein sollte, würde ich keine Funktion benutzen, sondern das ganze in der Aufruf-Prozedur machen. Ansonsten sind die 4 gleichwertig.

Bernhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:10 Uhr.
Seite 1 von 4  1 23     Letzte »    

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