Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CreateToolHelp32SnapShot hooks umgehen (https://www.delphipraxis.net/50408-createtoolhelp32snapshot-hooks-umgehen.html)

brechi 8. Aug 2005 18:20

Re: CreateToolHelp32SnapShot hooks umgehen
 
aus 2 gründen benutze ich das nicht

1) wenn man viel mit pointern arbeitet, und man macht mal einen fehler und es crashed bei einer zuweisung
wie z.b.

Delphi-Quellcode:
a := 1234;
dann weiß man nichst sofort das es eventl eine "absolute" variable handelt

sollte z.b.
Delphi-Quellcode:
var bla: byte;
  blub: array [0..1221] of integer absolute bla;
benutzt werden

durch die zuweisung

Delphi-Quellcode:
blub[1221] := 12345678
crashed es eventl. und man erkennt nicht sofort das es sich hierbei einfach um ein

Delphi-Quellcode:
pinteger(integer(@bla)+4*1221)^ := 12345678
handelt (auch wenn das ausgeschrieben mehr arbeit ist)

2) kann man nichts dynamisch machen, braucht man das einmal vermischt man beide "methoden" was ich dann doch unübersichtlicher finde


aber das ist nur meien persönliche meinung

NicoDE 8. Aug 2005 20:46

Re: CreateToolHelp32SnapShot hooks umgehen
 
Zitat:

Zitat von brechi
aber das ist nur meien persönliche meinung

Und meine ist, dass Handles untypisierte Zeiger sind, und selbige in der Delphi RTL 'falsch' deklariert sind... um mir die ganzen Casts in dem Beispiel zu sparen, habe ich mich für die 'schnelle und dreckige' Lösung entschieden :)

Arnulf 30. Aug 2005 10:21

Re: CreateToolHelp32SnapShot hooks umgehen
 
Ich muß das thema nochmal aufwärmen :)
Also die native apis scheinen dann nicht ganz das richtige zu sein.
Wenn nämlich ein hook auf QueryProcessDebugInformation gemacht wird, dann werden wohl auch die native apis gehookt.

Was jetzt brechis methode betrifft - leider funktioniert die so nicht wäre aber sehr interessant das hinzubekommen.

Als ersatzlösung wäre es vermutlich möglich mir ntdll.dll aus dem system ordner in mein verzeichnis zu kopieren, die .dll umzubenennen ( zufallszahl oder sowas ) und dann einfach mit loadlibrary zu benutzen.
Wenn ich das jedesmal nach dem programmstart mache, dann wirds mit einem hook auch recht schwer.

Fals ich schon wieder unsinn rede, dann bitte mitteilen :)

Danke
Arnulf

Olli 30. Aug 2005 10:30

Re: CreateToolHelp32SnapShot hooks umgehen
 
Zitat:

Zitat von NicoDE
Und meine ist, dass Handles untypisierte Zeiger sind, und selbige in der Delphi RTL 'falsch' deklariert sind...

Pah ... das sind doch keine Zeiger :mrgreen: ... Indeces in eine Handletabelle, ja, aber Zeiger ...

Zitat:

Zitat von Arnulf
Also die native apis scheinen dann nicht ganz das richtige zu sein.
Wenn nämlich ein hook auf QueryProcessDebugInformation gemacht wird, dann werden wohl auch die native apis gehookt.

RtlQueryProcessDebugInformation ist eine Native API ;)

Ich muß das thema nochmal aufwärmen :)Als ersatzlösung wäre es vermutlich möglich mir ntdll.dll aus dem system ordner in mein verzeichnis zu kopieren, die .dll umzubenennen ( zufallszahl oder sowas ) und dann einfach mit loadlibrary zu benutzen.[/quote]Ich bezweifele, daß das geht, da eigentlich diese DLLs nicht dafür ausgelegt sind reloziert zu werden, aber vielleicht hängt das auch davon ab, welche Funktionen man aufruft ;)

Arnulf 30. Aug 2005 11:03

Re: CreateToolHelp32SnapShot hooks umgehen
 
