Entwickler-Ecke

Windows API - uallHook für RegOpenKeyEx


Chris79 - Fr 30.05.08 17:44
Titel: uallHook für RegOpenKeyEx
Hallo Leute,

ich verwende die uallCollection, um Hooks auf ein paar API-Funktionen zu setzen. Bei einigen Funktionen funktioniert das auch (eigene Testfunktionen, sowie FindFirstFile und FindNextFile). Bei RegOpenKeyEx gibt es allerdings Probleme.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
function myRegOpenKeyEx(hKey: HKEY; lpSubKey: LPCTSTR; ulOptions: DWord; samDesired: REGSAM; phkResult: PHKEY): LongInt;
var
  lCode: LongInt;
  Error: PChar;
begin
  WriteToLog('RegOpenKeyEx called "'+StrPas(lpSubKey)+'"');
  case hKey of
    HKEY_CLASSES_ROOT: WriteToLog('HKEY: HKEY_CLASSES_ROOT');
    HKEY_CURRENT_USER: WriteToLog('HKEY: HKEY_CLASSES_ROOT');
    HKEY_LOCAL_MACHINE: WriteToLog('HKEY: HKEY_CLASSES_ROOT');
    HKEY_USERS: WriteToLog('HKEY: HKEY_CLASSES_ROOT');
    HKEY_PERFORMANCE_DATA: WriteToLog('HKEY: HKEY_CLASSES_ROOT');
    HKEY_CURRENT_CONFIG: WriteToLog('HKEY: HKEY_CLASSES_ROOT');
    HKEY_DYN_DATA: WriteToLog('HKEY: HKEY_CLASSES_ROOT');
  end;
  case samDesired of
    KEY_ALL_ACCESS: WriteToLog('Desired Access: KEY_ALL_ACCESS');
    KEY_CREATE_LINK: WriteToLog('Desired Access: KEY_ALL_ACCESS');
    KEY_CREATE_SUB_KEY: WriteToLog('Desired Access: KEY_ALL_ACCESS');
    KEY_ENUMERATE_SUB_KEYS: WriteToLog('Desired Access: KEY_ALL_ACCESS');
    KEY_EXECUTE: WriteToLog('Desired Access: KEY_ALL_ACCESS');
    KEY_NOTIFY: WriteToLog('Desired Access: KEY_ALL_ACCESS');
    KEY_QUERY_VALUE: WriteToLog('Desired Access: KEY_ALL_ACCESS');
    KEY_SET_VALUE: WriteToLog('Desired Access: KEY_ALL_ACCESS');
    KEY_WOW64_32KEY: WriteToLog('Desired Access: KEY_ALL_ACCESS');
    KEY_WOW64_64KEY: WriteToLog('Desired Access: KEY_ALL_ACCESS');
    KEY_WRITE: WriteToLog('Desired Access: KEY_ALL_ACCESS');
    else WriteToLog('Desired Access : UNKOWN');
  end;
  lCode := nextRegOpenKeyEx(hKey, lpSubKey, ulOptions, samDesired, phkResult);
  if lCode<>ERROR_SUCCESS then
    begin
      FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM, nil, lCode, LANG_USER_DEFAULT, @Error, 0, nil);
      WriteToLog('Error: '+Error);
    end;
  Result := lCode;
end;



Meine Vermutung ist, dass sich der Hook in dem Moment installiert, wenn gerade einige RegOpenKeyEx Funktionsaufrufe erfolgen und es daher zu Problemen kommt. Das Interessante ist, dass die CallBack-Funktion insgesamt drei Mal aufgerufen wird, allerdings immer mit "kaputten" Parametern (leerer lpSubKey z.B.).
Die Funktion nextRegOpenKeyEx arbeitet übrigens korrekt (Ich habe zum Testen mal richtige Parameter übergeben).

Habt Ihr eine Ahnung, was das Problem sein könnte?

Gruß,

Christian

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


uall@ogc - Fr 30.05.08 19:56

function myRegOpenKeyEx(hKey: HKEY; lpSubKey: LPCTSTR; ulOptions: DWord; samDesired: REGSAM; phkResult: PHKEY): LongInt; stdcall;


Chris79 - Mo 02.06.08 09:38

Oh man, da hätt' ich auch selbst drauf kommen können :). Vielen Dank!

Ich hätte da noch eine weitere Frage: Gibt es eine Methode, die dll sicher in einen Prozess einzufügen? Im Moment nutze ich SetWindowsHookEx um die DLL in jeden neuen Prozess injizieren zu lassen. Ich habe da den Eindruck, dass meine DLLMain manchmal zu früh aufgerufen wird und der Prozess abstürzt (eine Pause von 1 Sek. hat schon Verbesserungen gebracht). Daher würde ich gerne wissen, ob man den Hauptthread des Prozesses vielleicht solange anhalten kann oder sonstwie feststellen kann, wann ein günstiger Moment wäre, um die DLLMain aufzurufen.

Gruß,

Christian


UGrohne - Mo 02.06.08 10:41

user profile iconChris79 hat folgendes geschrieben:
Ich hätte da noch eine weitere Frage: ...

Neue Frage, neuer Thread, daher:

*** CLOSED ***