Невыполняться код отлаживаемого процесса

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 10 мар 2012.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Код (Text):
    1. int _tmain(int argc, _TCHAR* argv[])
    2. {
    3.     STARTUPINFO si;
    4.     PROCESS_INFORMATION pi;
    5.     ZeroMemory( &si, sizeof(si) );
    6.     si.cb = sizeof(si);
    7.     ZeroMemory( &pi, sizeof(pi) );
    8.     DEBUG_EVENT de;
    9.     CreateProcess(target,0,0,0,FALSE,NORMAL_PRIORITY_CLASS,0,0,&si,&pi);
    10.     printf("Started\n");
    11.     DebugActiveProcess(pi.dwProcessId);
    12.     for(;;)
    13.     {
    14.         ZeroMemory(&de,sizeof(DEBUG_EVENT));
    15.         WaitForDebugEvent(&de,INFINITE);
    16.         if(de.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT)
    17.         {
    18.             break;
    19.         }
    20.         if(de.dwDebugEventCode==EXCEPTION_DEBUG_EVENT)
    21.         {
    22.             ///
    23.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    24.         }
    25.     }
    26.     DebugActiveProcessStop(pi.dwProcessId);
    27.     printf("Finished\n");
    28.     getch();
    29.     return 0;
    30. }
    Ничего непонимаю(((
     
  2. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    DebugActiveProcess,WaitForDebugEvent что возвращает?
    CREATE_PROCESS_DEBUG_EVENT ,
    CREATE_THREAD_DEBUG_EVENT ,
    EXCEPTION_DEBUG_EVENT и прочее тоже обрабатывать надо.
    Сделайте отладочный вывод, сразу всё понятно станет.
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Да точно нада для каждого ивента вызывать ContinueDebugEvent.
    ЗЫ:а где находиться адрес по которому была ошибка?В EXCEPTION_RECORD::ExceptionAddress пурга какая то.В отлаживаемом приложение делаеться деление на ноль,секции релоков в нем нет,база 0х400000.А в поле EXCEPTION_RECORD::ExceptionAddress 0х77F5E6E6 О_о
     
  4. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    Да, всё у тебя верно, он же не на EntryPoint останавливается. Трассировка раньше начинается. Вот куски кода, может помогут.
    А вообще в интернете тьма примеров, Bing в помощь.

    Код (Text):
    1.         else if ( DebugEvent.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT )
    2.         {
    3.             DM( "Process created.(ImageBase=0x%08X,lpStartAddress=0x%08X)" , DebugEvent.u.CreateProcessInfo.lpBaseOfImage , DebugEvent.u.CreateProcessInfo.lpStartAddress );
    4.             hMainFile = DebugEvent.u.CreateProcessInfo.hFile;          
    5.             lpProcessStartAddress = DebugEvent.u.CreateProcessInfo.lpStartAddress;
    6.             if ( !DebugEvent.u.CreateProcessInfo.lpStartAddress )
    7.             {
    8.                 DME( "lpStartAddress = 0." );
    9.                 bError = TRUE;
    10.                 break;
    11.             }
    12.         }
    потом ловишь EXCEPTION_DEBUG_EVENT

    Код (Text):
    1.         else if ( DebugEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT )
    2.         {
    3.             if ( (DWORD)DebugEvent.u.Exception.ExceptionRecord.ExceptionCode == 0x80000003L )   //EXCEPTION_BREAKPOINT
    4.             {
    5.                 if ( !lpMainProcessModule )
    6.                 {
    7.                     DM( "Initial breakpoint." );
    8.                     lpMainProcessModule = GetAddressOfMainModuleInProcessW( pi.dwProcessId , lpFilePath , &dwSizeOfMainProcessModule );
    9.                     if ( !lpMainProcessModule )
    10.                     {
    11.                         DME( "Cant find main module of process(%ls)." , lpFilePath );
    12.                         bError = TRUE;
    13.                         break;
    14.                     }
    15.                     bError = !Tracer_SetBreakpoint( pi.hProcess , lpProcessStartAddress , &bOrignalByte );//0xCC(int3) at EntryPoint
    16.                     if ( bError )
    17.                     {
    18.                         DME( "Tracer_SetBreakpoint fails." );
    19.                         break;
    20.                     }
    21.                     bEntryPointBreakpoint = TRUE;
    22.                 }
    23.                 else
    24.                 {
    25.                     if ( bEntryPointBreakpoint )
    26.                     {
    27.                         bEntryPointBreakpoint = FALSE;
    28.                         DM( "EntryPoint catched. Start tracing..." );
    29.                         bError = !Tracer_RemoveBreakpoint( pi.hProcess , lpProcessStartAddress , &bOrignalByte );
    30.                         if ( bError )
    31.                         {
    32.                             DME( "Tracer_RemoveBreakpoint fails." );
    33.                             break;
    34.                         }
    35.                         bError = !Tracer_ChangeThreadEIP( pi.hThread , -1 , bIsProcessx64 );
    36.                         if ( bError )
    37.                         {
    38.                             DME( "Tracer_ChangeThreadEIP fails." );
    39.                             break;
    40.                         }
    41.                     }
    42.  
    43.                     bError = !Tracer_SetTF( &pi , bIsProcessx64 );
    44.                     if ( bError )
    45.                     {
    46.                         DME( "Tracer_SetTF fails." );
    47.                         break;
    48.                     }
    49.  
    50.                 }
    51.                 bError = !ContinueDebugEvent( DebugEvent.dwProcessId , DebugEvent.dwThreadId , ((DWORD)0x00010002L) ); //DBG_CONTINUE
    52.                 if ( bError )
    53.                 {
    54.                     DME( "ContinueDebugEvent fails." );
    55.                     break;
    56.                 }
    57.                 continue;
    58.             }  
    59.             else if ( (DWORD)DebugEvent.u.Exception.ExceptionRecord.ExceptionCode == 0x80000004L )//EXCEPTION_SINGLE_STEP
    60.             {
    61. //do what u need
    62.  
    63.                 bError = !Tracer_SetTF( &pi , bIsProcessx64 );
    64.                 if ( bError )
    65.                 {
    66.                     DME( "Tracer_SetTF fails." );
    67.                     break;
    68.                 }
    69.  
    70.                 bError = !ContinueDebugEvent( DebugEvent.dwProcessId , DebugEvent.dwThreadId , ((DWORD)0x00010002L) ); //DBG_CONTINUE
    71.                 if ( bError )
    72.                 {
    73.                     DME( "ContinueDebugEvent fails." );
    74.                     break;
    75.                 }
    76.                 continue;
    77.             }
    78.         }
     
  5. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Не думал что отладка начинаеться еще до инициализации... А тлс ф-ции то же под неё значит попадают?
    ЗЫ:а почему собственно при инициализации в дебаг моде, возникают исключения которые не возникают в обычном режиме?
     
  6. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    _nic
    Попадают. Указав опцию FLG_SHOW_LDR_SNAPS в реестре для приложения вы получие большое число сообщений на порт. Из них вас будет интересовать сепшен DBG_PRINTEXCEPTION_C. Далее вы получите его параметры из инфы про фолт и будите искать в этой строке текст(может быть не сначала и без учёта регистра):
    "Calling Tls Callback"
    После чего извлекаете вектор и базу модуля из аргументов принта.
     
  7. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    _nic
    В пебе метка стоит, если затереть, то фолтов не будет.
     
  8. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/PEB.html - PEB::BeingDebugged Вот эта что ли?
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    _nic
    Не думал, что код инициализации тоже можно\нужно отлаживать?!

    Для того, чтобы информировать отладчик. Например, системный DbgBreakPoint при инициализации сигнализирует о том, что все стандартные дебаг-эвенты закончились, все потоки процесса пора отпускать "на волю", и соотв-но, чтобы отладчик не потерял управление ему дается последний шанс расставить свои брикпойнты. Все это дело расписано в ремарках к DebugActiveProcess. При создании процесса делается то же самое, и перед передачей управления на энтрипойнт процесса вызывается DbgBreakPoint
     
  10. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Можно как то поставить бряк на EP отлаживаемого процесса?
     
  11. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    _nic
    Да. Усталъ обьяснять сей баян. Действительно - есть механизм передачи управления на еп баянный. Нам, точнее вам нужно его изучить. Ссыль на EP в стартап контексте. Вы в апк процедуре брейк получаете. Стартап контекст в конце SFC. Собственно вот и всё.
     
  12. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    А как можно обьяснить такое ?
    Запускаю блокнот в отладочном режиме,жму "сохранить как" - куча исключений, в обычном режиме конечно же все ОК.И коды части эксептов почему то не описанны в мсдн
    Код (Text):
    1. int _tmain(int argc, _TCHAR* argv[])
    2. {
    3.     STARTUPINFO si;
    4.     PROCESS_INFORMATION pi;
    5.     ZeroMemory( &si, sizeof(si) );
    6.     si.cb = sizeof(si);
    7.     ZeroMemory( &pi, sizeof(pi) );
    8.     DEBUG_EVENT de;
    9.     CreateProcess(target,0,0,0,FALSE,NORMAL_PRIORITY_CLASS,0,0,&si,&pi);
    10.     printf("Started\n");
    11.     DebugActiveProcess(pi.dwProcessId);
    12.     int i=0;
    13.     while(i!=1)
    14.     {
    15.         ZeroMemory(&de,sizeof(DEBUG_EVENT));
    16.         WaitForDebugEvent(&de,INFINITE);
    17.         switch(de.dwDebugEventCode)
    18.         {
    19.         case EXIT_PROCESS_DEBUG_EVENT:
    20.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    21.             i=1;
    22.             printf("EXIT_PROCESS_DEBUG_EVENT\n");
    23.             break;
    24.         case EXCEPTION_DEBUG_EVENT:
    25.             printf("EXCEPTION_DEBUG_EVENT\n");
    26.             printf("Adr:%X\n",de.u.Exception.ExceptionRecord.ExceptionAddress);
    27.             PrintExpt(de.u.Exception.ExceptionRecord.ExceptionCode);
    28.             getch();
    29.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    30.             break;
    31.         case CREATE_THREAD_DEBUG_EVENT:
    32.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    33.             printf("CREATE_THREAD_DEBUG_EVENT\n");
    34.             break;
    35.         case CREATE_PROCESS_DEBUG_EVENT:
    36.             printf("CREATE_PROCESS_DEBUG_EVENT\n");
    37.             printf("Base: %X\n",de.u.CreateProcessInfo.lpBaseOfImage);
    38.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    39.             break;
    40.         case EXIT_THREAD_DEBUG_EVENT:
    41.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    42.             printf("EXIT_THREAD_DEBUG_EVENT\n");
    43.             break;
    44.         case LOAD_DLL_DEBUG_EVENT:
    45.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    46.             printf("LOAD_DLL_DEBUG_EVENT\n");
    47.             break;
    48.         case UNLOAD_DLL_DEBUG_EVENT:
    49.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    50.             printf("UNLOAD_DLL_DEBUG_EVENT\n");
    51.             break;
    52.         case OUTPUT_DEBUG_STRING_EVENT:
    53.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    54.             printf("OUTPUT_DEBUG_STRING_EVENT\n");
    55.             break;
    56.         case RIP_EVENT:
    57.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    58.             printf("RIP_EVENT\n");
    59.             break;
    60.         }
    61.     }
    62.     DebugActiveProcessStop(pi.dwProcessId);
    63.     printf("Finished\n");
    64.     getch();
    65.     return 0;
    66. }
    Выглядит это примерно так
    и ACCESS_VIOLATION идет дальше до бесконечности...
    Это что, то же получаеться какая то отладочная фича?