Экспериментирую с инжектом сторонней dll в explorer.exe Windows 7, для инжекта использую патч в CsrClientCallServer. DLL сплайсит одну функцию в ntdll.dll в текущем процессе. При инжекте explorer перезагружается. Если инжект делать для мелких процессов типа calc.exe или если dll "пустая" (т.е. не несет какой-то нагрузки), то инжект проходит без проблем, но интересует все-таки сам эксплорер. Аналогичный "стандартный" инжект такой же dll в XP проходит без проблем. Кто-нибудь сталкивался с такой проблемой?
1. разрядность совпадает? (explorer x32 и dll32) 2. в импорте длл нет чего нить экзотического, чего explorer не юзает? 3. "не несет полезной нагрузки" - гадание на хз чём имхо...
отладчик религия запрещает запускать А по делу, сначала подключи отладчик, потом в начале Payload поставь 0xCC и отлаживай себе на здоровье!
Патч это негодная технология. Там же колбек есть CsrServerApiRoutine, достаточно его зарегать и сделать вид, что текущий процесс серверный, изменив переменную CsrServerProcess(именно инверсия значения!). После оных манипуляций управление будет получать колбек, из него нужно выполнить откат - почистить всё за собой и вернуть управление на инструкцию, следующую за проверкой переменной CsrServerProcess(следующая Jcc, нужно изменить условие, либо на следующую за ней. Это потребует динамический дизасм кода). Либо откатать функцию полностью(тоесть почистить стек, восстановить RGP) и вызвать её повторно со сброшенным флагом CsrServerProcess. Идеально подходит морфинг её - функа переносится в буфер, при этом изменяется условное ветвление или ссылка на CsrServerProcess. Это в идеале, разумеется проще отжать смещение и на Ip'' возвращаться. Вот нашёл у себя код(из модуля конфигурации Stpt без LDE): Код (Text): OP_ESC_2B equ 0FH ; + ; Двухпроходовый сигнатурный поиск шлюза. ; ; CsrClientCallServer: ; cmp byte ptr ds:[_CsrServerProcess],bl ; jnz XXXX ; ... ; XXXX: ; ApiMessage->Header.ClientId = NtCurrentTeb()->ClientId; ; Status = CsrServerApiRoutine(&ApiMessage->Header, &ApiMessage->Header); ; $ 64:A1 18000000 mov eax,dword ptr fs:[18] ; PTEB ; $+6 8B48 20 mov ecx,dword ptr ds:[eax+20] ; TID ; $+9 894E 08 mov dword ptr ds:[esi+8],ecx ; $+C 8B40 24 mov eax,dword ptr ds:[eax+24] ; PID ; $+F 56 push esi ; $+10 56 push esi ; PPORT_MESSAGE ; $+11 8946 0C mov dword ptr ds:[esi+C],eax ; typedef NTSTATUS ; (NTAPI *PCSR_SERVER_API_ROUTINE)(IN PPORT_MESSAGE Request, IN PPORT_MESSAGE Reply); ; PCSR_SERVER_API_ROUTINE CsrServerApiRoutine; ; $+14 FF15 DCC9977C call dword ptr ds:[_CsrServerApiRoutine] ; ... ; - ; o Eax: @Call [CsrServerApiRoutine] ; o Ecx: @CsrServerApiRoutine ; Edx: @Back IP ; QueryGate proc Local Stub:PVOID Local SizeOfCode:ULONG mov eax,fs:[TEB.Peb] mov eax,PEB.Ldr[eax] mov eax,PEB_LDR_DATA.InLoadOrderModuleList.Flink[eax] mov eax,LDR_DATA_TABLE_ENTRY.InLoadOrderModuleList.Flink[eax] mov edx,LDR_DATA_TABLE_ENTRY.DllBase[eax] ; ntdll.dll mov eax,IMAGE_DOS_HEADER.e_lfanew[edx] mov ecx,IMAGE_NT_HEADERS.OptionalHeader.SizeOfCode[edx + eax] add edx,IMAGE_NT_HEADERS.OptionalHeader.BaseOfCode[edx + eax] mov SizeOfCode,ecx mov eax,edx sub ecx,8*4 ; 64 A1 18 00 00 00 8B 48 20 89 4E 08 8B 40 24 56 56 89 46 0C FF 15 Scan: cmp dword ptr [eax],0018A164H je @f Step: inc eax loop Scan jmp Error @@: cmp dword ptr [eax + 4],488B0000H jne Step cmp dword ptr [eax + 2*4],084E8920H jne Step cmp dword ptr [eax + 3*4],5624408BH jne Step cmp dword ptr [eax + 4*4],0C468956H jne Step cmp word ptr [eax + 5*4],15FFH jne Step comment ' mov Stub,eax mov ecx,SizeOfCode sub eax,edx sub ecx,6 sub eax,4 Scan2nd: cmp dword ptr [edx],eax je @f Step2nd: dec eax inc edx loop Scan2nd jmp Error @@: cmp byte ptr [edx - 2],OP_ESC_2B jne Step2nd cmp byte ptr [edx - 1],85H ; Jne je @f cmp byte ptr [edx - 1],84H ; Je jne Step2nd mov eax,Stub add edx,4 ' add eax,14H Exit: mov ecx,dword ptr [eax + 2] ; @CsrServerApiRoutine ret Error: xor eax,eax jmp Exit QueryGate endp Это какойто древний семпл, видимо делает то что вам нужно(не знаю на сколько корректно): Код (Text): comment ' csrss(IMAGE_SUBSYSTEM_NATIVE): CsrServerApiRoutine -> csrsrv!CsrCallServerFromServer 00882DA3 381D D8B18E00 cmp byte ptr ds:[_CsrServerProcess],bl 00882DA9 0F85 BFDB0100 jnz ntdll_1.008A096E 008E40FC 803D 68309400 00 cmp byte ptr ds:[943068],0 008E4103 0F84 B01BF9FF je ntdll_1.00875CB9 008D94FC 803D 86409300 01 cmp byte ptr ds:[934086],1 008D9503 0F85 1310FAFF jnz ntdll_1.0087A51C 008A096E 64:A1 18000000 mov eax,dword ptr fs:[18] 008A0974 8B48 20 mov ecx,dword ptr ds:[eax+20] 008A0977 894E 08 mov dword ptr ds:[esi+8],ecx 008A097A 8B40 24 mov eax,dword ptr ds:[eax+24] 008A097D 56 push esi 008A097E 56 push esi 008A097F 8946 0C mov dword ptr ds:[esi+C],eax 008A0982 FF15 DCC98E00 call dword ptr ds:[_CsrServerApiRoutine] 008A0988 E9 4424FEFF jmp ntdll_1.00882DD1 0037B9E0 64:A1 18000000 mov eax,dword ptr fs:[18] 0037B9E6 8B48 20 mov ecx,dword ptr ds:[eax+20] 0037B9E9 56 push esi 0037B9EA 894E 08 mov dword ptr ds:[esi+8],ecx 0037B9ED 8B40 24 mov eax,dword ptr ds:[eax+24] 0037B9F0 56 push esi 0037B9F1 8946 0C mov dword ptr ds:[esi+C],eax 0037B9F4 FF15 40F13A00 call dword ptr ds:[3AF140] 0037B9FA E9 E1D7FEFF jmp ntdll_1.003691E0' CSR_PARSE struct pCsrServerProcess PVOID ? pCsrServerApiRoutine PVOID ? pCallbackReturn PVOID ? Condition BOOLEAN ? ;Byte CSR_PARSE ends PCSR_PARSE typedef ptr CSR_PARSE CsrParseClientCallServerRoutine proc uses ebx esi edi ParseResult:PCSR_PARSE Local InstructionSize:ULONG mov ebx,dword ptr [_imp__CsrClientCallServer] xor edi,edi lea esi,[ebx + 100h] ;Limit next_opcode_: invoke LDE, Ebx, addr InstructionSize test eax,eax jnz exit_ add ebx,InstructionSize cmp ebx,esi movzx edx,word ptr [ebx] jnb error_ cmp dl,0C2h ;retn 4*4 je error_ cmp dl,0E8h ;call ZwRequestWaitReplyPort je error_ cmp dl,05Dh ;pop ebp je error_ mov ecx,dword ptr [ebx + 2] ;ptr CsrServerProcess cmp dx,1D38h ;cmp byte ptr ds:[CsrServerProcess],bl jne @f cmp word ptr [ebx + 6],850Fh ;jnz XXXX jne next_opcode_ inc edi dec ebx jmp load_ref_ @@: cmp dx,3D80h ;cmp byte ptr ds:[CsrServerProcess],# jne next_opcode_ cmp byte ptr [ebx + 6],al jne @f cmp word ptr [ebx + 7],840Fh ;jz XXXX je load_ref_ jmp next_opcode_ @@: cmp byte ptr [ebx + 6],1 jne next_opcode_ cmp word ptr [ebx + 7],850Fh ;jnz XXXX jne next_opcode_ load_ref_: lea edx,[ebx + 13] ;ptr callback return add ebx,dword ptr [ebx + 9] cmp word ptr [ebx + (6 + 7 + 14h)],15FFh ;call dword ptr ds:[CsrServerApiRoutine] jne error_ cmp byte ptr [ebx + (6 + 7 + 14h) + 6],0E9h mov esi,ParseResult jne error_ assume esi:PCSR_PARSE mov ebx,dword ptr [ebx + (6 + 7 + 14h) + 2] ;ptr CsrServerApiRoutine mov [esi].pCsrServerProcess,ecx mov [esi].pCallbackReturn,edx mov [esi].Condition,edi mov [esi].pCsrServerApiRoutine,ebx exit_: ret error_: mov eax,STATUS_UNSUCCESSFUL jmp exit_ CsrParseClientCallServerRoutine endp .data Gl_CsrParse CSR_PARSE <> CsrCallCount ULONG ? .code CsrServerApiRoutine proc C ; PCSR_API_MSG x 2 ; Далее следует выполнить стековую маршрутизацию. int 3 lea esp,[esp + 3*4] inc CsrCallCount jmp Gl_CsrParse.pCallbackReturn CsrServerApiRoutine endp CsrRegisterCsrServerApiRoutine proc invoke CsrParseClientCallServerRoutine, addr Gl_CsrParse test eax,eax jnz exit_ mov edx,Gl_CsrParse.pCsrServerApiRoutine mov ecx,offset CsrServerApiRoutine lock xchg dword ptr [edx],ecx mov Gl_CsrParse.pCsrServerApiRoutine,ecx mov edx,Gl_CsrParse.pCsrServerProcess mov ecx,Gl_CsrParse.Condition lock xchg byte ptr [edx],cl mov Gl_CsrParse.Condition,ecx exit_: ret CsrRegisterCsrServerApiRoutine endp Entry proc invoke CsrRegisterCsrServerApiRoutine invoke AllocConsole ret Entry endp Вот есчо один: Код (Text): ; Получение информации для захвата CsrClientCallServer(). comment ' csrss(IMAGE_SUBSYSTEM_NATIVE): CsrServerApiRoutine -> csrsrv!CsrCallServerFromServer 00882DA3 381D D8B18E00 cmp byte ptr ds:[_CsrServerProcess],bl 00882DA9 0F85 BFDB0100 jnz ntdll_1.008A096E 008E40FC 803D 68309400 00 cmp byte ptr ds:[943068],0 008E4103 0F84 B01BF9FF je ntdll_1.00875CB9 008D94FC 803D 86409300 01 cmp byte ptr ds:[934086],1 008D9503 0F85 1310FAFF jnz ntdll_1.0087A51C 008A096E 64:A1 18000000 mov eax,dword ptr fs:[18] 008A0974 8B48 20 mov ecx,dword ptr ds:[eax+20] 008A0977 894E 08 mov dword ptr ds:[esi+8],ecx 008A097A 8B40 24 mov eax,dword ptr ds:[eax+24] 008A097D 56 push esi 008A097E 56 push esi 008A097F 8946 0C mov dword ptr ds:[esi+C],eax 008A0982 FF15 DCC98E00 call dword ptr ds:[_CsrServerApiRoutine] 008A0988 E9 4424FEFF jmp ntdll_1.00882DD1 0037B9E0 64:A1 18000000 mov eax,dword ptr fs:[18] 0037B9E6 8B48 20 mov ecx,dword ptr ds:[eax+20] 0037B9E9 56 push esi 0037B9EA 894E 08 mov dword ptr ds:[esi+8],ecx 0037B9ED 8B40 24 mov eax,dword ptr ds:[eax+24] 0037B9F0 56 push esi 0037B9F1 8946 0C mov dword ptr ds:[esi+C],eax 0037B9F4 FF15 40F13A00 call dword ptr ds:[3AF140] 0037B9FA E9 E1D7FEFF jmp ntdll_1.003691E0' CSR_PARSE struct pCsrServerProcess PVOID ? pCsrServerApiRoutine PVOID ? pCallbackReturn PVOID ? Condition BOOLEAN ? ;Byte CSR_PARSE ends PCSR_PARSE typedef ptr CSR_PARSE iCsrParseClientCallServerRoutine proc uses ebx esi edi pCsrClientCallServer:PVOID, ParseData:PCSR_PARSE Local InstructionSize:ULONG mov ebx,pCsrClientCallServer xor edi,edi lea esi,[ebx + 100h] ;Limit next_opcode_: invoke LDE, ebx, addr InstructionSize test eax,eax jnz exit_ add ebx,InstructionSize cmp ebx,esi movzx edx,word ptr [ebx] jnb error_ cmp dl,0C2h ;retn 4*4 je error_ cmp dl,0E8h ;call ZwRequestWaitReplyPort je error_ cmp dl,05Dh ;pop ebp je error_ mov ecx,dword ptr [ebx + 2] ;ptr CsrServerProcess cmp dx,1D38h ;cmp byte ptr ds:[CsrServerProcess],bl jne @f cmp word ptr [ebx + 6],850Fh ;jnz XXXX jne next_opcode_ inc edi dec ebx jmp load_ref_ @@: cmp dx,3D80h ;cmp byte ptr ds:[CsrServerProcess],# jne next_opcode_ cmp byte ptr [ebx + 6],al jne @f cmp word ptr [ebx + 7],840Fh ;jz XXXX je load_ref_ jmp next_opcode_ @@: cmp byte ptr [ebx + 6],1 jne next_opcode_ cmp word ptr [ebx + 7],850Fh ;jnz XXXX jne next_opcode_ load_ref_: lea edx,[ebx + 13] ;ptr callback return add ebx,dword ptr [ebx + 9] cmp word ptr [ebx + (6 + 7 + 14h)],15FFh ;call dword ptr ds:[CsrServerApiRoutine] jne error_ cmp byte ptr [ebx + (6 + 7 + 14h) + 6],0E9h mov esi,ParseData jne error_ assume esi:PCSR_PARSE mov ebx,dword ptr [ebx + (6 + 7 + 14h) + 2] ;ptr CsrServerApiRoutine mov [esi].pCsrServerProcess,ecx mov [esi].pCallbackReturn,edx mov [esi].Condition,edi mov [esi].pCsrServerApiRoutine,ebx exit_: ret error_: mov eax,STATUS_UNSUCCESSFUL jmp exit_ iCsrParseClientCallServerRoutine endp ; Захват CsrClientCallServer() посредством регистрации CsrServerApiRoutine. iIcpRegisterCsrServerApiRoutine proc pCsrClientCallServer:PVOID, ParseData:PCSR_PARSE, CsrServerApiRoutine:PVOID Local LocalParseData:CSR_PARSE invoke iCsrParseClientCallServerRoutine, pCsrClientCallServer, addr LocalParseData .if !Eax push LocalParseData.pCsrServerProcess push LocalParseData.pCsrServerApiRoutine push LocalParseData.pCallbackReturn push LocalParseData.Condition mov edx,LocalParseData.pCsrServerApiRoutine mov ecx,CsrServerApiRoutine lock xchg dword ptr [edx],ecx mov LocalParseData.pCsrServerApiRoutine,ecx mov edx,LocalParseData.pCsrServerProcess mov ecx,LocalParseData.Condition lock xchg byte ptr [edx],cl mov LocalParseData.Condition,ecx mov edx,ParseData assume edx:PCSR_PARSE pop [edx].Condition pop [edx].pCallbackReturn pop [edx].pCsrServerApiRoutine pop [edx].pCsrServerProcess .endif ret iIcpRegisterCsrServerApiRoutine endp Это нужно пересмотреть, я часто этот колбек использую(например для защиты стека), но другим способом(анализ графа). Так как чтото кидает сепшин. Нужно заюзать отладчик, иначе дело гиблое.