Люди, подскажите, если кто знает, как найти стартовый адрес потока в юзермоде, имея лишь его id? То есть тот самый адрес, который передаётся CreateThread.
Любой поток начинает исполняться с ntdll!KiUserApcDispatcher. Оттуда он перейдёт в LdrInitializeThunk, для обработки в DllMain, затем он перейдёт в ThreadInitRoutine(её адрес находится немного выше значения лежащего на вершине стека в ModuleEntryPoint, CONTEXT.Eip=Win32StartAddress и ETHREAD.Win32StartAddress), посредством ZwContinue(регистр Eip), а из неё после установки SEH-а и Win32StartAddress(ZwSetInformationThread, InfoClass=ThreadQuerySetWin32StartAddress из CONTEXT.Eax) продолжит исполняться с адреса в контексте потока в регистре Eax.
RamMerLabs Вы что-то путаете. Код (Text): NtQueryInformationThread(hThread, ThreadQuerySetWin32StartAddress, &buff, bufflen, &bufflen_out); Выдает (в buff) именно тот самый адрес функции потока, который передается в CreateThread.