PDA

Просмотр полной версии : ZwCreateThread


ntldr
18.04.2010, 10:50
Такой вопрос - как ее правильно вызывать? Какой минимум параметров ей нужен, и как ей передать виртуальный адрес старта. Я нашел описание ее:

NTSYSAPI
NTSTATUS
NTAPI ZwCreateThread(
OUT PHANDLE ThreadHandle, //понятно
IN ACCESS_MASK DesiredAccess, //понятно
IN POBJECT_ATTRIBUTES ObjectAttributes, //понятно
IN HANDLE ProcessHandle, //понятно
OUT PCLIENT_ID ClientId, //понятно
IN PCONTEXT ThreadContext,
IN PUSER_STACK UserStack,
IN BOOLEAN CreateSuspended //понятно
);

остается 2 параметра

IN PCONTEXT ThreadContext,
IN PUSER_STACK UserStack,

подозреваю, что в какую-то из этих структур надо передавать адрес старта

p.s. - запускаю из ядра

fluffylion
18.04.2010, 12:00
Может это поможет:
ThreadContext
Points to a structure that specifies the initial values of the processor registers for the
thread.
UserStack
Points to a structure that specifies the user mode stack of the thread.

typedef struct _USER_STACK {
PVOID FixedStackBase;
PVOID FixedStackLimit;
PVOID ExpandableStackBase;
PVOID ExpandableStackLimit;
PVOID ExpandableStackBottom;
} USER_STACK, *PUSER_STACK;

ntldr
18.04.2010, 12:03
я это тоже видел, похоже что не там адрес начала, а где-тот в IN PCONTEXT ThreadContext

ntldr
18.04.2010, 12:24
нашел описание структуры context

typedef struct {
double Fpr0;
double Fpr1;
double Fpr2;
double Fpr3;
double Fpr4;
double Fpr5;
double Fpr6;
double Fpr7;
double Fpr8;
double Fpr9;
double Fpr10;
double Fpr11;
double Fpr12;
double Fpr13;
double Fpr14;
double Fpr15;
double Fpr16;
double Fpr17;
double Fpr18;
double Fpr19;
double Fpr20;
double Fpr21;
double Fpr22;
double Fpr23;
double Fpr24;
double Fpr25;
double Fpr26;
double Fpr27;
double Fpr28;
double Fpr29;
double Fpr30;
double Fpr31;
double Fpscr;
DWORD Gpr0;
DWORD Gpr1;
DWORD Gpr2;
DWORD Gpr3;
DWORD Gpr4;
DWORD Gpr5;
DWORD Gpr6;
DWORD Gpr7;
DWORD Gpr8;
DWORD Gpr9;
DWORD Gpr10;
DWORD Gpr11;
DWORD Gpr12;
DWORD Gpr13;
DWORD Gpr14;
DWORD Gpr15;
DWORD Gpr16;
DWORD Gpr17;
DWORD Gpr18;
DWORD Gpr19;
DWORD Gpr20;
DWORD Gpr21;
DWORD Gpr22;
DWORD Gpr23;
DWORD Gpr24;
DWORD Gpr25;
DWORD Gpr26;
DWORD Gpr27;
DWORD Gpr28;
DWORD Gpr29;
DWORD Gpr30;
DWORD Gpr31;
DWORD Cr;
DWORD Xer;
DWORD Msr;
DWORD Iar;
DWORD Lr;
DWORD Ctr;
DWORD ContextFlags;
DWORD Fill[3];
DWORD Dr0;
DWORD Dr1;
DWORD Dr2;
DWORD Dr3;
DWORD Dr4;
DWORD Dr5;
DWORD Dr6;
DWORD Dr7;
} CONTEXT;

но где тут регистры общего назначения и EIP?

12usver12
18.04.2010, 12:28
инфо о стеке извлекай из ZwQuerysection из структуры SECTION_IMAGE_INFORMATION оттуда и о значение eip и esp

ntldr
18.04.2010, 12:39
инфо о стеке извлекай из ZwQuerysection из структуры SECTION_IMAGE_INFORMATION оттуда и о значение eip и esp
мне как бы надо не извлечь, а прописать, чтобы поток стартовал с моим EIP

12usver12
18.04.2010, 12:51
я все таки не могу понять - ты с нуля запускаешь процесс из ядра или на каком-то этапе перехватываешь уже созданный процесс ?

12usver12
18.04.2010, 13:15
ты неправильное описание структуры взял или неполное
CONTEXT context = {CONTEXT_FULL};
context.Eip = (SECTION_IMAGE_INFORMATION)si.EntryPoint ну или свою подставляй

ntldr
18.04.2010, 13:37
ты неправильное описание структуры взял или неполное
CONTEXT context = {CONTEXT_FULL};
context.Eip = (SECTION_IMAGE_INFORMATION)si.EntryPoint ну или свою подставляй
я брал с MSDN

p.s. в студии есть норм. сейчас попробую

ntldr
18.04.2010, 14:15
а как заполнять структуру USER_STACK

fluffylion
18.04.2010, 16:47
Если есть возможность посмотри пример 6.2 из "Gary Nebbett Windows NT, 2000 Native API Reference". Там показано, как заполняется данная структура.