klzlk у меня вообще то проблема в другом я знаю что я переписал все с исходников винды но ведь разговор не об этом.
qqqqqq Это место под параметр к потоку У меня без CsrClientCallServer именно на ХР не работает на висте и севен работает. Я просто в функции CsrClientCallServer со структурами натупил теперь и на ХР работает походу уведомление надо делать
Видел при реверсе на висте и севен сервис NtCreateThreadEx там походу уже и память под стек и контекст реализованы на уровне ядра ?
qqqqqq и еще такой вопрос если я создаю удаленный поток к примеру пустой Code (Text): DWORD WINAPI MyRemoteThread(LPVOID lpParam) { return 0; } в что он должен возвращать ? то есть та память которая была выделенная под стек ее по правилам нужно освободить ? просто у меня после выполнения потока MyRemoteThread передает управления в удаленном процессе на lpParam ? причем создавал удаленный поток функцией CreateRemoteThread ?
сейчас вышла интересная ситуация делаю банально инжект то есть выделяю память пишу тело пустой функции Code (Text): DWORD WINAPI MyRemoteThread(LPVOID lpParam) { return 0; } после чего делаю вызов CreateRemoteThread потом жду по хендлу WaitForSingleObject (..., INFINITE) процесс жертва падает после завершения выполнения потока почему ? делал в потоке Code (Text): DWORD WINAPI MyRemoteThread(LPVOID lpParam) { my_api.pExitThread(0); return 0; } не помогает ... где my_api массив ф-ций восстановленных по хешам .
984259h В шапке топика базовая матчасть для понимания фолтов юзермодных. Есть разница в прототипах стартап процедур нэйтивных и пользовательских тредов.
klzlk Code (Text): DWORD WINAPI MyRemoteThread(LPVOID lpParam) { return 0; } .... .... .... HANDLE hRem = CreateRemoteThread(hProcess,NULL,0,MyRemoteThread,NULL,0,NULL); а вообще как правильно тогда создать удаленный поток ?
984259h Методы вызова стартап процедур разные. Нэйтивный тред должен дёрнуть RtlExitUserThread(). Иначе конечно будет фолт, на стеке нули.
klzlk И вообще у меня сейчас обычный винапишный тред я его пишу в процесс потом запускаю его средствами CreateRemoteThread после чего мне надо подождать его выполнение вот. ExitThread это же аварийная функция. Я в частности не использую ExitThread правда у меня в своем процессе, а тут в удаленном говорю же что на ExitThread валится поток
klzlk на счет CreateRemoteThread натупил поставил на пустую поточную функцию бряк в студии там же int 3 и за того и падало приложение. а на счет своей нэйтивной функции то с пустым потоком так и падает ... я вот не как не могу понять вот со слов Рихтера я смотрел на реализацию CreateRemoteThread там стек создается так как и в RtlCreateUserThread а вот BaseInitializeContext немного по другому параметры на поточную функцию и параметр к ней передается не через eip (функция ) параметр (просто пишется NtWriteProcessMemory ), а через ebx и eax то есть BaseInitializeContext->....->BaseThreadStartThunk->BaseThreadStart Code (Text): EXTRNP _BaseThreadStart,2 cPublicProc _BaseThreadStartThunk,2 xor ebp,ebp push ebx push eax push 0 jmp _BaseThreadStart@8 stdENDP _BaseThreadStartThunk Code (Text): VOID BaseThreadStart(PTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam) { __try { ExitThread((pfnStartAddr)(pvParam)); } __except (UnhandledExceptionFilter(GetExceptionInformation())) { ExitProcess(GetExceptionCode()); } } а как находиться в удаленном процессе адрес функции ExitThread ?