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

Вниз

Потоко-безопасный перебор модулей чужого процесса.   Найти похожие ветки 

 
Riply ©   (2008-10-17 03:05) [0]

Здравствуйте !
Допустим, мы хотим собственнолапно перебрать модули некого процесса
и написали для этого скелет нашей будущей ф-ии:
function Process_EnumerateModulesTemplate(const hProcess: THANDLE): NTSTATUS;
var
BasicInfo: PROCESS_BASIC_INFORMATION;
pLoaderModule: PLDR_DATA_TABLE_ENTRY;
pLoaderData: PPEB_LDR_DATA;
pHeadEntry, pCurrentEntry: PLIST_ENTRY;
begin
Result := ZwQueryInformationProcess(hProcess, ProcessBasicInformation,
                                    @BasicInfo, SizeOf(PROCESS_BASIC_INFORMATION), nil);
if NT_SUCCESS(Result) then
 begin
  Result := NtReadVirtualMemory(hProcess, @BasicInfo.PebBaseAddress.LdrData,
                                @pLoaderData, SizeOf(pLoaderData), nil);
  if NT_SUCCESS(Result) then
   begin
    pHeadEntry := @pLoaderData.InLoadOrderModuleList;
    Result := NtReadVirtualMemory(hProcess, @pLoaderData.InLoadOrderModuleList,
                                  @pCurrentEntry, SizeOf(pCurrentEntry), nil);
    if NT_SUCCESS(Result) then
     while pCurrentEntry <> pHeadEntry do
      begin
       Result := NtReadVirtualMemory(hProcess, @PLDR_DATA_TABLE_ENTRY(pCurrentEntry).InLoadOrderLinks,
                                     @pLoaderModule, SizeOf(pLoaderModule), nil);
       if NT_SUCCESS(Result) then
        begin
         // Чавой-то вытворяем с pLoaderModule и идем дальше
         pCurrentEntry := @pLoaderModule.InLoadOrderLinks.Flink;
        end
       else Break;
      end;
     end;
   end;
end;

Вроде, наш "скелет" даже работает.
Но, меня смущает, что пока мы занимаемся перебором, данные могут изменится.
В результате мы получим черт знает что или застрянем в каком-нибудь бесконечном цикле.
Как можно обезопаситься от этого ?

P.S.
В "своем" процессе я использовала Peb.LoaderLock, а как быть в чужем ?
P.S.S.
Очень хочется избежать таких варварских приемов,
как усыпление всех нитей целевого процесса :)


 
Сергей М. ©   (2008-10-17 08:15) [1]


> как быть в чужем ?


Точно так же.
Внедряешь туда свой код, он выполняет блокировку peb"а и - вуаля ! - надобность в "удаленных" выкрутасах с peb"ом отпадает напрочь)


 
Riply ©   (2008-10-17 08:33) [2]

> [1] Сергей М. ©   (17.10.08 08:15)
> Точно так же.
> Внедряешь туда свой код, он выполняет блокировку peb"а и - вуаля ! -
> надобность в "удаленных" выкрутасах с peb"ом отпадает напрочь)

Эт, конечно, так - и проще и возни меньше.
Но слишком уж тяжелая артиллерия применяется.
Можно еще воспользоваться RtlQueryProcessDebugInformation,
но она не со всеми процессами может работать.
А как поступает EnumProcessModules ?


 
Сергей М. ©   (2008-10-17 09:05) [3]


> как поступает EnumProcessModules ?


Тогда уж не psapi, а  snapshot-функции из tlhelp следовало бы рассматривать ..
А EnumProcessModules - ради интереса оттрассировал вызов - поступает так же "тупо".


 
Riply ©   (2008-10-17 12:02) [4]

> [3] Сергей М. ©   (17.10.08 09:05)
> Тогда уж не psapi, а  snapshot-функции из tlhelp следовало бы рассматривать ..

Посмотрела. Работает через ту же RtlQueryProcessDebugInformation и, соответственно
спотыкается на тех же процессах, что и она.

> А EnumProcessModules - ради интереса оттрассировал вызов - поступает так же "тупо".

Спасибо. Но что-то здесь "не то" или я чего-то не понимаю.
Мне кажется, что не блокируя PEB, работать просто нельзя.
Может существуют способы попросить процесс: "слушай, залоч Loader на чуть-чуть, а ?" :) ?


 
Сергей М. ©   (2008-10-17 12:21) [5]


> спотыкается на тех же процессах, что и она


Уж не system-ли ?


 
Leonid Troyanovsky ©   (2008-10-17 12:33) [6]


> Riply ©   (17.10.08 12:02) [4]

> Может существуют способы попросить процесс: "слушай, залоч
> Loader на чуть-чуть, а ?" :) ?

NTSTATUS NtSuspendProcess(HANDLE hProcess)
NTSTATUS NtResumeProcess(HANDLE hProcess) ?
--
Regards, LVT.


 
Riply ©   (2008-10-17 12:36) [7]

> [5] Сергей М. ©   (17.10.08 12:21)

> Уж не system-ли ?

:) Если бы только на нем, я бы и не расстраивалась.
У меня спотыкается (ACCESS_DENIED) примерно на четырех (типа NOPDB.exe - "симантек" антивирус).
А вот наш "скелет" и EnumProcessModules на них отрабатываю нормально.


 
Сергей М. ©   (2008-10-17 12:57) [8]


> Riply ©   (17.10.08 12:36) [7]


> У меня спотыкается (ACCESS_DENIED)


Так м.б. твоему процессу следует сначала получить привелегии пользователя SYSTEM ?


 
Riply ©   (2008-10-17 13:06) [9]

> [8] Сергей М. ©   (17.10.08 12:57)
> Так м.б. твоему процессу следует сначала получить привелегии пользователя SYSTEM ?

Видимо, так и сделаю.
И заодно попробую воспользоваться советом [6] Leonid Troyanovsky.



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

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

Наверх




Память: 0.47 MB
Время: 0.004 c
15-1254898716
Александр Ильин
2009-10-07 10:58
2009.12.06
Восстановление файла


15-1255101350
Дмитрий С
2009-10-09 19:15
2009.12.06
Как получить нормально распределенное случаное число от 0 до 1 и


2-1255767321
Роман
2009-10-17 12:15
2009.12.06
Чтение древа каталогов


2-1254662801
newbart
2009-10-04 17:26
2009.12.06
Ошибки при запуске приложений из Delphi


2-1255701197
Артём
2009-10-16 17:53
2009.12.06
Динамические окна





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский