AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi CreateToolHelp32SnapShot hooks umgehen
Thema durchsuchen
Ansicht
Themen-Optionen

CreateToolHelp32SnapShot hooks umgehen

Ein Thema von Arnulf · begonnen am 25. Jul 2005 · letzter Beitrag vom 30. Mär 2007
Antwort Antwort
Seite 4 von 6   « Erste     234 56      
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#31

Re: CreateToolHelp32SnapShot hooks umgehen

  Alt 8. Aug 2005, 18:20
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.

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

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

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
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#32

Re: CreateToolHelp32SnapShot hooks umgehen

  Alt 8. Aug 2005, 20:46
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
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#33

Re: CreateToolHelp32SnapShot hooks umgehen

  Alt 30. Aug 2005, 10:21
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
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#34

Re: CreateToolHelp32SnapShot hooks umgehen

  Alt 30. Aug 2005, 10:30
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 ... Indeces in eine Handletabelle, ja, aber Zeiger ...

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
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#35

Re: CreateToolHelp32SnapShot hooks umgehen

  Alt 30. Aug 2005, 11:03
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
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#36

Re: CreateToolHelp32SnapShot hooks umgehen

  Alt 30. Aug 2005, 12:04
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 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 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.
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#37

Re: CreateToolHelp32SnapShot hooks umgehen

  Alt 30. Aug 2005, 12:52
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
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#38

Re: CreateToolHelp32SnapShot hooks umgehen

  Alt 30. Aug 2005, 14:11
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
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#39

Re: CreateToolHelp32SnapShot hooks umgehen

  Alt 30. Aug 2005, 19:05
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
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#40

Re: CreateToolHelp32SnapShot hooks umgehen

  Alt 30. Aug 2005, 19:12
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


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 15:28 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