NtQueryVirtualMemoryHook-Keine Calls möglich

03/17/2010 19:13 MrSm!th#1
Hallo liebe Mitcoder,

Falls ihr sehr wenig bis 0 Ahnung vom Hooken und/oder der Native Api habt, könnt ihr den Thread wieder verlassen (gut, ihr könnt natürlich aus reinem Interesse mitlesen, aber ihr werdet dann dabei sicher nicht so viel lernen...).
An die anderen, die Ahnung haben und nun noch weiterlesen, habe ich eine Fragestellung zu einem ziemlich verwirrendem Problem:

Aus mir unbekannten Gründen verspürte ich Lust, meine Hooks, die meist eh nicht detected werden, wirklich fast vollständig (Usermode) undetected zu machen.
Da wohl ziemlich häufig die Funktion NtQueryVirtualMemory zur Hookdetection genutzt wird, habe ich es mal damit probiert (und hier wurde das auch geraten [Only registered and activated users can see links. Click Here To Register...]).
Wie dem auch sei, ich habe es schonmal geschafft, nicht vorhandene Hooks damit detected zu machen :awesome: (Scheinbar werden von XTrap doch OS Funktionen geprüft, allerdings nicht alle und ich hatte bis vor kurzem nur nicht-geprüfte gehookt. Nunja, da ich aber NtQueryVirtualMemory einfach failen ließ, um es mal zu testen, wurden auch gar nicht gehookte Funktionen als Hooks erkannt^^)
Problem ist, um ernsthaft Hookdetection zu vermeiden, muss ich auch die Originalfunktion aufrufen (in meinem wirren Gedankengang...wenn jemand davon Ahnung hat und weiß, wie es ohne sie aufzurufen möglich ist, gültige Werte zu returnen, die zu keinem Crash führen und die auch so sind, als wäre nichts gehookt, kann er mich eines Besseren belehren).
Das funktioniert aber nicht, innerhalb von NtQueryVirtualMemory kann ich weder callen noch jumpen.
Wenn ich sie hooke und eine simple MessageBox ausgeben will -> Crash
Wenn ich einfach die originale Version aufrufen will -> Crash
Wenn ich nichts mache, als 1 zurückzugeben -> Kein Crash, aber XTrap nörgelt rum...

Dieses Problem tritt bei mir nur bei dieser Funktion auf, überall anders geht es.
Habe schon im Debugger durchgesteppt (erstmal mit ner anderen Nt Funktion, die auch defintiv gecalled wird, damit ich mal sehen kann, was genau passiert, aber damit gabs ja keine Probleme...fürs Testen von NtQueryVirtualMemory müsste ich mir erstmal eine Testapp schreiben...) und nichts auffälliges bei anderen Nt Funktionen mit dem Verfahren gefunden.
Der Aufbau in der Ntdll ist eigentlich der gleiche, wie bei den anderen Funktionen!
Also woran kann das liegen, dass ich nichts innerhalb des Hooks callen kann (oder zu ner anderen Funktion jumpen)?

Wäre schön, wenn mir jemand helfen könnte, Danke im Voraus ;)
03/17/2010 21:40 12354#2
was gibts denn für n fehler?

EDIT:
Probier mal die Register mit pushad & popad zu sichern, vlcht liegts dadran
03/17/2010 21:55 MrSm!th#3
es crasht einfach
und ich kann leider nicht runtime debuggen wegen themida

ich probiers mal

edit:
nö geht nicht.
hätt mich auch gewundert...
naja ich denk mal, ich komm um die testapp, ums debuggen zu können nicht rum
03/19/2010 00:35 flo8464#4
Womit hookst du? Detours?
03/19/2010 15:16 MrSm!th#5
jo
03/20/2010 08:35 rEdoX#6
Funktioniert der Hook jetzt in deiner "Testapp" oder crasht es? Wenn er da auch crasht liegt es an deinem hook, wenn nein warscheinlich an Themida (bringt auch API Protections mit).

Quote:
Das funktioniert aber nicht, innerhalb von NtQueryVirtualMemory kann ich weder callen noch jumpen.
Wenn ich sie hooke und eine simple MessageBox ausgeben will -> Crash
Wenn ich einfach die originale Version aufrufen will -> Crash
Wenn ich nichts mache, als 1 zurückzugeben -> Kein Crash, aber XTrap nörgelt rum...
Deutete aber eher auf einen Fehler in deinem Hook hin.


