RtlCreateUserThread vs CreateRemoteThread

Тема в разделе "WASM.WIN32", создана пользователем 984259h, 2 июл 2011.

  1. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    klzlk
    еб@ть как смешно ...
     
  2. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    qqqqqq
    на путал со структурами в CsrClientCallServer после уведомления заработало нормально.
     
  3. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    984259h
    А что нет чтоле.. вы переписали CreateThread().
     
  4. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    klzlk
    у меня вообще то проблема в другом я знаю что я переписал все с исходников винды но ведь разговор не об этом.
     
  5. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    qqqqqq
    Это место под параметр к потоку
    У меня без CsrClientCallServer именно на ХР не работает на висте и севен работает.
    Я просто в функции CsrClientCallServer со структурами натупил теперь и на ХР работает походу уведомление надо делать
     
  6. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    Видел при реверсе на висте и севен сервис NtCreateThreadEx там походу уже и память под стек и контекст реализованы на уровне ядра ?
     
  7. qqqqqq

    qqqqqq New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2011
    Сообщения:
    14
    нет
     
  8. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    qqqqqq
    и еще такой вопрос если я создаю удаленный поток к примеру пустой
    Код (Text):
    1. DWORD WINAPI MyRemoteThread(LPVOID lpParam)
    2. {
    3.    
    4.     return 0;        
    5. }
    в что он должен возвращать ? то есть та память которая была выделенная под стек ее по правилам нужно освободить ? просто у меня после выполнения потока MyRemoteThread передает управления в удаленном процессе на lpParam ? причем создавал удаленный поток функцией CreateRemoteThread ?
     
  9. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    сейчас вышла интересная ситуация делаю банально инжект то есть
    выделяю память пишу тело пустой функции
    Код (Text):
    1. DWORD WINAPI MyRemoteThread(LPVOID lpParam)
    2. {
    3.    
    4.     return 0;        
    5. }
    после чего делаю вызов CreateRemoteThread потом жду по хендлу WaitForSingleObject (..., INFINITE)
    процесс жертва падает после завершения выполнения потока почему ? делал в потоке
    Код (Text):
    1. DWORD WINAPI MyRemoteThread(LPVOID lpParam)
    2. {
    3.  
    4.  
    5.    
    6.     my_api.pExitThread(0);
    7.     return 0;        
    8. }
    не помогает ... где my_api массив ф-ций восстановленных по хешам .
     
  10. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    984259h
    В шапке топика базовая матчасть для понимания фолтов юзермодных.

    Есть разница в прототипах стартап процедур нэйтивных и пользовательских тредов.
     
  11. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    klzlk
    дык я то делаю обычный пользовательский инжект ...
    где ?
     
  12. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    984259h
    Всмысле не топика, а раздела
     
  13. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    klzlk
    Код (Text):
    1. DWORD WINAPI MyRemoteThread(LPVOID lpParam)
    2. {
    3.    
    4.     return 0;        
    5. }
    6.  
    7.    ....
    8.    ....
    9.    ....
    10.    HANDLE hRem = CreateRemoteThread(hProcess,NULL,0,MyRemoteThread,NULL,0,NULL);
    а вообще как правильно тогда создать удаленный поток ?
     
  14. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    984259h
    Методы вызова стартап процедур разные. Нэйтивный тред должен дёрнуть RtlExitUserThread(). Иначе конечно будет фолт, на стеке нули.
     
  15. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    Как на RtlExitUserThread() передать управление ?
     
  16. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    klzlk
    И вообще у меня сейчас обычный винапишный тред я его пишу в процесс потом запускаю его средствами CreateRemoteThread после чего мне надо подождать его выполнение вот. ExitThread это же аварийная функция. Я в частности не использую ExitThread правда у меня в своем процессе, а тут в удаленном говорю же что на ExitThread валится поток
     
  17. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    984259h
    Почему рушится ?
     
  18. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    klzlk
    eip на нулях
     
  19. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    984259h
    Ну и ладно. Сами решайте.)
     
  20. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    klzlk
    на счет CreateRemoteThread натупил поставил на пустую поточную функцию бряк в студии там же int 3 и за того и падало приложение.
    а на счет своей нэйтивной функции то с пустым потоком так и падает ...
    я вот не как не могу понять вот со слов Рихтера
    я смотрел на реализацию CreateRemoteThread там стек создается так как и в RtlCreateUserThread а вот BaseInitializeContext немного по другому параметры на поточную функцию и параметр к ней передается не через eip (функция ) параметр (просто пишется NtWriteProcessMemory ), а через ebx и eax то есть BaseInitializeContext->....->BaseThreadStartThunk->BaseThreadStart
    Код (Text):
    1.         EXTRNP  _BaseThreadStart,2
    2. cPublicProc _BaseThreadStartThunk,2
    3.         xor     ebp,ebp
    4.         push    ebx
    5.         push    eax
    6.         push    0
    7.         jmp     _BaseThreadStart@8
    8.  
    9. stdENDP _BaseThreadStartThunk
    Код (Text):
    1. VOID BaseThreadStart(PTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam) {
    2. __try {
    3. ExitThread((pfnStartAddr)(pvParam));
    4. }
    5. __except (UnhandledExceptionFilter(GetExceptionInformation())) {
    6. ExitProcess(GetExceptionCode());
    7. }
    8. }
    а как находиться в удаленном процессе адрес функции ExitThread ?