Проблема с глобальным хуком

Тема в разделе "WASM.WIN32", создана пользователем cembo, 27 авг 2007.

  1. cembo

    cembo New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    17
    Значит делаю я хук на ZwCreateThread и на ZwResumeThread . Чтобы зараженний процес заразил все процесси, которые сам создавает, кароче глобальный хук получается. Всё очень хорошо работает. Но иногда (довольно часто) дочерный процесс незапускается полностю, хотя заразился правильно. Креш происходит на любую команду резервирования памяти типа malloc. Но как я уже сказал, иногда резервирование памяти происходит нормально и креша нету. Более часто креш проишодит при первом запуске дочерной программы, но ето не всегда так. Вчера весь день проводил в пойски проблемы, так и ненашёл.

    Код (Text):
    1. NewZwCreateThread proc ThreadHandle, DesiredAccess, ObjectAttributes, ProcessHandle, ClientId, ThreadContext, UserStack, CreateSuspended: dword
    2.  
    3.     push TRUE
    4.     push UserStack
    5.     push ThreadContext
    6.     push ClientId
    7.     push ProcessHandle
    8.     push ObjectAttributes
    9.     push DesiredAccess
    10.     push ThreadHandle
    11.     call OldAdrZwCreateThread
    12.    
    13.     pushad
    14.    
    15.     InstSehFrame <offset NewZwCreateThreadEnd>
    16.    
    17.     mov eax, ClientId
    18.    
    19.     test eax, eax
    20.     je NewZwCreateThreadEnd
    21.    
    22.     assume eax: PTR CLIENTID
    23.     mov eax, [eax].UniqueProcess
    24.    
    25.     .if eax != CurrProcId
    26.         mov NewProcess, TRUE
    27.     .endif
    28.    
    29.     .if CreateSuspended == FALSE
    30.         invoke ResumeThread, dword ptr ThreadHandle
    31.     .endif
    32.    
    33.  
    34. NewZwCreateThreadEnd:
    35.     KillSehFrame
    36.     popad
    37.     ret
    38. NewZwCreateThread endp
    Код (Text):
    1. NewZwResumeThread proc ThreadHandle, PreviousSuspendCount: dword
    2.  
    3.     LOCAL   ThreadInfo: THREAD_BASIC_INFORMATION
    4.     LOCAL   Handle:dword
    5.    
    6.     InstSehFrame <offset NewZwResumeThreadEnd>
    7.    
    8.     .if InjectInProgress == FALSE
    9.        
    10.         push NULL
    11.         push SIZEOF THREAD_BASIC_INFORMATION
    12.         lea eax, ThreadInfo
    13.         push eax
    14.         push 0
    15.         push ThreadHandle
    16.         call ZwQueryInformationThread
    17.        
    18.         mov eax, ThreadInfo.ClientId.UniqueProcess
    19.        
    20.         .if eax != CurrProcId
    21.            
    22.             .if NewProcess == TRUE
    23.            
    24.             mov InjectInProgress, TRUE
    25.            
    26.             invoke OpenProcess, PROCESS_CREATE_THREAD or PROCESS_VM_WRITE or PROCESS_VM_OPERATION, FALSE, ThreadInfo.ClientId.UniqueProcess
    27.             mov Handle, eax
    28.            
    29.             invoke InjectDll, Handle, $CTA0("C:\\Splicing.dll")
    30.            
    31.             invoke CloseHandle, Handle
    32.             mov NewProcess, FALSE
    33.            
    34.             mov InjectInProgress, FALSE
    35.            
    36.             .endif
    37.            
    38.         .endif
    39.        
    40.     .endif
    41.    
    42. NewZwResumeThreadEnd:  
    43.     KillSehFrame
    44.    
    45.     push PreviousSuspendCount
    46.     push ThreadHandle
    47.     call OldAdrZwResumeThread
    48.    
    49.     ret
    50. NewZwResumeThread endp
    Код (Text):
    1. InjectDll proc Process, ModulePath: dword
    2.  
    3.     LOCAL Memory, Code, BytesWritten, ThreadId, hThread, hKernel32: dword
    4.     LOCAL Inject: InjectStruct
    5.    
    6.     InstSehFrame    <offset InjectDllEnd>
    7.    
    8.     invoke VirtualAllocEx, Process, NULL, SIZEOF InjectStruct, MEM_RESERVE or MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE
    9.     mov Memory, eax
    10.    
    11.     test eax, eax
    12.     je InjectDllEnd
    13.    
    14.     push dword ptr [Memory]
    15.     pop Code
    16.    
    17.     mov Inject.PushCommand, 68h
    18.    
    19.     push Code
    20.     pop Inject.PushArgument
    21.     add Inject.PushArgument, 1Eh
    22.    
    23.     mov Inject.CallCommand, 15FFh
    24.    
    25.     push Code
    26.     pop Inject.CallAddr
    27.     add Inject.CallAddr, 16h
    28.    
    29.     mov Inject.PushExitThread, 68h
    30.     mov Inject.ExitThreadArg, 0h
    31.     mov Inject.CallExitThread, 15FFh
    32.    
    33.     push Code
    34.     pop Inject.CallExitThreadAddr
    35.     add Inject.CallExitThreadAddr, 1Ah
    36.    
    37.     invoke GetModuleHandle, $CTA0("kernel32.dll")
    38.     mov hKernel32, eax
    39.    
    40.     invoke GetProcAddress, hKernel32, $CTA0("LoadLibraryA")
    41.     mov Inject.AddrLoadLibrary, eax
    42.    
    43.     invoke GetProcAddress, hKernel32, $CTA0("ExitThread")
    44.     mov Inject.AddrExitThread, eax
    45.    
    46.     invoke lstrcpy, addr Inject.LibraryName, ModulePath
    47.     invoke WriteProcessMemory, Process, Memory, addr Inject, SIZEOF Inject, addr BytesWritten
    48.     invoke CreateRemoteThread, Process, NULL, 0, Memory, NULL, 0, addr ThreadId
    49.     cmp hThread, 0
    50.     je InjectDllEnd
    51.    
    52.     invoke WaitForSingleObject, hThread, INFINITE
    53.     invoke CloseHandle, hThread
    54.    
    55.     invoke VirtualFreeEx, Process, Memory, SIZEOF InjectStruct, MEM_RELEASE
    56.  
    57. InjectDllEnd:
    58.     KillSehFrame
    59.     ret
    60. InjectDll endp
    сам хук делается через сплайсинг с копированием первых байтов функции.

    Если неделать CreateRemoteThread, то креш непроисходит, но тогда и библиотека не загружается. В DLLEntry я останавливаю все треды, ставлю хук, и восстанавливаю тредов.

    Надеюсь, что кто то сможет помочь. Спасибо за внимание.
     
  2. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    cembo
    покажи DLLEntry.
    Скорее всего там где то засада. В отладчике если что глянь.
    DLLEntry - стартует вообще?
     
  3. cembo

    cembo New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    17
    Стартовать стартует, и нормально срабатывает, но потом прога падает.

    Забыл один важний факт: Даже такой дллмаин вызывает тот же самий глюк:

    Код (Text):
    1. DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
    2.     mov  eax,TRUE
    3.     ret
    4. DllEntry Endp
    А такой, походу нет:

    Код (Text):
    1. DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
    2.     .if reason==DLL_PROCESS_ATTACH
    3.         invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK
    4.     .elseif reason==DLL_PROCESS_DETACH
    5.         ;invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK
    6.     .elseif reason==DLL_THREAD_ATTACH
    7.     ;   invoke MessageBox,NULL,addr ThreadCreated,addr AppName,MB_OK
    8.     .else        ; DLL_THREAD_DETACH
    9.     ;   invoke MessageBox,NULL,addr ThreadDestroyed,addr AppName,MB_OK
    10.     .endif
    11.     mov  eax,TRUE
    12.     ret
    13. DllEntry Endp
     
  4. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    cembo
    что то не вижу разницы О.о

    а такое глюк вызывает?
    Код (Text):
    1. DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
    2.            invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK
    3.     mov  eax,TRUE
    4.     ret
    5. DllEntry Endp
     
  5. cembo

    cembo New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    17
    Нет, не вызывает. Помоему ето связано с тем, что изза мессаджбокса DLLMain незаканчивается слишком быстро. Настоящий ZwResumeThread вызывается после инжекта. Возможно прожке ненравится когда дллмаин заканчивается перед тем, как главний тред проги запускается? Возможно изза етого прога думает, что дллка вовсе неподгрузилась и пробует использовать память занятую дллкой? Хз, я просто гадаю.

    Поставил запуск настоящего ZwResumeThread перед инжектом: ничего неизменилось