Форум: "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.004 c