Quote:
Problem ist, um ernsthaft Hookdetection zu vermeiden, muss ich auch die Originalfunktion aufrufen (in meinem wirren Gedankengang...wenn jemand davon Ahnung hat und weiß, wie es ohne sie aufzurufen möglich ist, gültige Werte zu returnen, die zu keinem Crash führen und die auch so sind, als wäre nichts gehookt, kann er mich eines Besseren belehren).
Du musst die original Funktion aufrufen (du kannst auch versuchen das Page Directory und die Page Tables selber zu parsen :P), steht aber auch in dem Link den du gepostete hast unter "8. Speicher".
03/20/2010 09:52 MrSm!th#7
Ok, danke für die Hilfreiche Antwort.
Für die Testapp hatte ich noch keine Zeit, das mache ich heute oder morgen.
Ich glaube aber nicht wirklich, dass es am Hook liegt, denn wenn ich die Funktion einfach nur nichts tun lasse, außer 1 zurückzugeben, kommt kein Crash.
Da könnte man ja meinen, es liegt am Trampolin, aber auch wenn ich was ganz anderes, wie zb. MessageBox calllen will, crashts, genau wie bei eine Jmp.
Wenn ich allerdings in die Hookfunktion ein bisschen sinnloses inline asm schreibe und darin gibts ein paar Jumps, funktionierts wieder, nur nicht, wenn ich zu irgendeiner anderen Api Funktion springen will.
Könnte es evtl. an den Callingconventions liegen?
03/20/2010 11:00 flo8464#8
Du musst übrigens fast nen Treiber schreiben, um das sicher zu machen.
Es gibt geschätzt hundert Möglichkeiten, die DLL neu zu laden und zu mappen, da reicht ein LoadLibrary()-Hook nicht aus. ;)
03/25/2010 14:11 MrSm!th#9
Quote:
Originally Posted by flo8464 View Post
Du musst übrigens fast nen Treiber schreiben, um das sicher zu machen.
Es gibt geschätzt hundert Möglichkeiten, die DLL neu zu laden und zu mappen, da reicht ein LoadLibrary()-Hook nicht aus. ;)
Ne für mich ist ein Treiber dank 64bit eher unnötig.
Ich will gar nicht LoadLibrary hooken, da die Dllinjection nicht detected wird, es werden nur ein paar Funktionen überprüft, wie zb. EnumProcesses ;)

Btw. ich glaube ich habe den Fehler, ich werde es direkt jetzt gleich mal testen.
Ich hatte NtQueryVirtualMemory ja als NTAPI deklariert und auch, wenn das eigentlich richtig ist, als ich das gestern auch so mit NtQueryInformationProcess machte, welche ja auch die Callingconvention NTAPI hat, crashte es ebenfalls.
Mit WINAPI ging es bei NtQueryInformationProcess seltsamerweise...ich werds wohl auch mal mit NtQueryVirtualMemory testen
03/25/2010 14:24 flo8464#10
Quote:
Originally Posted by MrSm!th View Post
Ne für mich ist ein Treiber dank 64bit eher unnötig.
Ich will gar nicht LoadLibrary hooken, da die Dllinjection nicht detected wird, es werden nur ein paar Funktionen überprüft, wie zb. EnumProcesses ;)
Naja, ich meinte eher dass man einfach NTQVM neu laden kann und dein Hook ist für die Katz. ;)
03/25/2010 14:39 MrSm!th#11
Quote:
Originally Posted by flo8464 View Post
Naja, ich meinte eher dass man einfach NTQVM neu laden kann und dein Hook ist für die Katz. ;)
Jo aber hier gehts um XTrap ;D
Meine erste Methode, CE undetected zu machen, war einfach OpenProcess failen zu lassen. Was haben sie geändert? Sie nutzten NtOpenProcess :rolleyes:
03/25/2010 14:52 flo8464#12
Quote:
Originally Posted by MrSm!th View Post
Jo aber hier gehts um XTrap ;D
Meine erste Methode, CE undetected zu machen, war einfach OpenProcess failen zu lassen. Was haben sie geändert? Sie nutzten NtOpenProcess :rolleyes:
Naja, wie gesagt, darauf können sie reagieren. ;)
WoW-Warden macht das zb.

Gegen manuelles mappen ist es schwer vorzugehen. Da müsste man theoretisch alle File-APIs hooken.
03/25/2010 17:09 Tyrar#13
schon dran gedacht mit ner proxy dll zu arbeiten?
das könnte vllt was bringen....
ich muss mich auch mit xtrap rumschlagen, wobei ich noch nich soweit bin alles undetected zu machen ;)
03/25/2010 17:55 MrSm!th#14
ach proxy dlls find ich eigentlich sinnlos.
vor allem weil ich mir sicher bin, dass es an den callingconventions
03/25/2010 18:03 Tyrar#15
so viel machen die calling conventions auch nich her (daran lags bei mir bisher noch nie ;))
jedenfalls mit ner proxy dll könnte es klappen! (vorrausgesetzt die werden nich geprüft)