![]() |
CreateToolHelp32SnapShot hooks umgehen
Hallo
Ich hab schon wieder verrückte ideen :). Da ich inzwischen dank dieses forums viel über Pe header und prozesse gelernt hab, hab ich mir gedacht ich könnte doch versuchen von einem prozess die importtierten module aus der import table auslesen. Jetzt brauch ich ja nur den header der .exe und deshalb dachte ich es reicht die ersten 1000 bytes einzulesen und mir dann die module auflisten lassen.
Delphi-Quellcode:
Natürlich gehts so nicht :) - falsch ist sicherlich schon mal
buffer := VirtualAlloc(nil,$1000,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
Read := OpenProcess(PROCESS_ALL_ACCESS,false,Pid); ReadProcessMemory(Read,pointer(0),buffer,$1000,read); CheckImports(buffer);
Delphi-Quellcode:
allerdings weiß ich auch nicht wo im prozess ich anfangen soll zu lesen - wo beginnt der eigentlich?
pointer(0)
Arnulf |
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
ps: Was hat das Thema mit der Frage zu tun? pps: das Modul-Handle (= Basisadresse) des "Images mit dem der Prozess erzeugt wurde" ist immer das erste (CreateToolHelpSnapshot) |
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
also erste den dosheader ---> read process am offset und dann ntheader einlesen?
Delphi-Quellcode:
Naja - wenn die apis gehookt werden um prozesse zu verstecken, dachte ich mir einfach ich les den prozess ein und schau auf die import tabelle des prozesses, um ohne der api funktionen die module auszulesen die der prozess verwendet.
Was hat das Thema mit der Frage zu tun?
Das war ja nur eine idee wie man eben diese hooks umgehen kann (Module32First/module32next).
Delphi-Quellcode:
naja dann komm ich aber um die apis nicht herum.
ist immer das erste (CreateToolHelpSnapshot)
Und genau darum geht es ja eigentlicht. Edit: ich glaub die funktion heißt eigentlich NtQuerySystemInformation - die gehookt wird - vielleicht sollte ich den titel des threads ändern - bin mir aber nicht sicher. Arnulf |
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
Zitat:
Zitat:
|
Re: CreateToolHelp32SnapShot hooks umgehen
Nagut wieder eine auf die Nase bekommen :)
Ich dachte echt es gäbe eine Möglichkeit, process hider die auf api hooks basieren zu umgehen. Damit bleibt mir wieder nichts anderes als mich damit zu beschäftigen hooks zu entdecken. Danke jedenfalls Arnulf |
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
|
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
Aber Achtung: nur weil ich dir einen K-Mode-Treiber ans Herz lege, heißt das nicht, daß man nciht auch im K-Mode bereits vor anderen Treibern die Prozesse verstecken könnte. Da gibt es auch eine Seite www dot rootkit dot com, wo du mehr Informationen zu diesem Thema bekommst (also zB Programme welche Rootkits austricksen und wieder neue Rootkits die eben jene Programme austricksen und so weiter und so weiter ... :mrgreen: |
Re: CreateToolHelp32SnapShot hooks umgehen
Als wenn ich nichts dafür hätte ;)
Delphi-Quellcode:
mit ForceLoadLibraryNtA('ntdll.dll') kannste die ntdl ein 2. mal laden und dann davon GetProcaddress(x,'NtQuerySystenbob') machen und die funtkion dann benutzen, die ist dann garantiert nicht gehookt :)
var oldRtlEqualUnicodeString: function(a,b: pointer; c: boolean): boolean; stdcall;
nextRtlEqualUnicodeString: function(a,b: pointer; c: boolean): boolean; stdcall; forcename: string; function myRtlEqualUnicodeString(a,b: pointer; c: boolean): boolean; stdcall; begin if pos(forcename,uppercase(pwidechar(pointer(cardinal(b)+4)^))) > 0 then result := false else result := nextRtlEqualUnicodeString(a,b,c); end; function ForceLoadLibraryNtA(dllname: pchar): cardinal; stdcall; begin @oldRtlEqualUnicodeString := GetProcAddress(GetModuleHandle('ntdll.dll'),'RtlEqualUnicodeString'); if (@oldRtlEqualUnicodeString <> nil) then begin uallTableHook.HookAPIJMP(@oldRtlEqualUnicodeString,@myRtlEqualUnicodeString,@nextRtlEqualUnicodeString); forcename := uppercase(dllname); result := LoadLibraryA(dllname); uallTableHook.UnhookAPIJMP(@nextRtlEqualUnicodeString); end else Result := LoadLibraryA(dllname); end; |
Re: CreateToolHelp32SnapShot hooks umgehen
Man mit euch geht echt die post ab :)
Da will ich nur nen simplen anticheat für mein lieblingsspiel schreiben, und ich lande in den untiefen der windows system programmierung. Hab mir gerade die native api's runtegeladen, aber hab keine Beschreibung gefunden wie die dann verwendet werden. Sachen gibts.... Und Brechi der alte hacker hat sowieso wieder was lol. Aber um nicht nur zu quatschen eine kleine verständniss frage? Die Apis müssen immer im prozess gehookt werden der die verwendet (klar) also global im system um eben ein modul zu verstecken. Wenn jetzt ein hook für das verstecken von prozessen gemacht wird, dann kann ich ja uall.protect.ishook in meinem eigenen prozess verwenden. Oder Brechis vorschlag einfach die ntdll.dll nachladen (lol gute idee). Oder eben die Native apis - wenn ich dazu eine beschreibung finde, die find ich ja sehr interessant. All diese methoden sollten bei einfachen process hide programmen die auf NtQuerySystemInformation basieren funktionieren wenn ich die in mein eigenes programm einbau, weil die ntdll.dll in meinem programm gehookt werden muß wenn ich von einem anderen prozess die module auflisten will? hoff ich :) Arnulf Edit: Eigentlich eine dumme frage, aber ich bin mir immer noch so unsicher bei dem ganzen thema und ich hab mich schon so oft geirrt :) |
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
|
Re: CreateToolHelp32SnapShot hooks umgehen
stimmt natürlich die deklarationen hab ich.
Ist aber langwierig sich da durchzusuchen - trotzdem werd ich mir mal ein paar anschauen - klingt sehr interessant :) Arnulf Edit: Ich wollte gerade Brechis methode ausprobieren ( die mir am schnellsten und einfachsten erschien). Aber ich glaub uallTableHook.HookAPIJMP ist in der collection die ich hab nicht drin. Ist das eine neue version? |
Re: CreateToolHelp32SnapShot hooks umgehen
nimm den normalen hook damit sollte das auch gehen,
uallTableHook sollte aber vorhanden sein (in der neusten version, kann sein das ich die Funktion nur anders benannt habe) leider ist die page im moment down, aber der normale uallHook sollte auch funzen |
Re: CreateToolHelp32SnapShot hooks umgehen
hm .. ich denk mal ich warte bis deine seite wieder on ist.
Ich dürfte sowieso eine sehr alte version haben. uallhook beinhaltetn nämlich nur: HookCode HookApiIAT HookApiIAT InjectMe InjectLibrary also jeglicher unhook fehlt hier. egal ich wart einfach - hab eh noch genug zu tun :) Arnulf |
Re: CreateToolHelp32SnapShot hooks umgehen
Liste der Anhänge anzeigen (Anzahl: 1)
hier ich kanns mal beilegen, ist alles bischten dumm gelaufen, musste meinen laptop abgeben wo alles neue druf war und jetzt is die seite auch down und ich komm selbst net an die neuesten daten ran :/
aber hier haste wenigstens etwas wo man unhooken kann usw. |
Re: CreateToolHelp32SnapShot hooks umgehen
oh danke dir
ich bin sowieso ab morgen mal eine woche in Hamburg. Ja wir Österreicher machen Urlaub in Hamburg :).... Hast du stress deine seite zu hosten? Ich kann die seite ja bei mir am server spiegeln wennst magst, dann mußt zur not nur die domain umleiten. Wenns nicht zu viel traffic braucht, kann ichs auch hosten. Ich hab nur bemerkt, daß die uall.info öfter mal off ist. Arnulf |
Re: CreateToolHelp32SnapShot hooks umgehen
jep die seite ist bisl länger offline, hab die auch nur geschenkt bekommen nur der serevranbieter hat meinem sponsor gekündigt da die seiten zu viel traffic haben wegen ddos attacken.
die neuste version findest im moment hier: ![]() die seite wird in 1-2 wochen umgestellt |
Re: CreateToolHelp32SnapShot hooks umgehen
Hi again - bin zurück :)
Zitat:
4-5 gigabyte fallen da nicht auf aber mehr .... naja. Jedenfalls hab ich probiert die ntdll.dll mit forceloadlibrary nachzuladen - aber ich bekomm von der funktion nichts zurück. Der hook dürfte funktionieren, zumindestenst springt er in die hook funktion wenn LoadLibraryA aufgerufen wird. Trotzdem bekomm ich keine neue .dll geladen oder von der func nichts zurück. die Source hat sich ja nicht geändert hab die nur abgeschrieben - aber trotzdem nochmal: Der aufruf:
Delphi-Quellcode:
Brechis Source:
nt2dll := ForceLoadLibraryNtA('ntdll.dll');
Delphi-Quellcode:
Naja ich hoffe du weißt warum ich nämlich nicht :).
function myRtlEqualUnicodeString(a,b: pointer; c: boolean): boolean; stdcall;
begin if pos(forcename,uppercase(pwidechar(pointer(cardinal(b)+4)^))) > 0 then result := false else result := nextRtlEqualUnicodeString(a,b,c); end; function ForceLoadLibraryNtA(dllname: pchar): cardinal; stdcall; begin @oldRtlEqualUnicodeString := GetProcAddress(GetModuleHandle('ntdll.dll'),'RtlEqualUnicodeString'); if (@oldRtlEqualUnicodeString <> nil) then begin uallTableHook.HookAPIJMP(@oldRtlEqualUnicodeString,@myRtlEqualUnicodeString,@nextRtlEqualUnicodeString); forcename := uppercase(dllname); result := LoadLibraryA(dllname); uallTableHook.UnhookAPIJMP(@nextRtlEqualUnicodeString); end else Result := LoadLibraryA(dllname); end; Wäre auch super, wenn du eine erklärung für myRtlEqualUnicodeString hättest... weil ich zwar sehe, daß loadlibraryA die funktion verwendet, aber mir nicht klar ist, wie dadurch die .dll neu geladen werden sollte .. Arnulf |
Re: CreateToolHelp32SnapShot hooks umgehen
hi
die ForceLoadLibraryNTa funktion liefert dir normal ein neues dll handle zurück, also hättest du LoadLibraryA aufgerufen, dabei sollte GetModuleHandle('ntdll.dll') <> ForceLoadLibraryNtA('ntdll.dll') sein da die dll halt neu geladen wird an einen anderen adressraum sie gibt auf jedenfall einen handle zurück, wenn nicht funktioniert bekommste GetModuleHandle('ntdll.dll') zurück also kannst du mit GetModuleHandle('ntdll.dll') <> ForceLoadLibraryNtA('ntdll.dll') prüfen ob die funktion funktioniert hat RtlEqualUnicodeString wird intern benutzt um zu prüfen ob eine dll schon geladen ist, d.h. normal würde imemr der alte handle zurückgegeben werden, da ich aber bei einer bestimmten dll (die du laden willst, zb.b. ntdll.dll) dort false zurückgebe, denk windows sie ist noch nicht geladen und lädt sie ein 2. mal |
Re: CreateToolHelp32SnapShot hooks umgehen
Ja so hab ich mir das auch gedacht, aber ich bekomme immer 0 zurück wenn ich das so benutze:
Delphi-Quellcode:
schon das hier liefert 0 zurück:
nt2dll := ForceLoadLibraryNtA('ntdll.dll');
Delphi-Quellcode:
beim hook springt er beim aufruf von loadlibraryA in diese möglichkeit:
result := LoadLibraryA(dllname);
Delphi-Quellcode:
ansonsten danke für die erklärung bei der hook funktion :)
result := nextRtlEqualUnicodeString(a,b,c);
Arnulf Edit: Also ich hab mal geschaut was in b bei myRtlEqualUnicodeString überhaupt drin steht b: Zitat:
also das mit forcename zu vergleichen ergibt scheinbar keinen sinn. Vielleicht fällt dir etwas dazu ein. Arnulf |
Re: CreateToolHelp32SnapShot hooks umgehen
Mit den native apis bin ich auch nicht weiter gekommen, weil ich einfach keine funktion gefunden hab, die mir module auflistet.
system information hab ich gefunden - aber nichts für module in einem prozess.... ich werd mich mal bei rootkit umschauen, schade daß brechi zu seinem code nichts mehr geschreiben hat, das war doch spannend aber hat hald für mich auch nicht funktioniert :) Arnulf |
Re: CreateToolHelp32SnapShot hooks umgehen
:shock:
Wie wäre es mit RtlQueryProcessDebugInformation()? Kleiner Tip: die Toolhelp-API von Windows 2000 aufwärts basiert auf den Native APIs, ergo muß es da was geben. |
Re: CreateToolHelp32SnapShot hooks umgehen
Man - ich bin erschlagen lol.
Wenn man mal anfangen will hinter die normalen windows funktionen zu blicken wird man erschlagen... Jedenfalls hab ich code von nico gefunden ![]() der mit zeigen sollte was du meinst. Naja tut es nicht wirklich lol - muß wohl erstmal damit spielen ums zu begreifen. In den native apis hab ich das gefunden:
Delphi-Quellcode:
Logischerweise sagt mir das nichts, vielleicht hilft mir wirklich das rumspielen mit nicos code :)
function RtlQueryProcessDebugInformation(
ProcessId : ULONG; DebugInfoClassMask : ULONG; DebugBuffer : PDEBUG_BUFFER ): NTSTATUS; stdcall; Arnulf Edit: Ach debugBuffer dürfte wohl das sein was ich suche lol - sachen gibts. Dazu hab ich nur noch eine frage was ist der Handle eines Moduls? Ist das die Base adresse? - also beginnt dort dann der dos header und alle weiteren? Danke Arnulf |
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
Zitat:
Zitat:
|
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
Zitat:
ich dachte wenn ich loadlibrary verwende wird immer der header mitsamt aller funktionen geladen? wo drifte ich denn jetzt wieder ab - jetzt wirds freaky :). Darauf basiert ja mein ganzer check. 1. nachschauen welche module geladen sind. 2. header einlesen und schauen ob opengl32.dll oder bestimmte funktionen importiert werden. so hab ichs bisher gelernt lol.... was kommt jetzt, daß mir meine träume zerstört? Arnulf |
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
|
Re: CreateToolHelp32SnapShot hooks umgehen
@Olli
Was ist hier im zusammenhang mit native api gemeint? Werden hier nicht auch nur die ntdll.dll functionen importiert und dann verwendet. Vielleicht kannst du mir gerade anhand dieses beispiels erklären was bei den native apis eigentlich gemacht wird?.
Delphi-Quellcode:
Also worauf basieren diese native apis?
// Dynamic version of RtlQueryProcessDebugInformation
function RtlQueryProcessDebugInformation( ProcessId : ULONG; DebugInfoClassMask : ULONG; DebugBuffer : PDEBUG_BUFFER ): NTSTATUS; stdcall; begin GetProcedureAddress(_RtlQueryProcessDebugInformation, ntdll, 'RtlQueryProcessDebugInformation'); Result := TFNRtlQueryProcessDebugInformation(_RtlQueryProcessDebugInformation)( ProcessId, DebugInfoClassMask, DebugBuffer ); end; Die Pricedure Adresse von der originalen ntdll verwenden? - wäre wirklich interessant den zusammenhang zu verstehen. Arnulf |
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
Delphi-Quellcode:
Die Ermittlung der Module funktioniert weiterhin problemlos (zum Beispiel mit: tasklist /M /FI "WINDOWTITLE eq foo").
program Project1;
uses Windows; const HelloWorld = 'Hello, World!'; var ModuleHandle: HMODULE; BaseAddress: Pointer absolute ModuleHandle; OldProtect: DWORD; 8begin ModuleHandle := GetModuleHandle(nil); if not VirtualProtect(BaseAddress, (Length(HelloWorld) + 1) * SizeOf(Char), PAGE_READWRITE, OldProtect) then Exit; lstrcpy(BaseAddress, HelloWorld); VirtualProtect(BaseAddress, (Length(HelloWorld) + 1) * SizeOf(Char), OldProtect, OldProtect); MessageBox(HWND(nil), BaseAddress, 'foo', MB_OK or MB_ICONINFORMATION); end. |
Re: CreateToolHelp32SnapShot hooks umgehen
Puh, ich schreibe gerade zusammen mit Marcel van Brakel einen Artikel für TDM über Native APIs, da glaube ich kaum, daß man das in wenigen Sätzen abhandeln kann *g*
Ich versuche es dennoch. Die Native APIs sind erstmal aufgeteilt in einen U-Mode und einen K-Mode-Teil. Der größte Teil der Native APIs im U-Mode wird von der NTDLL.DLL exportiert, im K-Mode ist dies NTOSKRNL.EXE. Diese APIs bilden die Grundlage für alle Subsysteme und werden teilweise auch im DDK dokumentiert - inzwischen teils sogar im PSDK. Sie haben je nach Aufgabengebiet verschiedene Präfixe (Rtl* = Runtime Library). Eine Liste der Native APIs kannst du auf unserer JEDI-Apilib-Seite finden: ![]() Du benutzt sie also bereits, auch wenn du sie nicht so nennst ;) Weitere Quellen zum Thema findest du in unserer ![]() @Nico: Komisch, bei mir gab es Probleme mit den ersten 3 Bytes, danach konnte ich eine Menge überschreiben (im DOS-Header) und dann mußte ich wieder im PE-Header aufpassen. Entweder liegt es an Unterschieden zwischen Delphi und VC, oder da ist was anderes zu beachten ... (ja, die Seitenzugriffsberechtigung habe ich angepaßt gehabt). |
Re: CreateToolHelp32SnapShot hooks umgehen
ihr das mit dem absolute ist ja mal hässlich gelöst ;P
Delphi-Quellcode:
man sollte das schon besser so durch typecasting lösen
program Project1;
uses windows; const HelloWorld = 'Hello, World!'; var ModuleHandle: HMODULE; OldProtect: DWORD; begin ModuleHandle := GetModuleHandle(nil); if not VirtualProtect(pointer(ModuleHandle), (Length(HelloWorld) + 1) * SizeOf(Char), PAGE_READWRITE, OldProtect) then Exit; lstrcpy(pointer(ModuleHandle), HelloWorld); VirtualProtect(pointer(ModuleHandle), (Length(HelloWorld) + 1) * SizeOf(Char), OldProtect, OldProtect); MessageBox(HWND(nil), pointer(ModuleHandle), 'foo', MB_OK or MB_ICONINFORMATION); end. absolut sagt aus das der gleiche sepicher benutzt wird ->
Delphi-Quellcode:
dann zeigen bla und blub auf gleiche adresse
var bla: pointer;
blub: integer absolute bla;
Delphi-Quellcode:
var bla: pointer;
begin integer(bla) //<- würde das selbe sein wie blub end; |
Re: CreateToolHelp32SnapShot hooks umgehen
Zitat:
|
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 00:29 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