перехват zwqueryvaluekey

Тема в разделе "WASM.WIN32", создана пользователем realcoder, 18 мар 2012.

  1. realcoder

    realcoder New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2012
    Сообщения:
    4
    сплайсю сабж:
    Код (Text):
    1. library libr32;
    2.  
    3.  
    4. uses
    5.   Windows,
    6.   winsock,sysutils;
    7.  
    8. type
    9. ntstatus=cardinal;
    10.   unicode_string=packed record
    11.   Length:WORD;
    12.   MaximumLength:WORD;
    13.   Buffer:PWideChar;
    14.   end;
    15.     PUNICODE_STRING=^unicode_string;
    16.  
    17.    _KEY_VALUE_BASIC_INFORMATION=packed record
    18.   TitleIndex:dword;
    19.   _Type:dword;
    20.   NameLength:dword;
    21.   Name:array[0..0] of widechar;
    22.   end;
    23.  PKEY_VALUE_BASIC_INFORMATION=^_KEY_VALUE_BASIC_INFORMATION;
    24.  
    25. tramp_=function (KeyHandle:THANDLE;ValueName:PUNICODE_STRING; KeyValueInformationClass:DWORD; KeyValueInformation:Pointer;Length:DWORD;ResultLength:pointer):ntstatus;stdcall;
    26.  
    27.  OldCode = packed record
    28.   two: byte;
    29.   One: dword;
    30.  end;
    31.  
    32. far_jmp = packed record
    33.   jmpOp: byte;
    34.   jmpoffset: pointer;
    35.  
    36.  end;
    37.  
    38. var
    39. JmpMba: far_jmp;
    40.  OldMba: OldCode;
    41.  MbaAdr: pointer;
    42. tramp_pr: tramp_;
    43.  
    44.  
    45. Procedure Unhook();
    46. var
    47.  Bytes: dword;
    48. begin
    49.   WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes);
    50. end;
    51.  
    52.  
    53. function ZwQueryKey(KeyHandle:thandle;KeyInformationClass:dword;KeyInformation:pointer;Length:dword; ResultLength:pointer):ntstatus;stdcall; external 'ntdll.dll' name 'ZwQueryKey';
    54. function newquery(KeyHandle:THANDLE;ValueName:PUNICODE_STRING; KeyValueInformationClass:DWORD; KeyValueInformation:Pointer;Length:DWORD;ResultLength:pointer):ntstatus;stdcall;
    55. var  kinfo:_KEY_VALUE_BASIC_INFORMATION;
    56. len:dword;
    57. begin
    58. unhook;
    59. messagebox(0,pchar(inttohex(ZwQueryKey(keyhandle,0,@kinfo,sizeof(_KEY_VALUE_BASIC_INFORMATION),@len),8)),nil,0);
    60. messageboxw(0,pwidechar(addr(kinfo.Name)),valuename^.buffer,0);
    61. Result := tramp_pr(keyhandle,valuename,keyvalueinformationclass,KeyValueInformation,length,resultlength);
    62. end;
    63.  
    64.  
    65.  
    66.  
    67. Procedure SetFFHook();
    68. var
    69.  hUser32: dword;
    70.  Bytes: dword;
    71.  
    72. begin
    73.   hUser32 := GetModuleHandle('ntdll.dll');
    74.   if hUser32<=0 then exit;
    75.   MbaAdr  := GetProcAddress(hUser32, 'ZwQueryValueKey');
    76.   if DWORD(MbaAdr)<=0 then exit;
    77.   ReadProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes);
    78.   WriteProcessMemory(invalid_handle_value,@tramp_pr,@oldmba,sizeof(oldcode),bytes)
    79.   JmpMba.jmpOp  := $E9;
    80.   JmpMba.jmpoffset := pointer(dword(mbaadr)- dword(@tramp_pr)-5);
    81.   WriteProcessMemory(INVALID_HANDLE_VALUE, pointer(Dword(@tramp_pr)+sizeof(oldcode)), @JmpMba, SizeOf(far_jmp), Bytes);
    82.   jmpmba.jmpOp:=$E9;
    83.   jmpmba.jmpoffset:=pointer(Dword(@newquery)-dword(mbaadr)-5);
    84.   WriteProcessMemory(invalid_handle_value,mbaadr,@jmpmba,sizeof(far_jmp),bytes);
    85.  
    86.  
    87. end;
    88.  
    89.  
    90.  
    91. Function MessageProc(code : integer; wParam : word;
    92.                     lParam : longint) : longint; stdcall;
    93. begin
    94.  CallNextHookEx(0, Code, wParam, lparam);
    95.  Result := 0;
    96. end;
    97.  
    98. Procedure SetGlobalHookProc();
    99. begin
    100.  SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
    101.  Sleep(INFINITE);
    102. end;
    103. //
    104.  
    105. Procedure SetGlobalHook();
    106. var
    107.  hMutex: dword;
    108.  TrId: dword;
    109. begin
    110.  hMutex := CreateMutex(nil, false, 'AdvareHook');
    111.  if GetLastError = 0 then
    112.  CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else
    113.  CloseHandle(hMutex);
    114. end;
    115.  
    116.  
    117. procedure DLLEntryPoint(dwReason: DWord);
    118. begin
    119.   case dwReason of
    120.     DLL_PROCESS_ATTACH: begin
    121.                           SetGlobalHook();
    122.                           Randomize();
    123.                           @tramp_pr:=VirtualAlloc(nil,20,MEM_COMMIT or MEM_RESERVE or MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE);
    124.                           SetFFHook()
    125.                         end;
    126.     DLL_PROCESS_DETACH:
    127.     begin
    128.      UnHook();
    129.      end;
    130.   end;
    131. end;
    132.  
    133.  
    134. begin
    135.  DllProc := @DLLEntryPoint;
    136.  DLLEntryPoint(DLL_PROCESS_ATTACH);
    137. end.
    проблема в том что zwquerykey, которая используется чтоб определить раздел возвращает STATUS_DATATYPE_MISALIGNMENT.
    вроде все правильно объявил. valuename выводитсья как надо, а имя ключа кракозябрами
    что ихменить здесь?пробовал вместо Name:array[0..0] of widechar pwidechar писать - не помогло. или может внутренее выравнивание включить(убрать packed) ?
     
  2. realcoder

    realcoder New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2012
    Сообщения:
    4
    вот, так вроде работает, но только часть имени раздела показывает(первых букв нету):
    Код (Text):
    1. library libr32;
    2.  
    3.  
    4. uses
    5.   Windows,
    6.   winsock,sysutils;
    7.  
    8. type
    9. ntstatus=cardinal;
    10.   unicode_string=packed record
    11.   Length:WORD;
    12.   MaximumLength:WORD;
    13.   Buffer:PWideChar;
    14.   end;
    15.     PUNICODE_STRING=^unicode_string;
    16.             _LARGE_INTEGER = record
    17.     case Integer of
    18.     0: (
    19.       LowPart: DWORD;
    20.       HighPart: Longint);
    21.     1: (
    22.       QuadPart: LONGLONG);
    23.   end;
    24.   LARGE_INTEGER = _LARGE_INTEGER;
    25.    _KEY_VALUE_BASIC_INFORMATION=record
    26.   LastWriteTime:LARGE_INTEGER;
    27.   TitleIndex:dword;
    28.   _Type:dword;
    29.   NameLength:dword;
    30.   Name:array[0..4*1024] of Widechar;
    31.   end;
    32.  
    33.  
    34.  
    35.  PKEY_VALUE_BASIC_INFORMATION=^_KEY_VALUE_BASIC_INFORMATION;
    36.  
    37. tramp_=function (KeyHandle:THANDLE;ValueName:PUNICODE_STRING; KeyValueInformationClass:DWORD; KeyValueInformation:Pointer;Length:DWORD;ResultLength:pointer):ntstatus;stdcall;
    38.  
    39.  OldCode = packed record
    40.   two: byte;
    41.   One: dword;
    42.  end;
    43.  
    44. far_jmp = packed record
    45.   jmpOp: byte;
    46.   jmpoffset: pointer;
    47.  
    48.  end;
    49.  
    50. var
    51. JmpMba: far_jmp;
    52.  OldMba: OldCode;
    53.  MbaAdr: pointer;
    54. tramp_pr: tramp_;
    55.  
    56.  
    57. Procedure Unhook();
    58. var
    59.  Bytes: dword;
    60. begin
    61.   WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes);
    62. end;
    63.  
    64.  
    65. function ZwQueryKey(KeyHandle:thandle;KeyInformationClass:dword;KeyInformation:pointer;Length:dword; ResultLength:pointer):ntstatus;stdcall; external 'ntdll.dll' name 'ZwQueryKey';
    66. function newquery(KeyHandle:THANDLE;ValueName:PUNICODE_STRING; KeyValueInformationClass:DWORD; KeyValueInformation:Pointer;Length:DWORD;ResultLength:pointer):ntstatus;stdcall;
    67. var  kinfo:_KEY_VALUE_BASIC_INFORMATION;
    68. len:dword;
    69. begin
    70. unhook;
    71. ZwQueryKey(keyhandle,0,@kinfo,sizeof(_KEY_VALUE_BASIC_INFORMATION),@len);
    72. messageboxw(0,kinfo.Name,valuename^.buffer,0);
    73. Result := tramp_pr(keyhandle,valuename,keyvalueinformationclass,KeyValueInformation,length,resultlength);  //äåðãàåì ôóíêöèþ ÷åðåç òðàìïëèí
    74. end;
    75.  
    76.  
    77.  
    78.  
    79. Procedure SetFFHook();
    80. var
    81.  hUser32: dword;
    82.  Bytes: dword;
    83.  
    84. begin
    85.   hUser32 := GetModuleHandle('ntdll.dll');
    86.   if hUser32<=0 then exit;
    87.   MbaAdr  := GetProcAddress(hUser32, 'ZwQueryValueKey');
    88.   if DWORD(MbaAdr)<=0 then exit;
    89.   ReadProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes);//â àïè ôóíêöèÿõ ñïåöèàëüíî îñòàâèëè 5 áàéò äëÿ ñïëàéñèíãà,ïîýòîìó äèçàñåìáëåð äëèí íå íóæåí
    90.   WriteProcessMemory(invalid_handle_value,@tramp_pr,@oldmba,sizeof(oldcode),bytes);//â òðàìïëèí
    91.   JmpMba.jmpOp  := $E9;
    92.   JmpMba.jmpoffset := pointer(dword(mbaadr)- dword(@tramp_pr)-5);//ñìåíùåíèå äëÿ ïðûæêà
    93.   WriteProcessMemory(INVALID_HANDLE_VALUE, pointer(Dword(@tramp_pr)+sizeof(oldcode)), @JmpMba, SizeOf(far_jmp), Bytes);
    94.   jmpmba.jmpOp:=$E9;
    95.   jmpmba.jmpoffset:=pointer(Dword(@newquery)-dword(mbaadr)-5);
    96.   WriteProcessMemory(invalid_handle_value,mbaadr,@jmpmba,sizeof(far_jmp),bytes);
    97.  
    98.  
    99. end;
    100.  
    101.  
    102. // çàëåïà
    103. Function MessageProc(code : integer; wParam : word;
    104.                     lParam : longint) : longint; stdcall;
    105. begin
    106.  CallNextHookEx(0, Code, wParam, lparam);
    107.  Result := 0;
    108. end;
    109.  
    110. Procedure SetGlobalHookProc();
    111. begin
    112.  SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
    113.  Sleep(INFINITE);
    114. end;
    115. //
    116.  
    117. Procedure SetGlobalHook();
    118. var
    119.  hMutex: dword;
    120.  TrId: dword;
    121. begin
    122.  hMutex := CreateMutex(nil, false, 'AdvareHook');
    123.  if GetLastError = 0 then
    124.  CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else
    125.  CloseHandle(hMutex);
    126. end;
    127.  
    128.  
    129. procedure DLLEntryPoint(dwReason: DWord);
    130. begin
    131.   case dwReason of
    132.     DLL_PROCESS_ATTACH: begin
    133.                           SetGlobalHook();
    134.                           Randomize();
    135.                           @tramp_pr:=VirtualAlloc(nil,20,MEM_COMMIT or MEM_RESERVE or MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE);
    136.                           SetFFHook()
    137.                         end;
    138.     DLL_PROCESS_DETACH:
    139.     begin
    140.      UnHook();
    141.      end;
    142.   end;
    143. end;
    144.  
    145.  
    146. begin
    147.  DllProc := @DLLEntryPoint;
    148.  DLLEntryPoint(DLL_PROCESS_ATTACH);
    149. end.
     
  3. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Выровнить данные, оминь.