CreateRemoteThread & smss.exe

Тема в разделе "WASM.WIN32", создана пользователем asgard, 12 июл 2005.

  1. asgard

    asgard New Member

    Публикаций:
    0
    Регистрация:
    12 июн 2005
    Сообщения:
    7
    Адрес:
    St. Pitersburg, Russia
    Здравствуйте ALL.

    Мне нужно загрузить DLL в пространство smss.

    Но CreateRemoteThread ругается error code 8.

    Вроде как нет памяти.

    Помогите пожалуйста.
     
  2. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    ты память выделил в smss под код , который будет работать в потоке?
     
  3. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    я пытался туда dll внедрять... Плохо сказывается на работе системы. Странно, но все системные процессы шутки не поняли. Winlogon вообще до синего экрана доводит. Может они контролируют свою целостность? Либо внедряемый код затирает память...
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    SnugForce



    Простите, а до этого вы хоть единожды успешно внедряли DLL в любой другой процесс?





    Код в студию.
     
  5. asgard

    asgard New Member

    Публикаций:
    0
    Регистрация:
    12 июн 2005
    Сообщения:
    7
    Адрес:
    St. Pitersburg, Russia
    to stainer

    дык память под код вроде и не надо было. Я просто пытался

    вызвать LdrLoadDLL указав ее в качестве точки входа. Правда здес я исходил из того что ntdll мапится в одни и теже адреса как kernel32.dll. Результат error code 8. Через ZwCreateThread вроде все нормально - нить запускается (но пока только убивает smss ;) интересно что винда после этого остается живой только новые сессии не запускает). По поводу CreateRemoteThread я думаю здесь какая то хрень с WIN32 подсистемой, наверняка она не только нить в чужом процессе создает но и еще чего то в crss (как следствие CreateRemoteThread работает в одной сессии), а smss он чиста нативный процесс причем еще и не принадлежащий ни одной сессии (судя по EPROCESS), хотя ТМ кажет его в 0ой. Но это всё мои догадки. Честно говоря с виндой у меня опыт очень небольшиой я недавно на неё с линукса переполз.

    to ALL

    Еще вопрос 2 вопроса:

    1. Каким образом корректно завершить нить созданную через ZwCreateThread в чужом процессе. Т.е. куда должен указывать последний return в стеке или система сама об этом думает?

    2. Как узнать адреса интересующих меня процедур в ntdll в удаленном процессе. (например smss;)
     
  6. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    слушай ну чего тут разговаривать - то запости код и посмотрим



    мне кажется что ты забыл записать в память удалённого процесса имя dll которую ты собираешься грузить



    адреса ntdll всегда одни и теже в пределах build операционной системы ( проще говоря в пределах сервиспака )
     
  7. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Quantum

    Все по Рихтеру, только в delphi. К большинству процессов dll внедрялась успешно. Я там на точку входа в dll поставил MessageBox. Вот боюсь еще, что dll на delphi не надо было писать.
     
  8. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    большой разницы нет , на чём писать

    у меня и на дельфи всё работало , посмотри код у ms-rem

    и статью почитай, может упустил что



    ещё попробуй поставить faults on в сфтайсе , нет ли там чего , и попробуй не импортировать в длл ничего кроме

    exitprocess, хотя в дельфи по моему sysallocstring автоматом импортируется, а это тянет за собой user32 и тд
     
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    asgard Видимо это из-за отсутствия kernel32.dll в пространстве smss.exe, вот такой из него код должен создавать поток
    Код (Text):
    1. 793A9824   33ED                   XOR     EBP,EBP
    2. 793A9826   53                     PUSH    EBX
    3. 793A9827   50                     PUSH    EAX
    4. 793A9828   6A 00                  PUSH    0
    5. 793A982A   55                     PUSH    EBP
    6. 793A982B   8BEC                   MOV     EBP,ESP
    7. 793A982D   6A FF                  PUSH    -1
    8. 793A982F   68 60D33A79            PUSH    793AD360
    9. 793A9834   68 B4F03B79            PUSH    793BF0B4
    10. 793A9839   64:A1 00000000         MOV     EAX,FS:[0]
    11. 793A983F   50                     PUSH    EAX
    12. 793A9840   64:8925 00000000       MOV     FS:[0],ESP
    13. 793A9847   51                     PUSH    ECX
    14. 793A9848   51                     PUSH    ECX
    15. 793A9849   51                     PUSH    ECX
    16. 793A984A   51                     PUSH    ECX
    17. 793A984B   53                     PUSH    EBX
    18. 793A984C   56                     PUSH    ESI
    19. 793A984D   57                     PUSH    EDI
    20. 793A984E   8965 E8                MOV     [EBP-18],ESP
    21. 793A9851   8365 FC 00             AND     DWORD PTR [EBP-4],0
    22. 793A9855   64:A1 18000000         MOV     EAX,FS:[18]
    23. 793A985B   8945 E0                MOV     [EBP-20],EAX
    24. 793A985E   8178 10 001E0000       CMP     DWORD PTR [EAX+10],1E00
    25. 793A9865   75 0F                  JNZ     SHORT 793A9876
    26. 793A9867   803D 08004079 00       CMP     BYTE PTR [79400008],0
    27. 793A986E   75 06                  JNZ     SHORT 793A9876
    28. 793A9870   FF15 B0123A79          CALL    [<&NTDLL.CsrNewThread>]  ; ntdll.CsrNewThread
    29. 793A9876   FF75 0C                PUSH    DWORD PTR [EBP+C]
    30. 793A9879   FF55 08                [b]CALL    [EBP+8][/b]                  ; LPTHREAD_START_ROUTINE
    31. 793A987C   50                     PUSH    EAX
    32. 793A987D   E8 B9C6FFFF            CALL    ExitThread
    Думаю ядро тупо проверяет есть ли код по адресу 0x793A9824, если его там нет - CreateRemoteThread возвращает ERROR_NOT_ENOUGH_MEMORY (00000008), если он есть то вызывает эту ф-цию с параметром LPTHREAD_START_ROUTINE

    Там скорее жестко прошит 0x793A9824(ф-ция вызова потока), точно также как и 0x793A87B3(ф-ция вызова процесса), я на w2ksp4 делал прогу без kernel32.dll, специально делал её imagebase таким, чтобы по 0x793A87B3 оказывалось не пусто
    Код (Text):
    1. ;=====================================================================  
    2. format      pe gui at 0x793A0000 ; imageBase kernel32.dll
    3.                    rb 1024*64    ; ~< sizeof kernel32.dll
    4. ;=====================================================================  
    5.             int3
    6. @@:         jmp    @b
    7. ;=====================================================================
    Тогда процесс успешно стартовал, при вызове CreateRemoteThread для такого процесса, поток тоже успешно создается, НО выполняется не LPTHREAD_START_ROUTINE, а код по адресу 0x793A9824!(есс-но все адреса у сервиспаков разные)

    XP у меня нет проверить, но насколько я знаю там kernel32.dll грузится по-умолчанию
     
  10. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Тут получается палка в двух концах, удаленно kernel32.dll не загрузишь без CreateRemoteThread, а та не выполнится без kernel32.dll, остается вроде WriteProcessMemory, но нужно знать куда писать (тогда можно впихнуть даже вызов LdrLoadDLL)
    Код (Text):
    1. ;=====================================================================  
    2. hmodule     dd     0
    3. sobject     dd      size shl 16 or (size-2)
    4. pobject     dd      object
    5. object      du     'kernel32.dll',0
    6. size        =       $-object
    7. ;=====================================================================  
    8.             invoke  LdrLoadDll,0,0,sobject,hmodule
    9. ;=====================================================================
    Или действительно получалось через ZwCreateThread?
     
  11. asgard

    asgard New Member

    Публикаций:
    0
    Регистрация:
    12 июн 2005
    Сообщения:
    7
    Адрес:
    St. Pitersburg, Russia
    Да с ZwCreateThread нитка запускается и пока я только упел

    вызвать из нее ZwTerminateThread (что приводит к её корректному завершению) но думаю что с LdrLoadDLL проблем не будет. Придется немного со стеком поизвращаться.

    A CreateRemoteThread при создании нити вызывает кучу вского хлама типа CsrClientCallServer. А smss как известно нативный процесс и сервер WIN32 скорее всего про него ничего не знает. К тому же как я уже говорил в EPROCESS он помечен как не принадлежащий сессии. А по MSDN CreateRemoteThread ваще только в одной сесии работает.