Win7: падает инжект в explorer

Тема в разделе "WASM.WIN32", создана пользователем steelfactor, 8 май 2011.

  1. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Экспериментирую с инжектом сторонней dll в explorer.exe Windows 7, для инжекта использую патч в CsrClientCallServer.
    DLL сплайсит одну функцию в ntdll.dll в текущем процессе. При инжекте explorer перезагружается.
    Если инжект делать для мелких процессов типа calc.exe или если dll "пустая" (т.е. не несет какой-то нагрузки), то инжект проходит без проблем, но интересует все-таки сам эксплорер.
    Аналогичный "стандартный" инжект такой же dll в XP проходит без проблем.
    Кто-нибудь сталкивался с такой проблемой?
     
  2. blackcod

    blackcod New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2011
    Сообщения:
    21
    1. разрядность совпадает? (explorer x32 и dll32)
    2. в импорте длл нет чего нить экзотического, чего explorer не юзает?
    3. "не несет полезной нагрузки" - гадание на хз чём имхо...
     
  3. expert

    expert New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    151
    отлаживать код в дебаггере папа запретил?
     
  4. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    +1, явно же падение. Подруби windbg и отладь в сорцах. Термосинтез даже ман писал давно довольно.
     
  5. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    отладчик религия запрещает запускать :) А по делу, сначала подключи отладчик, потом в начале Payload поставь 0xCC и отлаживай себе на здоровье!
     
  6. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    Патч это негодная технология. Там же колбек есть CsrServerApiRoutine, достаточно его зарегать и сделать вид, что текущий процесс серверный, изменив переменную CsrServerProcess(именно инверсия значения!). После оных манипуляций управление будет получать колбек, из него нужно выполнить откат - почистить всё за собой и вернуть управление на инструкцию, следующую за проверкой переменной CsrServerProcess(следующая Jcc, нужно изменить условие, либо на следующую за ней. Это потребует динамический дизасм кода). Либо откатать функцию полностью(тоесть почистить стек, восстановить RGP) и вызвать её повторно со сброшенным флагом CsrServerProcess. Идеально подходит морфинг её - функа переносится в буфер, при этом изменяется условное ветвление или ссылка на CsrServerProcess. Это в идеале, разумеется проще отжать смещение и на Ip'' возвращаться. Вот нашёл у себя код(из модуля конфигурации Stpt без LDE):
    Код (Text):
    1. OP_ESC_2B   equ 0FH
    2.  
    3. ; +
    4. ; Двухпроходовый сигнатурный поиск шлюза.
    5. ;
    6. ; CsrClientCallServer:
    7. ;   cmp byte ptr ds:[_CsrServerProcess],bl
    8. ;   jnz XXXX
    9. ;   ...
    10. ; XXXX:
    11. ; ApiMessage->Header.ClientId = NtCurrentTeb()->ClientId;
    12. ; Status = CsrServerApiRoutine(&ApiMessage->Header, &ApiMessage->Header);
    13. ; $     64:A1 18000000      mov eax,dword ptr fs:[18]   ; PTEB
    14. ; $+6   8B48 20         mov ecx,dword ptr ds:[eax+20]   ; TID
    15. ; $+9   894E 08         mov dword ptr ds:[esi+8],ecx
    16. ; $+C   8B40 24         mov eax,dword ptr ds:[eax+24]   ; PID
    17. ; $+F   56              push esi
    18. ; $+10  56              push esi    ; PPORT_MESSAGE
    19. ; $+11  8946 0C         mov dword ptr ds:[esi+C],eax
    20. ; typedef NTSTATUS
    21. ;   (NTAPI *PCSR_SERVER_API_ROUTINE)(IN PPORT_MESSAGE Request, IN PPORT_MESSAGE Reply);
    22. ; PCSR_SERVER_API_ROUTINE CsrServerApiRoutine;
    23. ; $+14  FF15 DCC9977C       call dword ptr ds:[_CsrServerApiRoutine]
    24. ;   ...
    25. ; -
    26. ; o Eax: @Call [CsrServerApiRoutine]
    27. ; o Ecx: @CsrServerApiRoutine
    28. ;   Edx: @Back IP
    29. ;
    30. QueryGate proc
    31. Local Stub:PVOID
    32. Local SizeOfCode:ULONG
    33.     mov eax,fs:[TEB.Peb]
    34.     mov eax,PEB.Ldr[eax]
    35.     mov eax,PEB_LDR_DATA.InLoadOrderModuleList.Flink[eax]
    36.     mov eax,LDR_DATA_TABLE_ENTRY.InLoadOrderModuleList.Flink[eax]
    37.     mov edx,LDR_DATA_TABLE_ENTRY.DllBase[eax]   ; ntdll.dll
    38.     mov eax,IMAGE_DOS_HEADER.e_lfanew[edx]
    39.     mov ecx,IMAGE_NT_HEADERS.OptionalHeader.SizeOfCode[edx + eax]
    40.     add edx,IMAGE_NT_HEADERS.OptionalHeader.BaseOfCode[edx + eax]
    41.     mov SizeOfCode,ecx
    42.     mov eax,edx
    43.     sub ecx,8*4
    44. ; 64 A1 18 00 00 00 8B 48 20 89 4E 08 8B 40 24 56 56 89 46 0C FF 15
    45. Scan:
    46.     cmp dword ptr [eax],0018A164H
    47.     je @f
    48. Step:
    49.     inc eax
    50.     loop Scan
    51.     jmp Error
    52. @@:
    53.     cmp dword ptr [eax + 4],488B0000H
    54.     jne Step
    55.     cmp dword ptr [eax + 2*4],084E8920H
    56.     jne Step
    57.     cmp dword ptr [eax + 3*4],5624408BH
    58.     jne Step
    59.     cmp dword ptr [eax + 4*4],0C468956H
    60.     jne Step
    61.     cmp word ptr [eax + 5*4],15FFH
    62.     jne Step
    63. comment '
    64.     mov Stub,eax
    65.     mov ecx,SizeOfCode
    66.     sub eax,edx
    67.     sub ecx,6
    68.     sub eax,4
    69. Scan2nd:
    70.     cmp dword ptr [edx],eax
    71.     je @f
    72. Step2nd:
    73.     dec eax
    74.     inc edx
    75.     loop Scan2nd
    76.     jmp Error
    77. @@:
    78.     cmp byte ptr [edx - 2],OP_ESC_2B
    79.     jne Step2nd
    80.     cmp byte ptr [edx - 1],85H  ; Jne
    81.     je @f
    82.     cmp byte ptr [edx - 1],84H  ; Je
    83.     jne Step2nd
    84.     mov eax,Stub
    85.     add edx,4
    86.     '
    87.     add eax,14H
    88. Exit:
    89.     mov ecx,dword ptr [eax + 2] ; @CsrServerApiRoutine
    90.     ret
    91. Error:
    92.     xor eax,eax
    93.     jmp Exit
    94. QueryGate endp
    Это какойто древний семпл, видимо делает то что вам нужно(не знаю на сколько корректно):
    Код (Text):
    1. comment '
    2. csrss(IMAGE_SUBSYSTEM_NATIVE): CsrServerApiRoutine -> csrsrv!CsrCallServerFromServer
    3.  
    4. 00882DA3        381D D8B18E00         cmp byte ptr ds:[_CsrServerProcess],bl
    5. 00882DA9        0F85 BFDB0100         jnz ntdll_1.008A096E
    6.  
    7. 008E40FC        803D 68309400 00      cmp byte ptr ds:[943068],0
    8. 008E4103        0F84 B01BF9FF         je ntdll_1.00875CB9
    9.  
    10. 008D94FC        803D 86409300 01      cmp byte ptr ds:[934086],1
    11. 008D9503        0F85 1310FAFF         jnz ntdll_1.0087A51C
    12.  
    13. 008A096E        64:A1 18000000        mov eax,dword ptr fs:[18]
    14. 008A0974        8B48 20               mov ecx,dword ptr ds:[eax+20]
    15. 008A0977        894E 08               mov dword ptr ds:[esi+8],ecx
    16. 008A097A        8B40 24               mov eax,dword ptr ds:[eax+24]
    17. 008A097D        56                    push esi
    18. 008A097E        56                    push esi
    19. 008A097F        8946 0C               mov dword ptr ds:[esi+C],eax
    20. 008A0982        FF15 DCC98E00         call dword ptr ds:[_CsrServerApiRoutine]
    21. 008A0988        E9 4424FEFF           jmp ntdll_1.00882DD1
    22.  
    23. 0037B9E0        64:A1 18000000        mov eax,dword ptr fs:[18]
    24. 0037B9E6        8B48 20               mov ecx,dword ptr ds:[eax+20]
    25. 0037B9E9        56                    push esi
    26. 0037B9EA        894E 08               mov dword ptr ds:[esi+8],ecx
    27. 0037B9ED        8B40 24               mov eax,dword ptr ds:[eax+24]
    28. 0037B9F0        56                    push esi
    29. 0037B9F1        8946 0C               mov dword ptr ds:[esi+C],eax
    30. 0037B9F4        FF15 40F13A00         call dword ptr ds:[3AF140]
    31. 0037B9FA        E9 E1D7FEFF           jmp ntdll_1.003691E0'
    32.  
    33. CSR_PARSE struct
    34. pCsrServerProcess       PVOID ?
    35. pCsrServerApiRoutine    PVOID ?
    36. pCallbackReturn     PVOID ?
    37. Condition               BOOLEAN ?   ;Byte
    38. CSR_PARSE ends
    39. PCSR_PARSE typedef ptr CSR_PARSE
    40.  
    41. CsrParseClientCallServerRoutine proc uses ebx esi edi ParseResult:PCSR_PARSE
    42. Local InstructionSize:ULONG
    43.     mov ebx,dword ptr [_imp__CsrClientCallServer]
    44.     xor edi,edi
    45.     lea esi,[ebx + 100h]    ;Limit
    46. next_opcode_:
    47.     invoke LDE, Ebx, addr InstructionSize
    48.     test eax,eax
    49.     jnz exit_
    50.     add ebx,InstructionSize
    51.     cmp ebx,esi
    52.     movzx edx,word ptr [ebx]
    53.     jnb error_
    54.     cmp dl,0C2h ;retn 4*4
    55.     je error_
    56.     cmp dl,0E8h ;call ZwRequestWaitReplyPort
    57.     je error_
    58.     cmp dl,05Dh ;pop ebp
    59.     je error_
    60.    
    61.     mov ecx,dword ptr [ebx + 2] ;ptr CsrServerProcess
    62.     cmp dx,1D38h    ;cmp byte ptr ds:[CsrServerProcess],bl
    63.     jne @f
    64.     cmp word ptr [ebx + 6],850Fh    ;jnz XXXX  
    65.     jne next_opcode_
    66.     inc edi
    67.     dec ebx
    68.     jmp load_ref_
    69. @@:
    70.     cmp dx,3D80h    ;cmp byte ptr ds:[CsrServerProcess],#
    71.     jne next_opcode_
    72.     cmp byte ptr [ebx + 6],al
    73.     jne @f
    74.     cmp word ptr [ebx + 7],840Fh    ;jz XXXX
    75.     je load_ref_
    76.     jmp next_opcode_
    77. @@:
    78.     cmp byte ptr [ebx + 6],1
    79.     jne next_opcode_
    80.     cmp word ptr [ebx + 7],850Fh    ;jnz XXXX
    81.     jne next_opcode_
    82. load_ref_:
    83.     lea edx,[ebx + 13]  ;ptr callback return
    84.     add ebx,dword ptr [ebx + 9]
    85.     cmp word ptr [ebx + (6 + 7 + 14h)],15FFh        ;call dword ptr ds:[CsrServerApiRoutine]
    86.     jne error_
    87.     cmp byte ptr [ebx + (6 + 7 + 14h) + 6],0E9h
    88.     mov esi,ParseResult
    89.     jne error_
    90.     assume esi:PCSR_PARSE
    91.     mov ebx,dword ptr [ebx + (6 + 7 + 14h) + 2] ;ptr CsrServerApiRoutine
    92.     mov [esi].pCsrServerProcess,ecx
    93.     mov [esi].pCallbackReturn,edx
    94.     mov [esi].Condition,edi
    95.     mov [esi].pCsrServerApiRoutine,ebx
    96. exit_:
    97.     ret
    98. error_:
    99.     mov eax,STATUS_UNSUCCESSFUL
    100.     jmp exit_
    101. CsrParseClientCallServerRoutine endp
    102.  
    103. .data
    104. Gl_CsrParse CSR_PARSE <>
    105. CsrCallCount    ULONG ?
    106.  
    107. .code
    108. CsrServerApiRoutine proc C
    109. ; PCSR_API_MSG x 2
    110. ; Далее следует выполнить стековую маршрутизацию.
    111.     int 3
    112.     lea esp,[esp + 3*4]
    113.     inc CsrCallCount
    114.     jmp Gl_CsrParse.pCallbackReturn
    115. CsrServerApiRoutine endp
    116.  
    117. CsrRegisterCsrServerApiRoutine proc
    118.     invoke CsrParseClientCallServerRoutine, addr Gl_CsrParse
    119.     test eax,eax
    120.     jnz exit_
    121.    
    122.     mov edx,Gl_CsrParse.pCsrServerApiRoutine
    123.     mov ecx,offset CsrServerApiRoutine
    124.     lock xchg dword ptr [edx],ecx
    125.     mov Gl_CsrParse.pCsrServerApiRoutine,ecx
    126.    
    127.     mov edx,Gl_CsrParse.pCsrServerProcess
    128.     mov ecx,Gl_CsrParse.Condition
    129.     lock xchg byte ptr [edx],cl
    130.     mov Gl_CsrParse.Condition,ecx
    131.    
    132. exit_:
    133.     ret
    134. CsrRegisterCsrServerApiRoutine endp
    135.  
    136. Entry proc
    137.     invoke CsrRegisterCsrServerApiRoutine
    138.     invoke AllocConsole
    139.     ret
    140. Entry endp
    Вот есчо один:
    Код (Text):
    1. ; Получение информации для захвата CsrClientCallServer().
    2.  
    3. comment '
    4. csrss(IMAGE_SUBSYSTEM_NATIVE): CsrServerApiRoutine -> csrsrv!CsrCallServerFromServer
    5.  
    6. 00882DA3        381D D8B18E00         cmp byte ptr ds:[_CsrServerProcess],bl
    7. 00882DA9        0F85 BFDB0100         jnz ntdll_1.008A096E
    8.  
    9. 008E40FC        803D 68309400 00      cmp byte ptr ds:[943068],0
    10. 008E4103        0F84 B01BF9FF         je ntdll_1.00875CB9
    11.  
    12. 008D94FC        803D 86409300 01      cmp byte ptr ds:[934086],1
    13. 008D9503        0F85 1310FAFF         jnz ntdll_1.0087A51C
    14.  
    15. 008A096E        64:A1 18000000        mov eax,dword ptr fs:[18]
    16. 008A0974        8B48 20               mov ecx,dword ptr ds:[eax+20]
    17. 008A0977        894E 08               mov dword ptr ds:[esi+8],ecx
    18. 008A097A        8B40 24               mov eax,dword ptr ds:[eax+24]
    19. 008A097D        56                    push esi
    20. 008A097E        56                    push esi
    21. 008A097F        8946 0C               mov dword ptr ds:[esi+C],eax
    22. 008A0982        FF15 DCC98E00         call dword ptr ds:[_CsrServerApiRoutine]
    23. 008A0988        E9 4424FEFF           jmp ntdll_1.00882DD1
    24.  
    25. 0037B9E0        64:A1 18000000        mov eax,dword ptr fs:[18]
    26. 0037B9E6        8B48 20               mov ecx,dword ptr ds:[eax+20]
    27. 0037B9E9        56                    push esi
    28. 0037B9EA        894E 08               mov dword ptr ds:[esi+8],ecx
    29. 0037B9ED        8B40 24               mov eax,dword ptr ds:[eax+24]
    30. 0037B9F0        56                    push esi
    31. 0037B9F1        8946 0C               mov dword ptr ds:[esi+C],eax
    32. 0037B9F4        FF15 40F13A00         call dword ptr ds:[3AF140]
    33. 0037B9FA        E9 E1D7FEFF           jmp ntdll_1.003691E0'
    34.  
    35. CSR_PARSE struct
    36. pCsrServerProcess       PVOID ?
    37. pCsrServerApiRoutine    PVOID ?
    38. pCallbackReturn     PVOID ?
    39. Condition               BOOLEAN ?   ;Byte
    40. CSR_PARSE ends
    41. PCSR_PARSE typedef ptr CSR_PARSE
    42.  
    43. iCsrParseClientCallServerRoutine proc uses ebx esi edi pCsrClientCallServer:PVOID, ParseData:PCSR_PARSE
    44. Local InstructionSize:ULONG
    45.     mov ebx,pCsrClientCallServer
    46.     xor edi,edi
    47.     lea esi,[ebx + 100h]    ;Limit
    48. next_opcode_:
    49.     invoke LDE, ebx, addr InstructionSize
    50.     test eax,eax
    51.     jnz exit_
    52.     add ebx,InstructionSize
    53.     cmp ebx,esi
    54.     movzx edx,word ptr [ebx]
    55.     jnb error_
    56.     cmp dl,0C2h ;retn 4*4
    57.     je error_
    58.     cmp dl,0E8h ;call ZwRequestWaitReplyPort
    59.     je error_
    60.     cmp dl,05Dh ;pop ebp
    61.     je error_
    62.    
    63.     mov ecx,dword ptr [ebx + 2] ;ptr CsrServerProcess
    64.     cmp dx,1D38h    ;cmp byte ptr ds:[CsrServerProcess],bl
    65.     jne @f
    66.     cmp word ptr [ebx + 6],850Fh    ;jnz XXXX  
    67.     jne next_opcode_
    68.     inc edi
    69.     dec ebx
    70.     jmp load_ref_
    71. @@:
    72.     cmp dx,3D80h    ;cmp byte ptr ds:[CsrServerProcess],#
    73.     jne next_opcode_
    74.     cmp byte ptr [ebx + 6],al
    75.     jne @f
    76.     cmp word ptr [ebx + 7],840Fh    ;jz XXXX
    77.     je load_ref_
    78.     jmp next_opcode_
    79. @@:
    80.     cmp byte ptr [ebx + 6],1
    81.     jne next_opcode_
    82.     cmp word ptr [ebx + 7],850Fh    ;jnz XXXX
    83.     jne next_opcode_
    84. load_ref_:
    85.     lea edx,[ebx + 13]  ;ptr callback return
    86.     add ebx,dword ptr [ebx + 9]
    87.     cmp word ptr [ebx + (6 + 7 + 14h)],15FFh        ;call dword ptr ds:[CsrServerApiRoutine]
    88.     jne error_
    89.     cmp byte ptr [ebx + (6 + 7 + 14h) + 6],0E9h
    90.     mov esi,ParseData
    91.     jne error_
    92.     assume esi:PCSR_PARSE
    93.     mov ebx,dword ptr [ebx + (6 + 7 + 14h) + 2] ;ptr CsrServerApiRoutine
    94.     mov [esi].pCsrServerProcess,ecx
    95.     mov [esi].pCallbackReturn,edx
    96.     mov [esi].Condition,edi
    97.     mov [esi].pCsrServerApiRoutine,ebx
    98. exit_:
    99.     ret
    100. error_:
    101.     mov eax,STATUS_UNSUCCESSFUL
    102.     jmp exit_
    103. iCsrParseClientCallServerRoutine endp
    104.  
    105. ; Захват CsrClientCallServer() посредством регистрации CsrServerApiRoutine.
    106.  
    107. iIcpRegisterCsrServerApiRoutine proc pCsrClientCallServer:PVOID, ParseData:PCSR_PARSE, CsrServerApiRoutine:PVOID
    108. Local LocalParseData:CSR_PARSE
    109.     invoke iCsrParseClientCallServerRoutine, pCsrClientCallServer, addr LocalParseData
    110.     .if !Eax
    111.     push LocalParseData.pCsrServerProcess
    112.     push LocalParseData.pCsrServerApiRoutine
    113.     push LocalParseData.pCallbackReturn
    114.     push LocalParseData.Condition
    115.    
    116.     mov edx,LocalParseData.pCsrServerApiRoutine
    117.     mov ecx,CsrServerApiRoutine
    118.     lock xchg dword ptr [edx],ecx
    119.     mov LocalParseData.pCsrServerApiRoutine,ecx
    120.    
    121.     mov edx,LocalParseData.pCsrServerProcess
    122.     mov ecx,LocalParseData.Condition
    123.     lock xchg byte ptr [edx],cl
    124.     mov LocalParseData.Condition,ecx
    125.    
    126.     mov edx,ParseData
    127.     assume edx:PCSR_PARSE
    128.     pop [edx].Condition
    129.     pop [edx].pCallbackReturn
    130.     pop [edx].pCsrServerApiRoutine
    131.     pop [edx].pCsrServerProcess
    132.     .endif
    133.     ret
    134. iIcpRegisterCsrServerApiRoutine endp
    Это нужно пересмотреть, я часто этот колбек использую(например для защиты стека), но другим способом(анализ графа).

    Так как чтото кидает сепшин. Нужно заюзать отладчик, иначе дело гиблое.
     
  7. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    gaeprust
    спасибо, Инди )))
    уже ковыряюсь в отладчике