Главная страница
    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
15-1254858167
Magedon
2009-10-06 23:42
2009.12.06
Delphi 2007 + Vista SP2


15-1254894885
MBo
2009-10-07 09:54
2009.12.06
Срединедельная задачка


15-1254906022
Dennis I. Komarov
2009-10-07 13:00
2009.12.06
HP Compaq nx7400 или подобные (бук)


4-1222413068
Riply
2008-09-26 11:11
2009.12.06
RtlCopyUnicodeString и IRQL


15-1254563003
XcCCC
2009-10-03 13:43
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский