TLS и CREATE_SUSPENDED

Тема в разделе "WASM.BEGINNERS", создана пользователем 9Demon, 15 май 2011.

  1. 9Demon

    9Demon New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2011
    Сообщения:
    33
    Запускаю процесс с CREATE_SUSPENDED, выделяю там память, пишу туда свой код. Дальше с GetThreadContext и SetThreadContext ставлю Eip на этот код. ResumeThread.. и сначала выполняется TLS, который был в том Exe. Как сделать, чтобы TLS стартовал вторым после моего кода?
     
  2. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    Стартап апк нельзя изменить, Eip из контекста будет сохранено в APC-контексте и после отработки загрузчика этот контекст будет загружен в процессор.
     
  3. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    Я помню извращаясь на перехвате РезюмеТред(или даже где то раньше, подзабыл чота) родительского процесса изменял первый адрес в массиве тлс дочернего процесса направляя его на свой код, внедренный перед этим же в его АП, в конце внедренного кода управление передавалось на оригинальный адрес 1го тлс. Можете так попробовать- все работало на отлишненько
     
  4. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    Я бы сделал так:
    Код (Text):
    1.     SecurityCookieInitialized = FALSE   ; Lock cookie.
    2.     OldCount = SecurityCookieInitCount
    3.     SecurityCookieInitCount + 1
    4.     ResumeThread()
    5.     Do
    6.         NtYieldExecution()  ; Or NtDelayExecution(30ms)
    7.     Loop (SecurityCookieInitCount = OldCount + 1)
    8.     SuspendThread()
    9.     SecurityCookieInitCount - 1
    10.     SecurityCookieInitialized = TRUE    ; Unlock cookie.
    11.     STACK_FRAME.Ip[CONTEXT.rEbp] - 5
    12.     State{} = CONTEXT
    13.     CONTEXT.rEip = @Payload
    14.     ResumeThread()
    15.    
    16. Payload(State{}):
    17.     Dispatch()
    18.     NtContinue(State{})
    Иначе если использовать SEH(TF -> 1 и хэндлим брейк), то придётся применять некоторые способы для обхода /SAFESEH. Также можно подключить отладчик, обработать всё и отключить его.
     
  5. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    выходит что нужно удалённо читать\писать в стек? Помимо удаленного мониторинга куков..
    Код (Text):
    1. STACK_FRAME.Ip[CONTEXT.rEbp] - 5
    или может я не правильно понял затеи)
     
  6. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    ASMatic
    Это если нужно контекст получить. Если не нужно, то стек не нужно юзать. С таким же успехом можно залочить загрузочную кс(LdrpLoaderLock), все треды вновь созданные будут ждать на евенте. При его сигнализации они сразу все выйдут из ожидания.