Zitat:

RtlQueryProcessDebugInformation ist eine Native API
Ja klar aber mir hat man gesagt, daß createtoolhelpsnapshot ebenfalls die native api benutzt.
Damit wäre es doch logisch RtlQueryProcessDebugInformation zu hooken wenn man .dlls oder was auch immer verstecken will.
Oder irre ich mich da?
Und das ist doch das eigentliche ziel solche hooks zu verhindern.
Ich hab ja bisher noch nichtmal solche einschlägigen programme gefunden die .dlls verstecken - man hat mir nur gesagt, daß man die cheat checks damit umgehen kann und das klingt auch logisch.
Zitat:

da eigentlich diese DLLs nicht dafür ausgelegt sind reloziert zu werden
Das ist wohl war.
Die frage ist aber warum nicht? - ist das in der .dll festgeschrieben oder weiß das das betriebssystem?
wenn ich also den namen der ntdll.dll ändere wäre es doch durchaus möglich, daß es funktioniert.
Vermutlich hast du recht und es geht mit bestimmten funktionen.
Aber das war auch nur meine notlösung.

Arnulf

Olli 30. Aug 2005 12:04

Re: CreateToolHelp32SnapShot hooks umgehen
 
Zitat:

Zitat von Arnulf
Zitat:

RtlQueryProcessDebugInformation ist eine Native API
Ja klar aber mir hat man gesagt, daß createtoolhelpsnapshot ebenfalls die native api benutzt.
Damit wäre es doch logisch RtlQueryProcessDebugInformation zu hooken wenn man .dlls oder was auch immer verstecken will.

Durchaus, aber es ist nicht die einzige Native API, die in der Toolhelp API benutzt wird.

Zitat:

Zitat von Arnulf
Zitat:

da eigentlich diese DLLs nicht dafür ausgelegt sind reloziert zu werden
Das ist wohl war.
Die frage ist aber warum nicht? - ist das in der .dll festgeschrieben oder weiß das das betriebssystem?

1. sind alle DLLs aufeinander abgestimmt. Schau dir mal die Base Address in den einzelnen DLLs zB mit dem Dependency Walker an, die passen alle wie ein Zahnrad ins andere.
2. sind die DLLs nicht darauf ausgelegt, auch wenn sie meist dennoch eine Relokationstabelle enthalten.

Zitat:

Zitat von Arnulf
wenn ich also den namen der ntdll.dll ändere wäre es doch durchaus möglich, daß es funktioniert.

Ja, aber eben nur durch relozieren, weil die NTDLL bereits in jeden Prozess eingeblendet ist.

Arnulf 30. Aug 2005 12:52

Re: CreateToolHelp32SnapShot hooks umgehen
 
Zitat:

Durchaus, aber es ist nicht die einzige Native API, die in der Toolhelp API benutzt wird.
Das ist klar toolhelp api kann ja auch viel.
Trotzdem kann ich einfach nicht erkennen wie ich damit dann hooks umgehen können soll.
Vielleicht versteh ichs ja auch noch nicht so richtig.

Zitat:

Ja, aber eben nur durch relozieren, weil die NTDLL bereits in jeden Prozess eingeblendet ist.
Tja damit muß ich mich wohl mit relozieren beschäftigen oder mit den relocation tables :).
Es wird nie ein ende nehmen und irgendwann kommt dann .net wo soll das nur hinführen....

Arnulf

brechi 30. Aug 2005 14:11

Re: CreateToolHelp32SnapShot hooks umgehen
 
das blöde daran ist das bei RtlQueryProcessDebugInformation die ntdll IPC benutzt um die daten von dem prozess zu bekommen

