::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-07 21:42:57, Hit : 5648, Vote : 1434
 design mode 인지 검사하기

(**************************************************************)
(* Unit Name:   DelRun                                        *)
(* Description: Detect whether the current process is running *)
(*              under the control of Delphi under Windows 95  *)
(*              and NT.                                       *)
(* Author:      Yorai Aminov                                  *)
(* Created:     30 April 1998                                 *)
(* Updates:     12 April 1999                                 *)
(*                Use correct IsDebuggerPresent on Windows 98 *)
(*                                                            *)
(* Copyright (c) 1998, 99 Yorai Aminov                        *)
(**************************************************************)
unit DelRun;

interface

uses
  Windows, Classes, SysUtils;

function RunningUnderDelphi: Boolean;

implementation

{ NtQueryInformation constants }

const
  ProcessBasicInformation = 0;

{ NtQueryInformation types }

type
  TProcessBasicInformation = packed record
    ExitStatus: Integer;
    PebBaseAddress: Pointer;
    AffinityMask: Integer;
    BasePriority: Integer;
    UniqueProcessID: Integer;
    InheritedFromUniqueProcessID: Integer;
  end;

  TNtQueryInformationProcess =
    function(hProcess: THandle; ProcessInformationClass: Integer;
      var ProcessInformation; ProcessInformationLength: Integer;
      var ReturnLength: Integer): Integer; stdcall;

{ NT IsDebuggerPresent prototype }

type
  TIsDebuggerPresent = function: BOOL; stdcall;

{ Retrieve parent process ID from NtQueryInformation }

function GetParentProcessIDForNT: Integer;
var
  hNTDLL: Integer;
  NtQueryInformationProcess: TNtQueryInformationProcess;
  PBI: TProcessBasicInformation;
  ReturnLength: Integer;
begin
  Result := 0;
  // Attempt to load NTDLL
  hNTDLL := LoadLibrary('NTDLL.DLL');
  if hNTDLL <> 0 then
  begin
    // Retrieve address of NtQueryInformationProcess
    NtQueryInformationProcess := GetProcAddress(hNTDLL, 'NtQueryInformationProcess');
    if Assigned(NTQueryInformationProcess) then
    begin
      // Call NtQueryInformationProcess
      NtQueryInformationProcess(GetCurrentProcess, ProcessBasicInformation,
                                PBI, SizeOf(PBI), ReturnLength);
      // Return parent process ID
      Result := PBI.InheritedFromUniqueProcessID;
    end;
    // Release NTDLL
    FreeLibrary(hNTDLL);
  end;
end;

{ Check for debugger under NT }

function IsDebuggerPresentForNT: Boolean;
var
  Kernel32: THandle;
  FIsDebuggerPresent: TIsDebuggerPresent;
begin
  Result := False;
  // Attempt to load KERNEL32
  Kernel32 := LoadLibrary('KERNEL32.DLL');
  if Kernel32 <> 0 then
  begin
    // Retrieve address of IsDebuggerPresent
    FIsDebuggerPresent := GetProcAddress(Kernel32,
'IsDebuggerPresent');
    // Return True if a debugger is present
    if Assigned(FIsDebuggerPresent) then
      Result := FIsDebuggerPresent;
    // Release KERNEL32
    FreeLibrary(Kernel32);
  end;
end;

{ ToolHelp32 constants }

const
  TH32CS_SNAPPROCESS  = $00000002;

{ ToolHelp32 types }

type
  PProcessEntry32 = ^TProcessEntry32;
  TProcessEntry32 = record
    dwSize: DWORD;
    cntUsage: DWORD;
    th32ProcessID: DWORD;
    th32DefaultHeapID: DWORD;
    th32ModuleID: DWORD;
    cntThreads: DWORD;
    th32ParentProcessID: DWORD;
    pcPriClassBase: Longint;
    dwFlags: DWORD;
    szExeFile: array[0..MAX_PATH - 1] of Char;// Path
  end;

{ ToolHelp32 function prototypes }

