CONTEXT.Eip при старте

Тема в разделе "WASM.WIN32", создана пользователем Sickle, 15 сен 2004.

  1. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    создаю процесс с флагом CREATE_SUSPENDED. беру его контекст. по идее в CONTEXT.Eip должен содержаться адрес Entry Point? но там адрес внутри kernel32. или я че-то не правильно понимаю? после правки контекста делаю ResumeThread - процесс завершается. на чтобы я его не поменял. менял на 0 - вроде эксэпшн должен вылезти, а нифига - завершение и все... где я заблуждаюсь?
     
  2. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Первый поток процесса начинается не с EntryPoint, а с KERNEL32!BaseProcessStart.

    Это - для подсистемы win32.

    Native-аппликухи рождаются в недрах ntdll.

    по идее в CONTEXT.Eip должен содержаться адрес Entry Point

    Идя неверна и основана на ложных допущениях :)
     
  3. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    ясно. а почему тогда модификация Eip не вызывает сбоя?
     
  4. Max

    Max Member

    Публикаций:
    0
    Регистрация:
    22 май 2003
    Сообщения:
    192
    Sickle

    может ты просто флаг CONTEXT_CONTROL не выставляешь?
     
  5. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    и CONTEXT_CONTROL, и CONTEXT_FULL пробовал - те же яйца, только в профиль...
     
  6. Gloomy

    Gloomy New Member

    Публикаций:
    0
    Регистрация:
    29 май 2003
    Сообщения:
    48
    Адрес:
    Екатеринбург
    Сорри что вопрос немного не в тему - не хочу создавать новую тему. Имеется код:
    Код (Text):
    1.  
    2. CONTEXT cnt = {0};
    3. cnt.ContextFlags = CONTEXT_CONTROL;
    4. wsprintf(buff, "EIP: %X", cnt.Rip);
    5.  




    Выдается ошибка:







    Но ведь cnt.Rip совпадает с описанием! :dntknw:
     
  7. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер
    Кусок из Winnt.h:



    // This section is specified/returned if the

    // ContextFlags word contians the flag CONTEXT_CONTROL.

    //



    DWORD Ebp;

    DWORD Eip;

    DWORD SegCs; // MUST BE SANITIZED

    DWORD EFlags; // MUST BE SANITIZED

    DWORD Esp;

    DWORD SegSs;



    Rip это 64-х битный регистр ip, откуда ему там быть?
     
  8. Gloomy

    Gloomy New Member

    Публикаций:
    0
    Регистрация:
    29 май 2003
    Сообщения:
    48
    Адрес:
    Екатеринбург
    Спасибо, с этим ясно. А как именуется флаг трассировки? В winnt.h я этого не нашел хотя очень стрался :dntknw: Пробовал написать:

    cnt.EFlags = 0x100;

    Но похоже это не тот параметр т.к. работающей пошаговой отладки не наблюдается.



    З.Ы. Отладчик пишу по этому примеру
     
  9. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер
    Правильно, 0x100 это флаг трассировки, значит ошибка в чём-то другом.
     
  10. Gloomy

    Gloomy New Member

    Публикаций:
    0
    Регистрация:
    29 май 2003
    Сообщения:
    48
    Адрес:
    Екатеринбург
    Все написал 1:1 с примером:
    Код (Text):
    1.  
    2.     while (TRUE)
    3.     {
    4.         WaitForDebugEvent(&de, INFINITE);
    5.         switch (de.dwDebugEventCode)
    6.         {
    7.         case EXIT_PROCESS_DEBUG_EVENT:
    8.             wsprintf(buff, "End process\nSteps: %u", steps);
    9.             MessageBox(0, buff, NULL, MB_ICONINFORMATION);
    10.             CloseHandle(pi.hProcess);
    11.             CloseHandle(pi.hThread);
    12.             ExitProcess(0);
    13.             break;
    14.         case CREATE_PROCESS_DEBUG_EVENT:
    15.             MessageBox(0, "Start debug process...", "Info", MB_ICONEXCLAMATION);
    16.             steps = 0;
    17.             break;
    18.         case EXCEPTION_DEBUG_EVENT:
    19.             switch (de.u.Exception.ExceptionRecord.ExceptionCode)
    20.             {
    21.             case EXCEPTION_BREAKPOINT:
    22.                 // Запуск трейса!
    23.                 cnt.ContextFlags = CONTEXT_CONTROL;
    24.                 GetThreadContext(de.u.CreateProcessInfo.hThread, &cnt);
    25.                 cnt.EFlags = 0x100;
    26.                 SetThreadContext(de.u.CreateProcessInfo.hThread, &cnt);
    27.                 ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_CONTINUE);
    28.                 continue;
    29.             case EXCEPTION_SINGLE_STEP:
    30.                 // Тут будет бряк при каждом новом шаге!
    31.                 steps++;
    32.                 GetThreadContext(de.u.CreateProcessInfo.hThread, &cnt);
    33.                 cnt.EFlags = 0x100;
    34.                 SetThreadContext(de.u.CreateProcessInfo.hThread, &cnt);
    35.                 ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_CONTINUE);
    36.                 continue;
    37.             }
    38.             break;
    39.         case CREATE_THREAD_DEBUG_EVENT:
    40.             MessageBox(0, "Begin new thread!", NULL, MB_ICONINFORMATION);
    41.             break;
    42.         case EXIT_THREAD_DEBUG_EVENT:
    43.             MessageBox(0, "Kill thread!", NULL, MB_ICONINFORMATION);
    44.             break;
    45.         }
    46.         ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_EXCEPTION_NOT_HANDLED);
    47.     }
    48.  
     
  11. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер
    cnt.EFlags = 0x100;

    Ты нарущаешь этим работу программы, зачем сбрасывать остальные флаги. Правильно будет cnt.EFlags |= 0x100;

    Больше ошибок вроде не видно, попробуй под отладчиком прогони(лучше под айсом), что функции GetThreadContext и SetThreadContext возвращают.
     
  12. Gloomy

    Gloomy New Member

    Публикаций:
    0
    Регистрация:
    29 май 2003
    Сообщения:
    48
    Адрес:
    Екатеринбург
    Вместо



    de.u.CreateProcessInfo.hThread



    нужно было написать



    pi.hThread



    Все работает но как-то странно, отлаживаемая программа падает...
     
  13. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер
    так cnt.EFlags |= 0x100 прописал? Если да, то падать ничего не должно.