ZwCreateThread

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ntldr, 18 Apr 2010.

  1. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    Такой вопрос - как ее правильно вызывать? Какой минимум параметров ей нужен, и как ей передать виртуальный адрес старта. Я нашел описание ее:

    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. - запускаю из ядра
     
  2. fluffylion

    fluffylion Member

    Joined:
    22 Feb 2010
    Messages:
    55
    Likes Received:
    10
    Reputations:
    0
    Может это поможет:
    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;
     
  3. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    я это тоже видел, похоже что не там адрес начала, а где-тот в IN PCONTEXT ThreadContext
     
  4. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    нашел описание структуры 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?
     
  5. 12usver12

    12usver12 Elder - Старейшина

    Joined:
    12 Dec 2007
    Messages:
    50
    Likes Received:
    9
    Reputations:
    0
    инфо о стеке извлекай из ZwQuerysection из структуры SECTION_IMAGE_INFORMATION оттуда и о значение eip и esp
     
  6. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    мне как бы надо не извлечь, а прописать, чтобы поток стартовал с моим EIP
     
  7. 12usver12

    12usver12 Elder - Старейшина

    Joined:
    12 Dec 2007
    Messages:
    50
    Likes Received:
    9
    Reputations:
    0
    я все таки не могу понять - ты с нуля запускаешь процесс из ядра или на каком-то этапе перехватываешь уже созданный процесс ?
     
  8. 12usver12

    12usver12 Elder - Старейшина

    Joined:
    12 Dec 2007
    Messages:
    50
    Likes Received:
    9
    Reputations:
    0
    ты неправильное описание структуры взял или неполное
    CONTEXT context = {CONTEXT_FULL};
    context.Eip = (SECTION_IMAGE_INFORMATION)si.EntryPoint ну или свою подставляй
     
  9. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    я брал с MSDN

    p.s. в студии есть норм. сейчас попробую
     
    #9 ntldr, 18 Apr 2010
    Last edited: 18 Apr 2010
  10. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    а как заполнять структуру USER_STACK
     
  11. fluffylion

    fluffylion Member

    Joined:
    22 Feb 2010
    Messages:
    55
    Likes Received:
    10
    Reputations:
    0
    Если есть возможность посмотри пример 6.2 из "Gary Nebbett Windows NT, 2000 Native API Reference". Там показано, как заполняется данная структура.