Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Sonstiges (https://www.delphipraxis.net/45-library-sonstiges/)
-   -   Delphi Ermitteln ob Anwendung aus Debugger aufgerufen wird (https://www.delphipraxis.net/45855-ermitteln-ob-anwendung-aus-debugger-aufgerufen-wird.html)

SubData 13. Mai 2005 05:12


Ermitteln ob Anwendung aus Debugger aufgerufen wird
 
Dieser Quellcode ist NICHT von mir, ich möchte ihn hier nur reinstellen, da ich ziemlich lange danach gesucht habe!
Sobald ich den Link zum Original wiederfinde, reiche ich den nach :>

Mit diesem Code kann man ermitteln, ob die aktuell ausgeführte Anwendung direkt aus der Delphi IDE, oder aus einem anderen Debugger heraus gestartet wird.
(SoftICE stellt meines Wissens nach eine Ausnahme dar)


Es werden folgende Deklarationen benötigt:
Delphi-Quellcode:
type
  TIsDebuggerPresent = function: BOOL; stdcall;

type
  PProcessDatabase = ^TProcessDatabase;
  TProcessDatabase = packed record
    DontCare1: array[0..7] of Integer;
    Flags: Integer;
    DontCare2: array[0..11] of Integer;
    DebugeeCB: Integer;
    DontCare3: array[0..22] of Integer;
    DontCare4: Word;
  end;

const
  fDebugSingle = $00000001;

Der Programmcode:
Delphi-Quellcode:
{ Funktion für Windows NT }
function IsDebuggerPresentForNT: Boolean;
var
  Kernel32: LongInt;
  FIsDebuggerPresent: TIsDebuggerPresent;
begin
  Result := False;
  Kernel32 := LoadLibrary('KERNEL32.DLL');
  if Kernel32 <> 0 then
  begin
    FIsDebuggerPresent := GetProcAddress(Kernel32, 'IsDebuggerPresent');
    if Assigned(FIsDebuggerPresent) then Result := FIsDebuggerPresent;
    FreeLibrary(Kernel32);
  end;
end;


{Funktion für Windows 9x }
function IsDebuggerPresentForWindows: Boolean;
var
  PDB: PProcessDatabase;
  TID: Integer;
  Obsfucator: Integer;
begin
  Result := False;
  Obsfucator := 0;
  TID := GetCurrentThreadID;
  asm
    MOV    EAX, FS:[18h]
    SUB    EAX, 10h
    XOR    EAX, [TID]
    MOV    [Obsfucator], EAX
  end;
  if Obsfucator <> 0 then
  begin
    PDB := Pointer(GetCurrentProcessID xor Obsfucator);
    Result := (PDB^.Flags and fDebugSingle) <> 0;
  end;
end;


{ Hauptfunktion }
function IsDebuggerPresent: Boolean;
var
  OSVersionInfo: TOSVersionInfo;
begin
  OSVersionInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  GetVersionEx(OSVersionInfo);
  if OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then Result := IsDebuggerPresentForNT
  else Result := IsDebuggerPresentForWindows;
end;
Von jfheins kommt noch folgender Hinweis:
Delphi-Quellcode:
if DebugHook <> 0 then
  // In der IDE
Quelle: http://www.delphipraxis.net/internal...=362546#362546
Dies funktioniert aber nur in dem Sinne, dass jeder Debugger erkannt wird und nicht sicher ist, ob es sich dabei wirklich um Delphi handelt.

Von retnyg kommt folgende Assembler-Variante:
Delphi-Quellcode:
// aus uallprotect unit
function IsDebuggerPresent: boolean; stdcall;
asm
  MOV    EAX, FS:[030H]
  TEST   EAX, EAX
  JS     @@W9X
@@WNT:
  MOV EAX, FS:[$18]
  MOV EAX, [EAX+$30]
  MOVZX EAX, [EAX+2]
  RET
@@W9X:
  MOV EAX, [$BFFC9CE4]
  MOV ECX, [EAX]
  CMP [ECX+$54], 00000001
  SBB EAX, EAX
  INC EAX
  RET
end;
[edit=Chakotay1308]Weitere Methode angefügt. Mfg, Chakotay1308[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 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