Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.31;
Скачать: CL | DM;

Вниз

Принцип работы CreateToolhelp32Snapshot   Найти похожие ветки 

 
Riply ©   (2008-10-24 13:31) [0]

Здравствуйте !
Пытаюсь понять как работает CreateToolhelp32Snapshot(TH32CS_SNAPMODULE),
сравнивая ее с RtlQueryProcessDebugInformation.
Дело в том, что RtlQuery... на некоторых процессах возвращает STATUS_ACCESS_DENIED.
Вызов же Toolhelp32Snapshot на этих же процессах - успешен.
Пыталась трассировать Toolhelp32 в этих случаях, но ничего "такого",
кроме подготовки и вызова той же RtlQuery.., там не увидела (слабовата я еще в трассировке :( ).
Что же она (Toolhelp32) такое хитрое делает для получения информации ?
Может кто взглянет, что там происходит и поможет "сами мы тут не местным" ? :)
Вот набросала процедуру для этого святого дела :)

function ZwQuerySystemInformationMem(const SysInfoClass: SYSTEM_INFORMATION_CLASS; var pBuffer: PVOID; var BytesPerBuffer: ULONG): NTSTATUS;
var
RetLength: ULONG;
begin
Result := ZwQuerySystemInformation(SysInfoClass, pBuffer, BytesPerBuffer, @RetLength);
while Result = STATUS_INFO_LENGTH_MISMATCH do
 if RetLength > BytesPerBuffer then
  begin
   BytesPerBuffer := RetLength;
   ReallocMem(pBuffer, BytesPerBuffer);
   Result := ZwQuerySystemInformation(SysInfoClass, pBuffer, BytesPerBuffer, @RetLength);
  end
 else Result := STATUS_DBG_IMPOSSIBLE;
end;

const
AVERAGE_PROC_ARR_SIZE = (MAXWORD + 1) shr 1;

function CompareRtlAndToolHelp: NTSTATUS;
var
// ModEntry: MODULEENTRY32W;
pProcessBuffer: PVOID;
BytesPerBuffer: ULONG;
CurrentProcID, hModuleSnap: THANDLE;
pProcInfo: PSYSTEM_PROCESS_INFORMATION;
pDbgBuffer: PRTL_DEBUG_INFORMATION;
begin
BytesPerBuffer := AVERAGE_PROC_ARR_SIZE;
pProcessBuffer := GetMemory(BytesPerBuffer);
if pProcessBuffer <> nil then
 try
  Result := ZwQuerySystemInformationMem(SystemProcessesAndThreadsInformation, pProcessBuffer, BytesPerBuffer);
  if NT_SUCCESS(Result) then
   begin
    pDbgBuffer := RtlCreateQueryDebugBuffer(0, False);
    if pDbgBuffer <> nil then
     try
      pProcInfo := pProcessBuffer;
      CurrentProcID := GetCurrentProcessId;

      while True do
       with pProcInfo^ do
        begin

         if (UniqueProcessId > THANDLE(4)) and (UniqueProcessId <> CurrentProcID) then
          begin
           Result := RtlQueryProcessDebugInformation(UniqueProcessId, PDI_MODULES, pDbgBuffer);
           if Result = STATUS_ACCESS_DENIED then
            begin
             hModuleSnap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, UniqueProcessId);
             if hModuleSnap <> INVALID_HANDLE_VALUE then
              try
//                ModEntry.dwSize := SizeOf(MODULEENTRY32W);
//                if Module32FirstW(hModuleSnap, ModEntry) then
//                 repeat
//                 until not Module32NextW(hModuleSnap, ModEntry);
              finally
               CloseHandle(hModuleSnap);
              end;
            end;
          end;

         if NextEntryOffset > 0
          then pProcInfo := PSYSTEM_PROCESS_INFORMATION(ULONG_PTR(pProcInfo) + NextEntryOffset)
          else Break;
        end;

     finally
      RtlDestroyQueryDebugBuffer(pDbgBuffer);
     end
    else Result := RtlGetLastNtStatus;
   end;
 finally
  FreeMemory(pProcessBuffer);
 end
