AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

debugging erkennen

Ein Thema von FriFra · begonnen am 20. Jul 2003 · letzter Beitrag vom 21. Jul 2003
Antwort Antwort
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#1

debugging erkennen

  Alt 20. Jul 2003, 20:29
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.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: debugging erkennen

  Alt 20. Jul 2003, 22:36
Zitat:
INT 20
Das ist für DOS und funktioniert unter Windows nicht.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#3

Re: debugging erkennen

  Alt 21. Jul 2003, 00:21
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.
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#4

Re: debugging erkennen

  Alt 21. Jul 2003, 01:14
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
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#5

Re: debugging erkennen

  Alt 21. Jul 2003, 02:26
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 von FriFra:
[...]
if @IsDebuggerPresent <> nil then
[...]
if Assigned(IsDebuggerPresent) then SiehtBesserAus

.nico

ps: FreeLibrary vergessen
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: debugging erkennen

  Alt 21. Jul 2003, 09:25
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.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: debugging erkennen

  Alt 21. Jul 2003, 11:05
Zitat von NicoDE:
if Assigned(IsDebuggerPresent) then SiehtBesserAus
Ist aber langsamer
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#8

Re: debugging erkennen

  Alt 21. Jul 2003, 11:17
Zitat von Chewie:
Ist aber langsamer
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 ).
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#9

Re: debugging erkennen

  Alt 21. Jul 2003, 11:23
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 ...
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#10

Re: debugging erkennen

  Alt 21. Jul 2003, 11:47
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 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