Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi debugging erkennen (https://www.delphipraxis.net/6738-debugging-erkennen.html)

FriFra 20. Jul 2003 20:29


debugging erkennen
 
Wie kann ich zúverlässig erkennen, ob ein Debugger läuft?

Ich habe dazu folgenden Text gefunden:
Zitat:

1.4 Überprüfen der CPU Flags



Dieser Trick kann gegen fast jeden Real Mode Debugger eingesetzt werden. Man

muß nur das Trace Flag irgendwo im Programm löschen und es später

überprüfen. Wenn es eingeschaltet ist, läuft ein Debugger im Hintergrund.



Beispiel:



CS:0100 9C PUSHF

CS:0101 58 POP AX

CS:0102 25FFFE AND AX,FEFF

CS:0105 50 PUSH AX

CS:0106 9D POPF



Und später im Programm:



CS:1523 9C PUSHF

CS:1524 58 POP AX

CS:1525 250001 AND AX,0100

CS:1528 7402 JZ 152C

CS:152A CD20 INT 20
Man kann ja ASM-Code in Delphi integrieren, aber ich hab im Moment keinen Plan wie ich das im vorliegenden Fall anstellen soll.

jbg 20. Jul 2003 22:36

Re: debugging erkennen
 
Zitat:

INT 20
Das ist für DOS und funktioniert unter Windows nicht.

NicoDE 21. Jul 2003 00:21

Re: debugging erkennen
 
Es gibt etliche Möglichkeiten einen Debugger zu verstecken...
Die API-Funktion IsDebuggerPresent() sollte für einfache Prüfungen reichen (alles andere artet in Arbeit aus).

.nico

ps: die Funktion dynamisch zu binden ist keine schlechte Idee, da es sie erst ab Win98 gibt.

FriFra 21. Jul 2003 01:14

Re: debugging erkennen
 
Danke für den Tip ;)

Ich habe es jetzt wie folgt implementiert:
Delphi-Quellcode:
function IsDebuggerPresent: boolean;
type
  TIsDebuggerPresent = function: boolean; stdcall;
var
  lib: Cardinal;
  IsDebuggerPresent: TIsDebuggerPresent;
  DebuggerFound: boolean;
begin
  //IsDebuggerPresent aus Kernel32...
  lib := LoadLibrary(kernel32);
  if (lib <> INVALID_HANDLE_VALUE) and (lib <> 0) then
  begin
    IsDebuggerPresent := GetProcAddress(lib, 'IsDebuggerPresent');
    if Assigned(IsDebuggerPresent) then
      Result := IsDebuggerPresent
    else
      Result := False;
  end
  else
    Result := False;
end;
P.S. Ich habe nun den Tip von NicoDE berücksichtigt ;)

NicoDE 21. Jul 2003 02:26

Re: debugging erkennen
 
Zitat:

Zitat von FriFra
[...]
lib := LoadLibrary('kernel32');
[...]

Die DLL sollte mit Erweiterung angegeben werden, da es sonst nicht auf allen Windows-Versionen funktioniert (am einfachsten die String-Konstante kernel32 aus der Windows.pas).

Zitat:

Zitat von FriFra
[...]
if @IsDebuggerPresent <> nil then
[...]

if Assigned(IsDebuggerPresent) then SiehtBesserAus ;)

.nico

ps: FreeLibrary vergessen ;)

jbg 21. Jul 2003 09:25

Re: debugging erkennen
 
Zitat:

Zitat von NicoDE
ps: FreeLibrary vergessen ;)

Oder gleich das LoadLibrary durch GetModuleHandle(PChar(kernel32)) ersetzen, denn der Kernel ist mit sehr sehr hoher Wahrscheinlichkeit schon geladen, bevor das Programm überhaupt startet. :wink:

Chewie 21. Jul 2003 11:05

Re: debugging erkennen
 
Zitat:

Zitat von NicoDE
if Assigned(IsDebuggerPresent) then SiehtBesserAus ;)

Ist aber langsamer :wink:

NicoDE 21. Jul 2003 11:17

Re: debugging erkennen
 
Zitat:

Zitat von Chewie
Ist aber langsamer :wink:

Nunja, dafür kann man davon ausgehen, dass die Adresse der Funktionsvariablen sicherlich ungleich nil ist (was die Abfrage ziemlich überflüssig erscheinen läßt ;)).

FriFra 21. Jul 2003 11:23

Re: debugging erkennen
 
Davon ausgehen kann man eben nicht, da es ja immernoch Leute mit Win95 geben soll die eine Fehlermeldung bekämen weil es dort diese Funktion nicht gibt :wink: ...

NicoDE 21. Jul 2003 11:47

Re: debugging erkennen
 
Zitat:

Zitat von FriFra
Davon ausgehen kann man eben nicht,
[...]

Ich meine die Adresse der Funktionsvariablen, nicht deren Inhalt :)

OK, deutlicher...
Dein Code macht das, was Du willst (aber nur, weil es eine Funktionsvariable ist...)

Code:
function Foo(): Boolean;
var
  Bar: procedure();
begin
  Bar := nil;
  Result := (@Bar <> nil);
end;

function Bar(): Boolean;
var
  Foo: Pointer;
begin
  Foo := nil;
  Result := (@Foo <> nil);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Foo() then
    ShowMessage('foo');
  if Bar() then
    ShowMessage('bar');
end;
Das ist eigentlich inkonsistent, da ein Funktionszeiger auch nur ein Pointer ist (somit kann @Foo zu Missverständnissen führen - ist jetzt die Adresse der Variablen oder der Inhalt gemeint).

.nico


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz