Значит делаю я хук на ZwCreateThread и на ZwResumeThread . Чтобы зараженний процес заразил все процесси, которые сам создавает, кароче глобальный хук получается. Всё очень хорошо работает. Но иногда (довольно часто) дочерный процесс незапускается полностю, хотя заразился правильно. Креш происходит на любую команду резервирования памяти типа malloc. Но как я уже сказал, иногда резервирование памяти происходит нормально и креша нету. Более часто креш проишодит при первом запуске дочерной программы, но ето не всегда так. Вчера весь день проводил в пойски проблемы, так и ненашёл. Код (Text): NewZwCreateThread proc ThreadHandle, DesiredAccess, ObjectAttributes, ProcessHandle, ClientId, ThreadContext, UserStack, CreateSuspended: dword push TRUE push UserStack push ThreadContext push ClientId push ProcessHandle push ObjectAttributes push DesiredAccess push ThreadHandle call OldAdrZwCreateThread pushad InstSehFrame <offset NewZwCreateThreadEnd> mov eax, ClientId test eax, eax je NewZwCreateThreadEnd assume eax: PTR CLIENTID mov eax, [eax].UniqueProcess .if eax != CurrProcId mov NewProcess, TRUE .endif .if CreateSuspended == FALSE invoke ResumeThread, dword ptr ThreadHandle .endif NewZwCreateThreadEnd: KillSehFrame popad ret NewZwCreateThread endp Код (Text): NewZwResumeThread proc ThreadHandle, PreviousSuspendCount: dword LOCAL ThreadInfo: THREAD_BASIC_INFORMATION LOCAL Handle:dword InstSehFrame <offset NewZwResumeThreadEnd> .if InjectInProgress == FALSE push NULL push SIZEOF THREAD_BASIC_INFORMATION lea eax, ThreadInfo push eax push 0 push ThreadHandle call ZwQueryInformationThread mov eax, ThreadInfo.ClientId.UniqueProcess .if eax != CurrProcId .if NewProcess == TRUE mov InjectInProgress, TRUE invoke OpenProcess, PROCESS_CREATE_THREAD or PROCESS_VM_WRITE or PROCESS_VM_OPERATION, FALSE, ThreadInfo.ClientId.UniqueProcess mov Handle, eax invoke InjectDll, Handle, $CTA0("C:\\Splicing.dll") invoke CloseHandle, Handle mov NewProcess, FALSE mov InjectInProgress, FALSE .endif .endif .endif NewZwResumeThreadEnd: KillSehFrame push PreviousSuspendCount push ThreadHandle call OldAdrZwResumeThread ret NewZwResumeThread endp Код (Text): InjectDll proc Process, ModulePath: dword LOCAL Memory, Code, BytesWritten, ThreadId, hThread, hKernel32: dword LOCAL Inject: InjectStruct InstSehFrame <offset InjectDllEnd> invoke VirtualAllocEx, Process, NULL, SIZEOF InjectStruct, MEM_RESERVE or MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE mov Memory, eax test eax, eax je InjectDllEnd push dword ptr [Memory] pop Code mov Inject.PushCommand, 68h push Code pop Inject.PushArgument add Inject.PushArgument, 1Eh mov Inject.CallCommand, 15FFh push Code pop Inject.CallAddr add Inject.CallAddr, 16h mov Inject.PushExitThread, 68h mov Inject.ExitThreadArg, 0h mov Inject.CallExitThread, 15FFh push Code pop Inject.CallExitThreadAddr add Inject.CallExitThreadAddr, 1Ah invoke GetModuleHandle, $CTA0("kernel32.dll") mov hKernel32, eax invoke GetProcAddress, hKernel32, $CTA0("LoadLibraryA") mov Inject.AddrLoadLibrary, eax invoke GetProcAddress, hKernel32, $CTA0("ExitThread") mov Inject.AddrExitThread, eax invoke lstrcpy, addr Inject.LibraryName, ModulePath invoke WriteProcessMemory, Process, Memory, addr Inject, SIZEOF Inject, addr BytesWritten invoke CreateRemoteThread, Process, NULL, 0, Memory, NULL, 0, addr ThreadId cmp hThread, 0 je InjectDllEnd invoke WaitForSingleObject, hThread, INFINITE invoke CloseHandle, hThread invoke VirtualFreeEx, Process, Memory, SIZEOF InjectStruct, MEM_RELEASE InjectDllEnd: KillSehFrame ret InjectDll endp сам хук делается через сплайсинг с копированием первых байтов функции. Если неделать CreateRemoteThread, то креш непроисходит, но тогда и библиотека не загружается. В DLLEntry я останавливаю все треды, ставлю хук, и восстанавливаю тредов. Надеюсь, что кто то сможет помочь. Спасибо за внимание.
cembo покажи DLLEntry. Скорее всего там где то засада. В отладчике если что глянь. DLLEntry - стартует вообще?
Стартовать стартует, и нормально срабатывает, но потом прога падает. Забыл один важний факт: Даже такой дллмаин вызывает тот же самий глюк: Код (Text): DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD mov eax,TRUE ret DllEntry Endp А такой, походу нет: Код (Text): DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD .if reason==DLL_PROCESS_ATTACH invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK .elseif reason==DLL_PROCESS_DETACH ;invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK .elseif reason==DLL_THREAD_ATTACH ; invoke MessageBox,NULL,addr ThreadCreated,addr AppName,MB_OK .else ; DLL_THREAD_DETACH ; invoke MessageBox,NULL,addr ThreadDestroyed,addr AppName,MB_OK .endif mov eax,TRUE ret DllEntry Endp
cembo что то не вижу разницы О.о а такое глюк вызывает? Код (Text): DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK mov eax,TRUE ret DllEntry Endp
Нет, не вызывает. Помоему ето связано с тем, что изза мессаджбокса DLLMain незаканчивается слишком быстро. Настоящий ZwResumeThread вызывается после инжекта. Возможно прожке ненравится когда дллмаин заканчивается перед тем, как главний тред проги запускается? Возможно изза етого прога думает, что дллка вовсе неподгрузилась и пробует использовать память занятую дллкой? Хз, я просто гадаю. Поставил запуск настоящего ZwResumeThread перед инжектом: ничего неизменилось