else Result := STATUS_INSUFFICIENT_RESOURCES;
end;

P.S.
Первое попадание на hModuleSnap := CreateToolhelp32Snapshot лучше пропустить,
чтобы не пришлось проходить по всей инициализации Toolhelp, а начинать смотреть со второго попадания.
P.P.S.
Перед тестом, не забыть дать себе SE_DEBUG_NAME - привилегии.


 
Rouse_ ©   (2008-10-24 15:21) [1]

Вообще в оригинале это выглядит так:
   if(dwFlags & TH32CS_SNAPMODULE)
   {
       if (NT_SUCCESS(Status))    {
           *RawModule = RtlCreateQueryDebugBuffer(0, FALSE);
           if (!*RawModule) {
               Status = STATUS_UNSUCCESSFUL;
           }
       }

       if (NT_SUCCESS(Status)) {
           Status = RtlQueryProcessDebugInformation((HANDLE)LongToHandle(th32ProcessID),
                                                     RTL_QUERY_PROCESS_MODULES,
                                                     *RawModule);
       }
   }

SE_DEBUG_NAME - ты выставила... по идее все должно отработать...


 
Riply ©   (2008-10-24 21:31) [2]

> [1] Rouse_ ©   (24.10.08 15:21)
> SE_DEBUG_NAME - ты выставила... по идее все должно отработать...

Неа. Думала, может дело в многократном использовании одного и того же pDbgBuffer. (чем чет не шутит :)
Переделала как у тебя.
Ничего не изменилось: на некоторых процессах RtlQueryProcessDebugInformation возвращает STATUS_ACCESS_DENIED,
а CreateToolhelp32Snapshot отрабатывает и не пискнув.

Саш, посмотри, пожалуйста, а чему у тебя равна константа RTL_QUERY_PROCESS_MODULES ?


 
Riply ©   (2008-12-02 18:38) [3]

> [0] Riply ©   (24.10.08 13:31)

Если кому интересно...
Проблемма заключалась в битовой маске RTL_QUERY_XXX...
Надо добавить всего один маленький битик :)
Т.е. вместо RTL_QUERY_PROCESS_MODULES надо использовать $80000001;


 
Leonid Troyanovsky ©   (2008-12-02 19:23) [4]


> Riply ©   (02.12.08 18:38) [3]

> Если кому интересно...

Конечно же, нам интересно.
Уважаю, молодец(ица), уж не знаю, как правильно :)

--
Regards, LVT.


 
Rouse_ ©   (2008-12-03 15:49) [5]

Мне тоже интересно, а именно интересно - что означает этот 0x80000000? :)
ЗЫ: ты там что, брутфорсила что-ли? :)))


 
Riply ©   (2008-12-03 16:16) [6]

> [5] Rouse_ © (03.12.08 15:49)
> Мне тоже интересно, а именно интересно - что означает этот 0x80000000? :)
> ЗЫ: ты там что, брутфорсила что-ли? :)))

Саш, к своему стыду, я не знаю, что такое "брутфорсить".
Пояснишь для общего развития ?  :)
Я исходно предполагала наличие некого "контрольного" бита,
исходя из коментариев в TlHelp32.pas и того,
что акромя RtlQueryProcessDebugInformation ничего там не вызывается.
Попытки комбинировать флаги и добавлять бит (логичный с моей точки зрения),
привели  к тому, что я научилась получать BSOD из user-mode тремя различными способами :)
После этого мне помогли с дизассемблированием и в ходе этого выяснилось,
что вызов идет именно с такой маской.

Вот и все, что мне известно :)
Что он означает, я могу только предполагать, исходя из тех же
пояснений в TlHelp32.pas


 
Rouse_ ©   (2008-12-03 16:54) [7]


> Саш, к своему стыду, я не знаю, что такое "брутфорсить".
> Пояснишь для общего развития ?  :)

