открытие треда

Тема в разделе "WASM.BEGINNERS", создана пользователем el-, 12 окт 2006.

  1. el-

    el- New Member

    Публикаций:
    0
    вобщем перечисляю все процессы, нахожу свой процесс, потом перечисляю все треды, кроме своего и пытаюсь их открыть( для остановки ) ... на что ZwOpenThread говорит C0000005 ACCESS VIOLATION ... в чем грабли понять не могу ): направте плиз в нужное русло ...

    Код (Text):
    1.     push    ebp
    2.     mov ebp,esp
    3.     sub esp,8
    4.     lea edi,[ebp-4]
    5.     xor ecx,ecx
    6.     xor esi,esi
    7. .again: push    edi         ; ReturnLength
    8.     push    ecx         ; SystemInformationLength
    9.     push    esi         ; SystemInformation
    10.     push    5           ; SystemInformationClass
    11.     call    [ZwQuerySystemInformation]
    12.     test    eax,eax
    13.     jz  .loop
    14.     mov ecx,dword[edi]
    15.     push    ecx
    16.     push    PAGE_EXECUTE_READWRITE  ; dwProtection
    17.     push    MEM_TOP_DOWN+MEM_COMMIT ; dwAloocType
    18.     lea eax,[ebp-4]
    19.     mov dword[eax],ecx
    20.     push    eax         ; lpdwSize
    21.     push    0           ; dwZeroBit
    22.     lea eax,[ebp-8]     ; lpAddr
    23.     and dword[eax],0
    24.     push    eax        
    25.     push    -1          ; hProc
    26.     call    [ZwAllocateVirtualMemory]
    27.     pop ecx
    28.     test    eax,eax
    29.     jnz .ret
    30.     mov esi,[ebp-8]
    31.     mov ebx,esi
    32.     jmp .again
    33. .loop:  xor eax,eax
    34.     mov eax,dword[fs:eax+18h]
    35.     mov eax,dword[eax+20h]  ; <- CurrentProcId
    36.     m2m ecx,dword[esi+44h]
    37.     cmp eax,ecx
    38.     jnz .next
    39.     xor edi,edi
    40.     lea     ecx,dword[esi+0d8h]
    41. .thr:   push    ecx
    42.     mov     ebx,dword[ecx+4]    ; <- ThreadID
    43.     xor eax,eax
    44.     mov eax,dword[fs:eax+18h]
    45.     mov eax,dword[eax+24h]  ; <- CurrentThreadId
    46.     cmp eax,ebx
    47.     jz  .nextt
    48.     push    ebx         ; <- ClientId
    49.     push    0           ; <- ObjectAttributes
    50.     push    2           ; <- THREAD_SUSPEND_RESUME
    51.     lea eax,[ebp-4]
    52.     and dword[eax],0
    53.     push    eax         ; <- ThreadHandle
    54.     call    [ZwOpenThread]
    55.     mov ebx,dword[ebp-4]
    56.  
    57.     ; ...
    58.  
    59.     push    ebx
    60.     call    [ZwClose]
    61. .nextt: pop ecx
    62.     add ecx,40h
    63.     inc edi
    64.     cmp edi,[esi+4]
    65.     jb  .thr
    66.     jmp .free
    67.     cmp dword[esi],0
    68.     jz  .next
    69. .next:  add esi,[esi]
    70.     jmp .loop
    71. .free:  push    MEM_RELEASE
    72.     push    edi
    73.     lea eax,[ebp-8]
    74.     mov dword[eax],ebx
    75.     push    eax
    76.     push    -1
    77.     call    [ZwFreeVirtualMemory]
    78. .ret:   leave
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Код (Text):
    1. push    ecx
    2.     mov     ebx,dword[ecx+4]    ; <- ThreadID
    3.     xor    eax,eax
    4.     mov    eax,dword[fs:eax+18h]
    5.     mov    eax,dword[eax+24h]    ; <- CurrentThreadId
    6.     cmp    eax,ebx
    7.     jz    .nextt
    8.     push    ebx            ; <- ClientId  -- ты уверен что здесь ClientId, а не в (ebx-4 == ecx)?
     
  3. el-

    el- New Member

    Публикаций:
    0
    сто пудово уверен, код получен при диссасме кернела ...

    да я вобщем уже и разобрался ... делов в том, что я немного тупанул ...т.к.
    Код (Text):
    1.         NTSTATUS NtOpenThread(
    2.                 OUT PHANDLE ThreadHandle,
    3.                 IN ACCESS_MASK DesiredAccess,
    4.                 IN POBJECT_ATTRIBUTES ObjectAttributes,
    5.                 IN PCLIENT_ID ClientId
    6.         );
    а у меня IN CLIENT_ID ClientId, это раз ...

    к тому же оказалось, что CLIENT_ID это двух байтовая структура, где первый элемент это ид процесса, а второй треда ... ( просьба не глумится, у меня этих структур нет, вдуплялся диссасмя кернел32 ... ) ...

    ну и к тому же обязательным параметром является POBJECT_ATTRIBUTES, что представляет из себя 24 зануленных байта, вобще конечно в кернел в первый дворд засовывается длинна структуры 18h, но как показали тесты это нах не надо ...

    вобщем после всех моих мучений получилась функция останова/запуска всех тредов кроме своего в текущем процессе ...

    зы. кстати кто расспологает описанием структур на асме под нативные апи, просьба поделится ... (:
    ззы. ниже собственно функция, мб кому пригодится ... для инжектов там всяких

    Код (Text):
    1. elthreadcontrol: ; 0 stop, 1 resume
    2.     push    ebp
    3.     mov ebp,esp
    4.     sub esp,28h
    5.     pushad
    6.     lea edi,[ebp-4]
    7.     xor ecx,ecx
    8.     xor esi,esi
    9. .again: push    edi         ; ReturnLength
    10.     push    ecx         ; SystemInformationLength
    11.     push    esi         ; SystemInformation
    12.     push    5           ; SystemInformationClass
    13.     call    [ZwQuerySystemInformation]
    14.     test    eax,eax
    15.     jz  .inside
    16.     mov ecx,dword[edi]
    17.     push    ecx
    18.     push    PAGE_EXECUTE_READWRITE  ; dwProtection
    19.     push    MEM_TOP_DOWN+MEM_COMMIT ; dwAloocType
    20.     lea eax,[ebp-4]
    21.     mov dword[eax],ecx
    22.     push    eax         ; lpdwSize
    23.     push    0           ; dwZeroBit
    24.     lea eax,[ebp-8]     ; lpAddr
    25.     and dword[eax],0
    26.     push    eax        
    27.     push    -1          ; hProc
    28.     call    [ZwAllocateVirtualMemory]
    29.     pop ecx
    30.     test    eax,eax
    31.     jnz .ret
    32.     mov esi,[ebp-8]
    33.     mov ebx,esi
    34.     jmp .again
    35. .inside:pushad
    36. .loop:  xor eax,eax
    37.     mov eax,dword[fs:eax+18h]
    38.     mov eax,dword[eax+20h]  ; <- CurrentProcId
    39.     m2m ecx,dword[esi+44h]
    40.     cmp eax,ecx
    41.     jnz .next
    42.     xor edi,edi
    43.     lea     ecx,dword[esi+0d8h]
    44. .thr:   push    ecx
    45.     mov     ebx,dword[ecx+4]    ; <- ThreadID
    46.     xor eax,eax
    47.     mov eax,dword[fs:eax+18h]
    48.     mov eax,dword[eax+24h]  ; <- CurrentThreadId
    49.     cmp eax,ebx
    50.     jz  .nextt
    51.     lea eax,[ebp-10h]
    52.     and dword[eax],0
    53.     m2m dword[eax+4],ebx
    54.     push    eax         ; <- PCLIENT_ID
    55.     lea edi,[ebp-28h]
    56.     push    edi         ; <- ObjectAttributes
    57.     m2m ecx,18h
    58.     xor eax,eax
    59.     rep stosb
    60.     push    2           ; <- THREAD_SUSPEND_RESUME
    61.     lea eax,[ebp-4]
    62.     push    eax         ; <- ThreadHandle
    63.     call    [ZwOpenThread]
    64.     test    eax,eax
    65.     jnz .free
    66.     mov ebx,dword[ebp-4]
    67.     cmp dword[ebp+8],0
    68.     jnz .resume
    69.     push    0
    70.     push    ebx
    71.     call    [ZwSuspendThread]
    72.     jmp .close 
    73. .resume:push    0
    74.     push    ebx
    75.     call    [ZwResumeThread]
    76. .close: push    ebx
    77.     call    [ZwClose]
    78. .nextt: pop ecx
    79.     add ecx,40h
    80.     inc edi
    81.     cmp edi,[esi+4]
    82.     jb  .thr
    83.     jmp .free
    84.     cmp dword[esi],0
    85.     jz  .next
    86. .next:  add esi,[esi]
    87.     jmp .loop
    88. .free:  popad
    89.     push    MEM_RELEASE
    90.     push    edi
    91.     lea eax,[ebp-8]
    92.     mov dword[eax],ebx
    93.     push    eax
    94.     push    -1
    95.     call    [ZwFreeVirtualMemory]
    96.     popad
    97. .ret:   leave
    98.     retn    4
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Тяжёлый случай. Чтобы не уподобляться некоторым товарищам я бы посоветовал поставить DDK+KmdKit и почитать документацию (или хотя бы статьи Four-F).
     
  5. el-

    el- New Member

    Публикаций:
    0
    еще такой вопросец ... перехватываю ZwResumeTHread для заражения созданых процессов ... пытаюсь получить информацию о процессе через ZwQueryInformationThread, но не которые треды не поддаются ... и выдают Access denied ... судя по всему их хендлы открыты только с правами SUSPEND_RESUME ... так вот есть способ переоткрыть тред или повысить уровень доступа к его хендлу ... если да то подскажите какой ?

    незатруднит ли вас кинуть прямые ссылки ...