Добавил несколько интересных функций: - NtRedirectionLdrInitializeThunk - NtRedirectionApcOnException - MapViewOfObject - NtInstallCallGate - NtRemoveCallGate http://obmen.borges.ru/download/387
Clerk Зачем windows.inc, который занимает места больше чем все остальное вместе взятое, оставил, ведь он не измелился с прошлого раза?
Появился вопрос по структуре: SYSTEM_PROCESSES struct NextEntryDelta ULONG ? ThreadCount ULONG ? Reserved1 ULONG 6 DUP (?) CreateTime LARGE_INTEGER <> UserTime LARGE_INTEGER <> KernelTime LARGE_INTEGER <> ProcessName UNICODE_STRING <> BasePriority ULONG ? ProcessId ULONG ? InheritedFromProcessId ULONG ? HandleCount ULONG ? SessionId ULONG ? Reserved2 ULONG 2 DUP (?) VmCounters VM_COUNTERS <> IoCounters IO_COUNTERS <> ;____Windows 2000 only! Threads SYSTEM_THREADS <> SYSTEM_PROCESSES ends PSYSTEM_PROCESSES typedef ptr SYSTEM_PROCESSES сколько не смотртел в инете везде структуры разные, либо нет SessionId или если есть, то тогда Reserved2 просто dword, а не ULONG 2 DUP (?). Еще вопрос, вложенная структура IoCounters существует только в Win2000, а в XP после VmCounters идет сразу Threads? Хотелось бы узнать это для какой платформы структура XP SP2? Вобщем похоже, что в ней ошибка, так как нормально отпарсить Threads не получается
У меня работает, как и определена структура. В исходниках винды определена она иначе. У меня 'отпарсивает' потоки нормально, проверено во многих сборках SP2.
Код (Text): typedef struct _SYSTEM_PROCESS_INFORMATION { ULONG NextEntryOffset; ULONG NumberOfThreads; LARGE_INTEGER SpareLi1; LARGE_INTEGER SpareLi2; LARGE_INTEGER SpareLi3; LARGE_INTEGER CreateTime; LARGE_INTEGER UserTime; LARGE_INTEGER KernelTime; UNICODE_STRING ImageName; KPRIORITY BasePriority; HANDLE UniqueProcessId; HANDLE InheritedFromUniqueProcessId; ULONG HandleCount; ULONG SessionId; ULONG_PTR PageDirectoryBase; SIZE_T PeakVirtualSize; SIZE_T VirtualSize; ULONG PageFaultCount; SIZE_T PeakWorkingSetSize; SIZE_T WorkingSetSize; SIZE_T QuotaPeakPagedPoolUsage; SIZE_T QuotaPagedPoolUsage; SIZE_T QuotaPeakNonPagedPoolUsage; SIZE_T QuotaNonPagedPoolUsage; SIZE_T PagefileUsage; SIZE_T PeakPagefileUsage; SIZE_T PrivatePageCount; LARGE_INTEGER ReadOperationCount; LARGE_INTEGER WriteOperationCount; LARGE_INTEGER OtherOperationCount; LARGE_INTEGER ReadTransferCount; LARGE_INTEGER WriteTransferCount; LARGE_INTEGER OtherTransferCount; } SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION; SYSTEM_THREADS во всех версиях одинакова, известен адрес(поле NextEntryOffset) сл. структуры SYSTEM_PROCESSES, отсюда пройдясь с конца по структурам SYSTEM_THREADS можно найти конец структуры SYSTEM_PROCESSES, тоесть её размер. Я это не проверял, но работать должно.
Эта структура как-то более вписывается в то, что я понаходил. Итого, в твоей структуре: Reserved2 ULONG 2 DUP (?) должно быть просто Reserved2 ULONG (?) так как это "PageDirectoryBase" а в VM_COUNTERS необходимо добавить "PrivatePageCount"
SYSTEM_PROCESSES.NextEntryOffset=SYSTEM_PROCESSES.ThreadCount*SizeOf(SYSTEM_THREADS)+SizeOf(SYSTEM_PROCESSES)+SYSTEM_PROCESSES.ProcessName.MaximumLength; Второй процесс в буфере с именем 'System', длина имени фиксирована, SYSTEM_PROCESSES.ProcessName.MaximumLength('System')=10h, с учотом выравнивания => SYSTEM_PROCESSES.NextEntryOffset=SYSTEM_PROCESSES.ThreadCount*SizeOf(SYSTEM_THREADS)+SizeOf(SYSTEM_PROCESSES)+10h, для пр. 'System'=> SizeOf(SYSTEM_PROCESSES)=SYSTEM_PROCESSES.NextEntryOffset-SYSTEM_PROCESSES.ThreadCount*SizeOf(SYSTEM_THREADS)-10h Первое смещение в буфере указывает на процесс 'System', отсюда найдём размер.
Вобщем я проверил, все правильно Reserved2 должно быть просто DWORD ? иначе в VM_COUNTERS мы получаем неправильные значения. Соответственно в структуру VM_COUNTERS нужно еще добавить "PrivatePageCount DWORD ?" Теперь, когда со структурами более мение разобрались, возвращаюсь к моей проблеме. Итак, в конце структуры SYSTEM_PROCESSES должен идти массив структур SYSTEM_THREADS, sizeof(SYSTEM_THREADS) = 3Ch, но на практике sizeof(SYSTEM_THREADS) оказался 40h (XP SP2). Я специально прикрепил рисунок, на котором это видно. Собственно вопрос почему 40h? Или нужно еще учитывать какое-то выравнивание?
Исправил многие ошибки; добавлено: PsAddApcRedirection NtQueryCurrentNtosSdt http://dump.ru/files/o/o8542607127/ seeQ Позже посмотрим..
Добавлено: CalculateOffsetEntryPoint WriteNowEntryPoint WriteNowEntryPointEx PsQueryDebugModuleInformationProtected http://dump.ru/files/o/o9779650/
seeQ Подумал, для определения размеров структур надо решить систему из двух уравнений: SYSTEM_PROCESSES.NextEntryOffset=SYSTEM_PROCESSES2.ThreadCount*SizeOf(SYSTEM_THREADS)+SizeOf(SYSTEM_PROCESSES)+SYSTEM_PROCESSES.ProcessName.MaximumLength A=SYSTEM_PROCESSES.NextEntryOffset B=SYSTEM_PROCESSES.ThreadCount C=SYSTEM_PROCESSES.ProcessName.MaximumLength X=SizeOf(SYSTEM_PROCESSES) Y=SizeOf(SYSTEM_THREADS) A1=B1*Y+X+C1 A2=B2*Y+X+C2 ->X=A1-B1*Y-C1 A2=B2*Y+(A1-B1*Y-C1)+C2=B2*Y+A1-B1*Y-C1+C2=B2*Y-B1*Y+A1-C1+C2=Y*(B2-B1)+A1-C1+C2 Y*(B2-B1)=A2-A1+C1-C2 ->Y=(A2-A1+C1-C2)/(B2-B1) Вот рабочий код: Код (Text): QuerySystemProcessesStructureSize proc uses esi edi ebx InformationBuffer:PVOID, SystemProcessesSize:PULONG, SystemThreadsSize:PULONG mov esi,InformationBuffer xor edx,edx mov edi,esi add edi,dword ptr [esi] assume esi:PSYSTEM_PROCESSES ;#1 assume edi:PSYSTEM_PROCESSES ;#2 mov eax,[edi].NextEntryDelta sub eax,[esi].NextEntryDelta movzx ecx,[esi].ProcessName.MaximumLength add eax,ecx movzx ecx,[edi].ProcessName.MaximumLength sub eax,ecx mov ecx,[edi].ThreadCount sub ecx,[esi].ThreadCount div ecx ;Y=SizeOf(SYSTEM_THREADS) mov ebx,eax mul [esi].ThreadCount mov edx,[esi].NextEntryDelta sub edx,eax movzx ecx,[esi].ProcessName.MaximumLength sub edx,ecx ;X=SizeOf(SYSTEM_PROCESSES) mov edi,SystemProcessesSize mov esi,SystemThreadsSize mov dword ptr [edi],edx mov dword ptr [esi],ebx ret QuerySystemProcessesStructureSize endp
Clerk Скажи что это, или дай линк где об этом можно почитать, а то куча асм-кода вызывающего функции подсистемы win32 мне ничего не говорит.
У меня в основе перехватов изначально существовала уязвимость, а именно изза вероятность возникновения ошибки на многопроцессорных системах, полностью переписываю код.
Функции перехватов можно считать завершёнными; добавлено: SplaysKiFastSystemCallRet SplaysKiFastSystemCall WaitForSplaysReady QueryNotifyRoutinesReferences PsCreateRemoteThread http://dump.ru/files/o/o1249211436/