es wird ein Thread in dem ZiuelProcess (von dem wo die daten ausgelesen werden sollen) erstellt, lödt man die dll ein 2. mal übergibt aber die ntdll eine falsche startadresse (und zwar wo sie neu geladen wurde) diese gibt es im zielprzess aber nicht und wird der code zum auslesen nie aufgerufen... naja könnt noch mehr erzählen, aber hier mal nen tricky code mit dem das funzt :)

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, uallProtect, uallHook;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  PDebugModule = ^TDebugModule;
  TDebugModule = packed record
    Reserved: array [0..1] of Cardinal;
    Base: Cardinal;
    Size: Cardinal;
    Flags: Cardinal;
    Index: Word;
    Unknown: Word;
    LoadCount: Word;
    ModuleNameOffset: Word;
    ImageName: array [0..$FF] of Char;
  end;

type
  PDebugModuleInformation = ^TDebugModuleInformation;
  TDebugModuleInformation = record
    Count: Cardinal;
    Modules: array [0..0] of TDebugModule;
  end;
  PDebugBuffer = ^TDebugBuffer;
  TDebugBuffer = record
    SectionHandle: THandle;
    SectionBase: Pointer;
    RemoteSectionBase: Pointer;
    SectionBaseDelta: Cardinal;
    EventPairHandle: THandle;
    Unknown: array [0..1] of Cardinal;
    RemoteThreadHandle: THandle;
    InfoClassMask: Cardinal;
    SizeOfInfo: Cardinal;
    AllocatedSize: Cardinal;
    SectionSize: Cardinal;
    ModuleInformation: PDebugModuleInformation;
    BackTraceInformation: Pointer;
    HeapInformation: Pointer;
    LockInformation: Pointer;
    Reserved: array [0..7] of Pointer;
  end;

const
  PDI_MODULES = $01;
  ntdll = 'ntdll.dll';

var
  HNtDll: HMODULE;
  HNtDll2: HMODULE;

type
  TFNRtlCreateQueryDebugBuffer = function(Size: Cardinal;
    EventPair: Boolean): PDebugBuffer;
  stdcall;
  TFNRtlQueryProcessDebugInformation = function(ProcessId,
    DebugInfoClassMask: Cardinal; var DebugBuffer: TDebugBuffer): Integer;
  stdcall;
  TFNRtlDestroyQueryDebugBuffer = function(DebugBuffer: PDebugBuffer): Integer;
  stdcall;
  TFNRtlCreateUserThread = procedure(ProcessHandle: THANDLE;
   SecurityDescriptor: PSECURITY_DESCRIPTOR;
   CreateSuspended: Boolean;
   StackZeroBits: ULONG;
   StackReserved: PULONG; StackCommit: PULONG;
   StartAddress: Pointer;
   StartParameter: Pointer;
   ThreadHandle: PHANDLE;
   ClientID: Pointer);
  stdcall;


var
  RtlCreateQueryDebugBuffer: TFNRtlCreateQueryDebugBuffer;
  RtlQueryProcessDebugInformation: TFNRtlQueryProcessDebugInformation;
  RtlDestroyQueryDebugBuffer: TFNRtlDestroyQueryDebugBuffer;
  RtlCreateUserThread: TFNRtlCreateUserThread;
  nextRtlCreateUserThread: TFNRtlCreateUserThread;

procedure myRtlCreateUserThread(ProcessHandle: THANDLE;
   SecurityDescriptor: PSECURITY_DESCRIPTOR;
   CreateSuspended: Boolean;
   StackZeroBits: ULONG;
   StackReserved: PULONG;
   StackCommit: PULONG;
   StartAddress: Pointer;
   StartParameter: Pointer;
   ThreadHandle: PHANDLE;
   ClientID: Pointer); stdcall;
begin
  StartAddress := Pointer(dword(StartAddress)-dword(HNtDll2)+dword(HNtDll));
  nextRtlCreateUSerThread(ProcessHandle, SecurityDescriptor,
    CreateSuspended,StackZeroBits, StackReserved, StackCommit,
    StartAddress, StartParameter, ThreadHandle ,ClientID);
end;

