Главная страница
    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.005 c
2-1255669952
d@nger
2009-10-16 09:12
2009.12.06
путь к базе Firebird


2-1255949658
night_light
2009-10-19 14:54
2009.12.06
не отображается метка у TLabeledEdit


2-1255711170
den49
2009-10-16 20:39
2009.12.06
Чтение из файла при помощи Filestream


2-1255696453
FEV
2009-10-16 16:34
2009.12.06
События для динамических кнопок...


1-1228119004
parasolka
2008-12-01 11:10
2009.12.06
Передача параметров в Dll.





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