type
  TCreateToolhelp32Snapshot =
    function(dwFlags, th32ProcessID: DWORD): THandle; stdcall;
  TProcess32First =
    function(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL;
stdcall;
  TProcess32Next =
    function(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL;
stdcall;


function GetParentProcessIDForWindows: Integer;
var
  Kernel32: THandle;
  CreateToolhelp32Snapshot: TCreateToolhelp32Snapshot;
  Process32First: TProcess32First;
  Process32Next: TProcess32Next;
  Snapshot: THandle;
  Entry: TProcessEntry32;
  WalkResult: Boolean;
  ID: ULONG;
begin
  Result := 0;
  // Attempt to load KERNEL32
  Kernel32 := LoadLibrary('KERNEL32.DLL');
  if Kernel32 <> 0 then
  begin
    // Retrieve ToolHelp32 function addresses
    CreateToolhelp32Snapshot :=
      GetProcAddress(Kernel32, 'CreateToolhelp32Snapshot');
    Process32First := GetProcAddress(Kernel32, 'Process32First');
    Process32Next := GetProcAddress(Kernel32, 'Process32Next');
    if Assigned(CreateToolhelp32Snapshot) and
       Assigned(Process32First) and
       Assigned(Process32Next) then
    begin
      // Retrieve current process ID for comparison
      ID := GetCurrentProcessId;
      // Create processes snapshot
      Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      if Integer(Snapshot) <> -1 then
      begin
        // Start walking list of processes
        Entry.dwSize := SizeOf(TProcessEntry32);
        WalkResult := Process32First(Snapshot, Entry);
        // Walk through entire list until result can be determined
        while (GetLastError <> ERROR_NO_MORE_FILES) and (Result = 0) do
        begin
          if WalkResult then
          begin
            // If this is the current process, return its parent
            if Entry.th32ProcessID = ID then
              Result := Entry.th32ParentProcessID;
          end;
          // Move to next item in the process list
          Entry.dwSize := SizeOf(TProcessEntry32);
          WalkResult := Process32Next(Snapshot, Entry);
        end;
        // Release handle to the snapshot
        CloseHandle(Snapshot);
      end;
    end;
    // Release KERNEL32
    FreeLibrary(Kernel32);
  end;
end;

{ Process database constants }

const
  fDebugSingle        = $00000001;

{ Process database types }

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;

function IsDebuggerPresentForWindows: Boolean;
var
  PDB: PProcessDatabase;
  TID: Integer;
  Obsfucator: ULONG;
begin
  Result := False;
  Obsfucator := 0;
  TID := GetCurrentThreadID;
  // Calculate Obsfucator
  asm
    MOV     EAX, FS:[18h]
    SUB     EAX, 10h
    XOR     EAX, [TID]
    MOV     [Obsfucator], EAX
    // Obsfucator := (@TIB - $10) xor GetCurrentThreadID
  end;
  if Obsfucator <> 0 then
  begin
    // Retriece pointer to the PDB
    PDB := Pointer(GetCurrentProcessID xor Obsfucator);
    // Return True if process is being debugged
    Result := (PDB^.Flags and fDebugSingle) <> 0;
  end;
end;

function GetParentProcessID: Integer;
begin
  // If Windows 95/98 or NT 5.0+, use ToolHelp32
  if (Win32Platform = VER_PLATFORM_WIN32_NT) and
     (Win32MajorVersion < 5) then
    Result := GetParentProcessIDForNT else
    Result := GetParentProcessIDForWindows;
end;

function IsDebuggerPresent: Boolean;
begin
  // If Windows 95, use PDB. Otherwise, use NT's IsDebuggerPresent
  if (Win32Platform = VER_PLATFORM_WIN32_NT) or
    ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
     ((Win32MajorVersion > 4) or
      ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)))) then
    Result := IsDebuggerPresentForNT else
    Result := IsDebuggerPresentForWindows;
end;

procedure EnumWindowsProc(Window: THandle; LParam: Integer); stdcall;
var
  ClassName: string;
begin
  // Allocate space for class name
  SetLength(ClassName, 255);
  // Retrieve window's class name
  GetClassName(Window, PChar(ClassName), 255);
  // Reallocate string length
  SetLength(ClassName, StrLen(PChar(ClassName)));
  // If window belongs to an instance of Delphi, add to list
  if ClassName = 'TAppBuilder' then
    TList(LParam).Add(Pointer(Window));
end;

function RunningUnderDelphi: Boolean;
var
  List: TList;
  i: Integer;
  ID, ParentID: Integer;
begin
  Result := False;
  // Retrieve ID for the parent process
  ParentID := GetParentProcessID;
  // If ID found and being debugged, check for Delphi
  if (ParentID <> 0) and (IsDebuggerPresent) then
  begin
    // Create a list of window handles
    List := TList.Create;
    // Fill list with window handles for instances of Delphi
    EnumWindows(@EnumWindowsProc, Integer(List));
    // Check Delphi instances
    for i := 0 to List.Count - 1 do
    begin
      // Get process ID for the Delphi window
      GetWindowThreadProcessID(Integer(List[i]), @ID);
      // Compare IDs
      if ID = ParentID then
      begin
        // The process parent ID is Delphi's process ID
        Result := True;
        Break;
      end;
    end;
    // Free list
    List.Free;
  end;
end;

end.





