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]