![]() |
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:
dann weiß man nichst sofort das es eventl eine "absolute" variable handelt
a := 1234;
sollte z.b.
Delphi-Quellcode:
benutzt werden
var bla: byte;
blub: array [0..1221] of integer absolute bla; durch die zuweisung
Delphi-Quellcode:
crashed es eventl. und man erkennt nicht sofort das es sich hierbei einfach um ein
blub[1221] := 12345678
Delphi-Quellcode:
handelt (auch wenn das ausgeschrieben mehr arbeit ist)
pinteger(integer(@bla)+4*1221)^ := 12345678
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 |
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
|
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 |
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
Zitat:
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 ;) |
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
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:
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 |
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
Zitat:
2. sind die DLLs nicht darauf ausgelegt, auch wenn sie meist dennoch eine Relokationstabelle enthalten. Zitat:
|
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
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:
Es wird nie ein ende nehmen und irgendwann kommt dann .net wo soll das nur hinführen.... Arnulf |
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:
der code is ausm swissdelphicenter und von NicoDe
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. |
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:
soweit ich deine ForceLoadLibraryNt kenne machst du das in der function eh nochmal mit hook eben!
HNtDll := LoadLibrary(ntdll);
HNtDll2 := uallProtect.ForceLoadLibraryNt(ntdll); Arnulf |
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. |
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