Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   ZwCreateThread (https://forum.antichat.xyz/showthread.php?t=197130)

ntldr 18.04.2010 10:50

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;

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

Цитата:

Сообщение от 12usver12
инфо о стеке извлекай из 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

Цитата:

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

я брал с MSDN

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

ntldr 18.04.2010 14:15

а как заполнять структуру USER_STACK


Время: 05:56