:)
I: DWORD;
for I := 0 to DWORD(-1) do
 if if (NT_SUCCESS(RtlQueryProcessDebugInformation(th32ProcessID, I, ...



> Попытки комбинировать флаги и добавлять бит (логичный с
> моей точки зрения),
> привели  к тому, что я научилась получать BSOD из user-mode
> тремя различными способами :)

Эт хорошо - если четко воспроизводится и у тебя последние патчи пиши на МС-овский саппорт :) Я тож в свое время дырочку нашел в W2K там IcmpSendEcho с определенным образом выделенным буффером приводила к BSOD :)


 
Riply ©   (2008-12-03 17:39) [8]

> [7] Rouse_ ©   (03.12.08 16:54)
> I: DWORD;
> for I := 0 to DWORD(-1) do

Я конечно использую "метод научного тыка", но не до такой же степени :)

> Эт хорошо - если четко воспроизводится и у тебя последние патчи пиши на МС-овский саппорт :)
SP3 стоит...
Воспроизводится стабильно. Но я очень мало раз пробовала, ибо систему и компьютер жалко :)

> Я тож в свое время дырочку нашел в W2K там IcmpSendEcho с определенным образом выделенным буффером приводила к BSOD :)
Ты думаешь им это интересно будет ?
Ведь RtlQueryProcessDebugInformation недокументирована,
и, соответственно, не очень честно к ней придираться...


 
Rouse_ ©   (2008-12-04 09:46) [9]


> Ты думаешь им это интересно будет ?

Думаю будет :)


 
Riply ©   (2008-12-04 14:53) [10]

> [9] Rouse_ ©   (04.12.08 09:46)
> Думаю будет :)

Эта...
А тестировать, наверное, надо на "чистой" (в смысле: без сторонних продуктов) системе ?
У меня такой нету.
Вдруг данный эффект дает что-то типа антивируса ?
Кто-то рассказывал, что Касперский роняет систему при определенном вызове TerminateProcess.
Проверила на XP SP3 + Norton Antivirus и на XP SP2 + Avast - работает, в смысле падает :)


 
Rouse_ ©   (2008-12-05 09:51) [11]

Удалено модератором
Примечание: дабы мыло не светить...


 
Riply ©   (2008-12-05 15:30) [12]

> [11] Rouse_ ©   (05.12.08 09:51)
> Ну вышли мне на

Хорошо.
Только чуть времени потребуется - на сборку.

P.S.
И чего толко не приходится делать !
Например, собирать вредоносный код :)


 
Riply ©   (2008-12-05 17:02) [13]

> [11] Rouse_ ©   (05.12.08 09:51)

Отправила.
Можете ронять систему в свое удовольствие :)


 
Rouse_ ©   (2008-12-05 17:51) [14]


> Можете ронять систему в свое удовольствие :)

Виртуалка для того и придумана чтоб родную систему не сотрясать :)
Отписался по результатам...


 
Германн ©   (2008-12-06 01:58) [15]

<offtop>
Саш, который Багель. Ну признай что ты на ДМ только (или почти только) читаешь вопросы Riply. Всё прочее ты "читаешь как модератор". Хотя я думаю, что и на прочих форумах ты тоже "читаешь" только "некоторых избранных".
P.S. Это ни в коей мере не упрёк. Это только констатация того факта, что никакой человек не может реально читать и реально отвечать на "все" вопросы. Причём на "туевой хуче" форумов.
Это я к своему заявлению, что ты "редко бываешь на ДМ".


 
Rouse_ ©   (2008-12-06 11:05) [16]

Читаю все - отвечаю только на интересные :)



Страницы: 1 вся ветка

Текущий архив: 2010.01.31;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.014 c
10-1163425650
Note
2006-11-13 16:47
2010.01.31
Определение наличия подключений к серверу


2-1260172706
uniken1
2009-12-07 10:58
2010.01.31
RichEdit и RTF с картинками


15-1259530217
Юрий
2009-11-30 00:30
2010.01.31
С днем рождения ! 30 ноября 2009 понедельник


15-1258925416
Юрий
2009-11-23 00:30
2010.01.31
С днем рождения ! 23 ноября 2009 понедельник


2-1260359005
Xmen
2009-12-09 14:43
2010.01.31
Проверка компа.