AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Sonstiges Delphi Ermitteln ob Anwendung aus Debugger aufgerufen wird
Thema durchsuchen
Ansicht
Themen-Optionen

Ermitteln ob Anwendung aus Debugger aufgerufen wird

Ein Thema von SubData · begonnen am 13. Mai 2005
Antwort Antwort
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#1

Ermitteln ob Anwendung aus Debugger aufgerufen wird

  Alt 13. Mai 2005, 06:12
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]
Ronny
/(bb|[^b]{2})/
  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 12:20 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