Просмотр полной версии : ZwCreateThread
Такой вопрос - как ее правильно вызывать? Какой минимум параметров ей нужен, и как ей передать виртуальный адрес старта. Я нашел описание ее:
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;
я это тоже видел, похоже что не там адрес начала, а где-тот в IN PCONTEXT ThreadContext
нашел описание структуры 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
инфо о стеке извлекай из 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 ну или свою подставляй
ты неправильное описание структуры взял или неполное
CONTEXT context = {CONTEXT_FULL};
context.Eip = (SECTION_IMAGE_INFORMATION)si.EntryPoint ну или свою подставляй
я брал с MSDN
p.s. в студии есть норм. сейчас попробую
а как заполнять структуру USER_STACK
fluffylion
18.04.2010, 16:47
Если есть возможность посмотри пример 6.2 из "Gary Nebbett Windows NT, 2000 Native API Reference". Там показано, как заполняется данная структура.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot