none
Windbg API как читать\изменять "контекст" отлаживаемого процесса? RRS feed

  • Вопрос

  • STARTUPINFO si={0};
        PROCESS_INFORMATION pi={0};
        si.cb = sizeof(si);
        DEBUG_EVENT de;
        CreateProcess(exeP,0,0,0,FALSE,NORMAL_PRIORITY_CLASS,0,0,&si,&pi);
        DebugActiveProcess(pi.dwProcessId);
        int i=100;
        while(i!=1)
        {
            memset(&de,NULL,sizeof(DEBUG_EVENT));
            WaitForDebugEvent(&de,INFINITE);
            switch(de.dwDebugEventCode)
            {
                case EXIT_PROCESS_DEBUG_EVENT:
                {
                    ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
                    i=1;
                }break;
                case EXCEPTION_DEBUG_EVENT:
                {
                    if(de.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT)
                    {
                
                        HANDLE th=OpenThread(THREAD_ALL_ACCESS,FALSE,de.dwThreadId);
                        if(th==NULL)
                        {
                            printf("OpenThread - Er: %d\n",GetLastError());
                        }
                        CONTEXT con={0};
                        if(GetThreadContext(th,&con)==0)
                        {
                            printf("GetThreadContext - Er: %d\n",GetLastError());
                        }
                        printf("Eip : %X\n",con.Eip);
                        //TerminateThread(th,0);
                        CloseHandle(th);
                        getch();
                    }
                    ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
                }break;
                ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
                    break;
                case CREATE_THREAD_DEBUG_EVENT:
                ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
                    break;
                case CREATE_PROCESS_DEBUG_EVENT:
                ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
                    break;
                case EXIT_THREAD_DEBUG_EVENT:
                ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
                    break;
                case LOAD_DLL_DEBUG_EVENT:
                ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
                    break;
                case UNLOAD_DLL_DEBUG_EVENT:
                ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
                    break;
                case OUTPUT_DEBUG_STRING_EVENT:
                ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
                    break;
                case RIP_EVENT:
                ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
                    break;
            }
        }

    ф-ции отрабатывают без ошибок в структуре пусто... Отладчики основанные Windbg API это ведь как то делают.OllyDbg например.Но как ???
    5 июля 2012 г. 20:20

Ответы

  • Здравствуйте.
    ............................
    Чтобы структура CONTEXT была заполнена, нужно установить ContextFlags.
    Например:
     CONTEXT con={0};
     con.ContextFlags=CONTEXT_ALL;
    ............................
    DebugActiveProcess(pi.dwProcessId);
    должна возвращать TRUE!
    Полезно предварительно проверить включен ли отдадчик студии.  Например,
     if(IsDebuggerPresent())
    - отладчик уже включён.
    ............................
    Функция CreateProcess - требуется установить флаг отладки. Например, DEBUG_ONLY_THIS_PROCESS
     CreateProcess(exeP,0,0,0,FALSE,NORMAL_PRIORITY_CLASS|DEBUG_ONLY_THIS_PROCESS,0,0,&si,&pi);

    • Помечено в качестве ответа yons 7 июля 2012 г. 19:13
    7 июля 2012 г. 17:07

Все ответы

  • Здравствуйте.
    ............................
    Чтобы структура CONTEXT была заполнена, нужно установить ContextFlags.
    Например:
     CONTEXT con={0};
     con.ContextFlags=CONTEXT_ALL;
    ............................
    DebugActiveProcess(pi.dwProcessId);
    должна возвращать TRUE!
    Полезно предварительно проверить включен ли отдадчик студии.  Например,
     if(IsDebuggerPresent())
    - отладчик уже включён.
    ............................
    Функция CreateProcess - требуется установить флаг отладки. Например, DEBUG_ONLY_THIS_PROCESS
     CreateProcess(exeP,0,0,0,FALSE,NORMAL_PRIORITY_CLASS|DEBUG_ONLY_THIS_PROCESS,0,0,&si,&pi);

    • Помечено в качестве ответа yons 7 июля 2012 г. 19:13
    7 июля 2012 г. 17:07
  • Спасибо, что не забыли отметить ответ

    Для связи [mail]

    10 июля 2012 г. 9:54