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

Вниз

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

 
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 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.008 c
15-1255010538
@!!ex
2009-10-08 18:02
2009.12.06
Чем можно докачать файл?


15-1255008109
ocean
2009-10-08 17:21
2009.12.06
Что можно предпринять, если не ставится драйвер?


2-1256036827
Pascal96
2009-10-20 15:07
2009.12.06
Задачка на Pascal


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


15-1254984893
Kolan
2009-10-08 10:54
2009.12.06
Как реализован синглетон TRttiContext?