651   [일반/컴포넌트] 투명한(Transparent) TPanel 콤포넌트  김영대 2003/03/07 4922 1152
650   [데이터베이스] 테이블,인덱스 복사하기  김영대 2003/03/07 3931 1123
649   [일반/컴포넌트] TRichEdit 에 윗첨자, 아랫첨자 만들기  김영대 2003/03/07 4369 1120
648   [윈도우즈 API] 외부 프로그램의 크기를 내 프로그램에서 변경하기  김영대 2003/03/07 4429 1155
647   [윈도우즈 API] Ctrl-Esc, Ctrl-Alt-Del, Alt-Tab 입력 막기  김영대 2003/03/07 5610 1229
646   [일반/컴포넌트] 달력에 그림이나 기호 그리기  김영대 2003/03/07 4260 1000
645   [윈도우즈 API] 파일의 이동,복사,삭제 API  김영대 2003/03/07 6435 1546
644   [일반/컴포넌트] TPanel, TImage 에 Gradient 효과 주기  김영대 2003/03/07 4377 1266
643   [시스템] System, User, GDI Resource  김영대 2003/03/07 4626 1338
642   [시스템] PC에 설치된 드라이브 목록 구하기  김영대 2003/03/07 4562 1111
641   [윈도우즈 API] PrintScreen(PrtSc)키의 동작 막기  김영대 2003/03/07 5761 1286
640   [시스템] 플로피(floppy) 디스크 드라이브의 타입 구하기  김영대 2003/03/07 5866 1534
639   [일반/컴포넌트] 문자열 프로시저명으로 실제 프로시저 호출하기  김영대 2003/03/07 4881 1534
638   [일반/컴포넌트] StringGrid 수직 스크롤바의 크기를 임의로 바꾸기  김영대 2003/03/07 5044 1071
637   [일반/컴포넌트] JPEG, Bitmap 상호 변환하여 파일로 저장하기  김영대 2003/03/07 4212 1208
636   [일반/컴포넌트] Access Violation at address ?????? 로부터 소스위치 알기  김영대 2003/03/07 6602 1284
635   [일반/컴포넌트] 각도에 따라 회전한 화살표 그리기  김영대 2003/03/07 4330 1084
634   [윈도우즈 API] 작업표시줄의 "항상 위" 검사하여 설정하기  김영대 2003/03/07 4660 1185
633   [윈도우즈 API] 윈도우즈 탐색기에서 "Copy" 될 파일목록 구하기  김영대 2003/03/07 4881 1286
632   [일반/컴포넌트] TStringGrid의 마우스가 있는 Cell의 Hint 표시  김영대 2003/03/07 6543 1676
631   [윈도우즈 API] 윈도우즈 "시작" 메뉴 표시하기/감추기  김영대 2003/03/07 4405 1164
630   [일반/컴포넌트] ListBox의 Item을 버튼으로 계속 삭제하기  김영대 2003/03/07 3968 1082
629   [윈도우즈 API] 윈도우즈의 주소록(WAB) 프로그램 띄우기  김영대 2003/03/07 5365 1717
628   [윈도우즈 API] 다른 프로그램의 구동 디렉토리 알아내기  김영대 2003/03/07 4785 1287
627   [윈도우즈 API] 윈도우즈 전화걸기 화면 띄우기  김영대 2003/03/07 4506 1196
626   [일반/컴포넌트] RichEdit에서 HTML 태그를 다른색으로 표시하기  김영대 2003/03/07 5388 1191
625   [윈도우즈 API] DDE를 사용하여 IE, Netscape의 현재 URL 가져오기  김영대 2003/03/07 4522 1220
624   [윈도우즈 API] 데스크탑에 있는 아이콘의 갯수 구하기  김영대 2003/03/07 4142 1125
  [일반/컴포넌트] design mode 인지 검사하기  김영대 2003/03/07 5648 1434
622   [네트웍/인터넷] 프린터의 용지 크기/공급 설정하기  김영대 2003/03/07 6750 1238
621   [시스템] 프린터의 "용지 공급" 리스트 구하기  김영대 2003/03/07 4647 1328
620   [네트웍/인터넷] Read/Write to COM Port  김영대 2003/03/07 4760 1125
619   [일반/컴포넌트] Button의 Mouse Down/Up 흉내내기  김영대 2003/03/07 4315 1108
618   [일반/컴포넌트] 두 StringGrid 의 scroll 을 동기화 시키기  김영대 2003/03/07 4348 1047
617   [일반/컴포넌트] 해상도(screen resolution)를 변경했는지 검사  김영대 2003/03/07 4524 1274
616   [일반/컴포넌트] StringGrid의 선택된 Cell을 버튼으로 보이기  김영대 2003/03/07 4346 1073
615   [윈도우즈 API] Windows NT 도메인명 가져오기  김영대 2003/03/07 5598 1464
614   [시스템] Locking/ Unlocking floppy driver or CD  김영대 2003/03/07 4130 1159
613   [시스템] CD-ROM의 변경여부를 감시하기  김영대 2003/03/07 4866 1255
612   [윈도우즈 API] 즐겨찾기 폴더의 파일에서 URL 뽑아내기  김영대 2003/03/07 5095 1236

[1][2][3][4][5][6][7][8] 9 [10]..[25] [다음 10개]
 

Copyright 1999-2020 Zeroboard / skin by zero