function LoadRtlQueryDebug: LongBool;
begin
  if HNtDll = 0 then
  begin
    HNtDll := LoadLibrary(ntdll);
    HNtDll2 := uallProtect.ForceLoadLibraryNt(ntdll);
    if HNtDll <> 0 then
    begin
      RtlCreateQueryDebugBuffer      := GetProcAddress(HNtDll2, 'RtlCreateQueryDebugBuffer');
      RtlQueryProcessDebugInformation := GetProcAddress(HNtDll2,
        'RtlQueryProcessDebugInformation');
      RtlDestroyQueryDebugBuffer     := GetProcAddress(HNtDll2,
        'RtlDestroyQueryDebugBuffer');
      RtlCreateUserThread := GetProcAddress(HNtDll2,'RtlCreateUserThread');
      uallHook.HookCode(@RtlCreateUserThread,@myRtlCreateUserThread, @nextRtlCreateUserThread);
    end;
  end;
  Result := Assigned(RtlCreateQueryDebugBuffer) and
    Assigned(RtlQueryProcessDebugInformation) and
    Assigned(RtlQueryProcessDebugInformation);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  DbgBuffer: PDebugBuffer;
  Loop: Integer;
begin
  if not LoadRtlQueryDebug then Exit;

  Memo1.Clear;
  Memo1.Lines.BeginUpdate;
  DbgBuffer := RtlCreateQueryDebugBuffer(0, False);
  if Assigned(DbgBuffer) then
    try
      if RtlQueryProcessDebugInformation(StrToIntDef(Edit1.Text, GetCurrentProcessId),
        PDI_MODULES, DbgBuffer^) >= 0 then
      begin
        for Loop := 0 to DbgBuffer.ModuleInformation.Count - 1 do
          with DbgBuffer.ModuleInformation.Modules[Loop], Memo1.Lines do
          begin
            Add('ImageName: ' + ImageName);
            Add(' Reserved0: ' + IntToHex(Reserved[0], 8));
            Add(' Reserved1: ' + IntToHex(Reserved[1], 8));
            Add(' Base: ' + IntToHex(Base, 8));
            Add(' Size: ' + IntToHex(Size, 8));
            Add(' Flags: ' + IntToHex(Flags, 8));
            Add(' Index: ' + IntToHex(Index, 4));
            Add(' Unknown: ' + IntToHex(Unknown, 4));
            Add(' LoadCount: ' + IntToHex(LoadCount, 4));
            Add(' ModuleNameOffset: ' + IntToHex(ModuleNameOffset, 4));
          end;
      end;
    finally
      RtlDestroyQueryDebugBuffer(DbgBuffer);
    end;
  Memo1.Lines.EndUpdate;

end;

end.
der code is ausm swissdelphicenter und von NicoDe

Arnulf 30. Aug 2005 19:05

Re: CreateToolHelp32SnapShot hooks umgehen
 
Der code scheint zu funktionieren.
Keine Ahnung warum es bei mir nicht ging ( was du vorher einmal gepostet hast ) aber ich werde es mir genauer anschauen.

Übrigens ist das vielleicht gleich etwas für deine uall.Protect.
Das würde ich ProtectCall nennen oder so ähnlich.
Also ProtectCall(xxx.dll, funcname)...

Was mir gleich mal aufgefallen ist, daß strtointdef hier nicht so viel sinn zu haben schein, bei mir stürtzt er nämlich ab, wenn ich versuche das mit dem eigenen prozess zu machen.

noch eine verständnisfrage.
Warum ladest du vorher nochmal ntdll.dll mit loadlibrary?
Delphi-Quellcode:
   HNtDll := LoadLibrary(ntdll);
    HNtDll2 := uallProtect.ForceLoadLibraryNt(ntdll);
soweit ich deine ForceLoadLibraryNt kenne machst du das in der function eh nochmal mit hook eben!

Arnulf

brechi 30. Aug 2005 19:12

Re: CreateToolHelp32SnapShot hooks umgehen
 
aso ne klar hab ich von NicoDe's code ncoh dringeladden, nen getmoduelhandle würde reichen um nacher die richtige adresse im Hook von CreateThread zu berechnen


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 Uhr.
Seite 4 von 6   « Erste     234 56      

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