вобщем перечисляю все процессы, нахожу свой процесс, потом перечисляю все треды, кроме своего и пытаюсь их открыть( для остановки ) ... на что ZwOpenThread говорит C0000005 ACCESS VIOLATION ... в чем грабли понять не могу ): направте плиз в нужное русло ... Code (Text): push ebp mov ebp,esp sub esp,8 lea edi,[ebp-4] xor ecx,ecx xor esi,esi .again: push edi ; ReturnLength push ecx ; SystemInformationLength push esi ; SystemInformation push 5 ; SystemInformationClass call [ZwQuerySystemInformation] test eax,eax jz .loop mov ecx,dword[edi] push ecx push PAGE_EXECUTE_READWRITE ; dwProtection push MEM_TOP_DOWN+MEM_COMMIT ; dwAloocType lea eax,[ebp-4] mov dword[eax],ecx push eax ; lpdwSize push 0 ; dwZeroBit lea eax,[ebp-8] ; lpAddr and dword[eax],0 push eax push -1 ; hProc call [ZwAllocateVirtualMemory] pop ecx test eax,eax jnz .ret mov esi,[ebp-8] mov ebx,esi jmp .again .loop: xor eax,eax mov eax,dword[fs:eax+18h] mov eax,dword[eax+20h] ; <- CurrentProcId m2m ecx,dword[esi+44h] cmp eax,ecx jnz .next xor edi,edi lea ecx,dword[esi+0d8h] .thr: push ecx mov ebx,dword[ecx+4] ; <- ThreadID xor eax,eax mov eax,dword[fs:eax+18h] mov eax,dword[eax+24h] ; <- CurrentThreadId cmp eax,ebx jz .nextt push ebx ; <- ClientId push 0 ; <- ObjectAttributes push 2 ; <- THREAD_SUSPEND_RESUME lea eax,[ebp-4] and dword[eax],0 push eax ; <- ThreadHandle call [ZwOpenThread] mov ebx,dword[ebp-4] ; ... push ebx call [ZwClose] .nextt: pop ecx add ecx,40h inc edi cmp edi,[esi+4] jb .thr jmp .free cmp dword[esi],0 jz .next .next: add esi,[esi] jmp .loop .free: push MEM_RELEASE push edi lea eax,[ebp-8] mov dword[eax],ebx push eax push -1 call [ZwFreeVirtualMemory] .ret: leave
Code (Text): push ecx mov ebx,dword[ecx+4] ; <- ThreadID xor eax,eax mov eax,dword[fs:eax+18h] mov eax,dword[eax+24h] ; <- CurrentThreadId cmp eax,ebx jz .nextt push ebx ; <- ClientId -- ты уверен что здесь ClientId, а не в (ebx-4 == ecx)?
сто пудово уверен, код получен при диссасме кернела ... да я вобщем уже и разобрался ... делов в том, что я немного тупанул ...т.к. Code (Text): NTSTATUS NtOpenThread( OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId ); а у меня IN CLIENT_ID ClientId, это раз ... к тому же оказалось, что CLIENT_ID это двух байтовая структура, где первый элемент это ид процесса, а второй треда ... ( просьба не глумится, у меня этих структур нет, вдуплялся диссасмя кернел32 ... ) ... ну и к тому же обязательным параметром является POBJECT_ATTRIBUTES, что представляет из себя 24 зануленных байта, вобще конечно в кернел в первый дворд засовывается длинна структуры 18h, но как показали тесты это нах не надо ... вобщем после всех моих мучений получилась функция останова/запуска всех тредов кроме своего в текущем процессе ... зы. кстати кто расспологает описанием структур на асме под нативные апи, просьба поделится ... (: ззы. ниже собственно функция, мб кому пригодится ... для инжектов там всяких Code (Text): elthreadcontrol: ; 0 stop, 1 resume push ebp mov ebp,esp sub esp,28h pushad lea edi,[ebp-4] xor ecx,ecx xor esi,esi .again: push edi ; ReturnLength push ecx ; SystemInformationLength push esi ; SystemInformation push 5 ; SystemInformationClass call [ZwQuerySystemInformation] test eax,eax jz .inside mov ecx,dword[edi] push ecx push PAGE_EXECUTE_READWRITE ; dwProtection push MEM_TOP_DOWN+MEM_COMMIT ; dwAloocType lea eax,[ebp-4] mov dword[eax],ecx push eax ; lpdwSize push 0 ; dwZeroBit lea eax,[ebp-8] ; lpAddr and dword[eax],0 push eax push -1 ; hProc call [ZwAllocateVirtualMemory] pop ecx test eax,eax jnz .ret mov esi,[ebp-8] mov ebx,esi jmp .again .inside:pushad .loop: xor eax,eax mov eax,dword[fs:eax+18h] mov eax,dword[eax+20h] ; <- CurrentProcId m2m ecx,dword[esi+44h] cmp eax,ecx jnz .next xor edi,edi lea ecx,dword[esi+0d8h] .thr: push ecx mov ebx,dword[ecx+4] ; <- ThreadID xor eax,eax mov eax,dword[fs:eax+18h] mov eax,dword[eax+24h] ; <- CurrentThreadId cmp eax,ebx jz .nextt lea eax,[ebp-10h] and dword[eax],0 m2m dword[eax+4],ebx push eax ; <- PCLIENT_ID lea edi,[ebp-28h] push edi ; <- ObjectAttributes m2m ecx,18h xor eax,eax rep stosb push 2 ; <- THREAD_SUSPEND_RESUME lea eax,[ebp-4] push eax ; <- ThreadHandle call [ZwOpenThread] test eax,eax jnz .free mov ebx,dword[ebp-4] cmp dword[ebp+8],0 jnz .resume push 0 push ebx call [ZwSuspendThread] jmp .close .resume:push 0 push ebx call [ZwResumeThread] .close: push ebx call [ZwClose] .nextt: pop ecx add ecx,40h inc edi cmp edi,[esi+4] jb .thr jmp .free cmp dword[esi],0 jz .next .next: add esi,[esi] jmp .loop .free: popad push MEM_RELEASE push edi lea eax,[ebp-8] mov dword[eax],ebx push eax push -1 call [ZwFreeVirtualMemory] popad .ret: leave retn 4
Тяжёлый случай. Чтобы не уподобляться некоторым товарищам я бы посоветовал поставить DDK+KmdKit и почитать документацию (или хотя бы статьи Four-F).
еще такой вопросец ... перехватываю ZwResumeTHread для заражения созданых процессов ... пытаюсь получить информацию о процессе через ZwQueryInformationThread, но не которые треды не поддаются ... и выдают Access denied ... судя по всему их хендлы открыты только с правами SUSPEND_RESUME ... так вот есть способ переоткрыть тред или повысить уровень доступа к его хендлу ... если да то подскажите какой ? незатруднит ли вас кинуть прямые ссылки ...