Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2010.01.31;
Скачать: [xml.tar.bz2];

Вниз

Принцип работы 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2010.01.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.005 c
2-1260256589
AIK
2009-12-08 10:16
2010.01.31
приложение не передаёт в ms SQl русские буквы


15-1258976801
Insor
2009-11-23 14:46
2010.01.31
Сайт для поиска работы программистом


15-1259489854
koha!
2009-11-29 13:17
2010.01.31
А что так дорого стоит RAD Studio?


1-1225260125
Максим
2008-10-29 09:02
2010.01.31
Написание приложений для многопроцессорного и однопроцессорного


15-1258913368
Alkid
2009-11-22 21:09
2010.01.31
А что это Каспер ругается на наш форум?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский