debug api (где ошибка?)

Тема в разделе "WASM.WIN32", создана пользователем Avoidik, 18 янв 2006.

  1. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    всем привет, значит написал распаковщик aspack'a v2.12, но теперь у меня возникает проблема, не могу завершить отладочный процесс (см. комментарии к коду), где моя ошибка, подскажите пожалста, буду очень благодарен



    вызываю вот так:
    Код (Text):
    1.     hDebugThread=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)_debug,hW  nd,NULL,NULL);
    2. CloseHandle(hDebugThread);
    3.  




    код, который вызывает подозрения (поправлено):
    Код (Text):
    1.  
    2. #define THREAD_EXIT_CODE 1234
    3.  
    4. void _debug(HWND hWnd)
    5. {
    6.     DWORD       hOldPage=0;
    7.     DWORD       hINT3=0xCC;
    8.     DWORD       hBytes=0;
    9.     HANDLE      hDump=0;
    10.     HANDLE      hFile=0,hMap=0,hView=0;
    11.     WORD        hSections,i=0;
    12.     char        szTitle[256];
    13.  
    14.     IMAGE_DOS_HEADER        *hDosHeader;
    15.     IMAGE_NT_HEADERS        *hNtHeader;
    16.     IMAGE_SECTION_HEADER    *hSectionHeader;
    17.  
    18.     STARTUPINFO         si;
    19.     PROCESS_INFORMATION pi;
    20.     DEBUG_EVENT         de;
    21.     CONTEXT             ctx;
    22.  
    23.     ZeroMemory(&si,sizeof(STARTUPINFO));
    24.     ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
    25.     ZeroMemory(&de,sizeof(DEBUG_EVENT));
    26.     ZeroMemory(&ctx,sizeof(CONTEXT));
    27.  
    28.     si.cb=sizeof(STARTUPINFO);
    29.     GetStartupInfo(&si);
    30.  
    31.     _getfiletitle(szPath,szTitle);
    32.  
    33.     if(!CreateProcess(szPath,NULL,NULL,NULL,FALSE,DEBUG_PROCESS|DEBUG_ONL Y_THIS_PROCESS,NULL,NULL,&si,&pi))
    34.     {
    35.         _wtlex(hWnd,"- Unable to create process: %s",szTitle);
    36.         goto exit_thread;
    37.     }
    38.  
    39.     if(!VirtualProtectEx(pi.hProcess,(LPVOID)pei.hImageBase,pei.hSizeOfIm age,PAGE_EXECUTE_READWRITE,&hOldPage))
    40.     {
    41.         _wtl(hWnd,"- VirtualProtectEx failed!",TRUE);
    42.         goto exit_thread1;
    43.     }
    44.  
    45.     for(;;)
    46.     {
    47.         if(!WaitForDebugEvent(&de,INFINITE))
    48.         {
    49.             _wtl(hWnd,"- WaitForDebugEvent failed!",TRUE);
    50.             break;
    51.         }
    52.  
    53.         if(de.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT)
    54.         {
    55.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    56.  
    57.             if(de.u.ExitProcess.dwExitCode == THREAD_EXIT_CODE)
    58.             {
    59.                 CloseHandle(pi.hProcess);
    60.                 CloseHandle(pi.hThread);
    61.  
    62.                 _patchfile(hWnd);
    63.                 goto exit_thread;
    64.             }
    65.             else
    66.             {
    67.                 _wtl(hWnd,"- Process was unexpectedly closed! Maybe not packed by AsPack!",TRUE);
    68.                 break;
    69.             }
    70.         }
    71.         else if(de.dwDebugEventCode==EXCEPTION_DEBUG_EVENT)
    72.         {
    73.             if(de.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOI NT)
    74.             {
    75.                 ctx.ContextFlags=CONTEXT_FULL;
    76.                 GetThreadContext(pi.hThread,&ctx);
    77.  
    78.                 _wtlex(hWnd,"- Breakpoint reached at: %08Xh",ctx.Eip);
    79.  
    80.                 TerminateProcess(pi.hProcess,THREAD_EXIT_CODE);
    81.             }
    82.             else
    83.             {
    84.                 ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_ HANDLED);
    85.                 continue;
    86.             }
    87.         }
    88.         ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    89.     }
    90.     goto exit_thread1;
    91.  
    92. error_debug3:
    93.     if(hMap) CloseHandle(hMap);
    94.  
    95. error_debug2:
    96.     if(hFile) CloseHandle(hFile);
    97.  
    98. error_debug1:
    99.     if(hDump) VirtualFree(hDump,pei.hSizeOfImage,MEM_DECOMMIT);
    100.  
    101. error_debug:
    102.     _wtl(hWnd,"- File was not unpacked, due to error(s)!",TRUE);
    103.  
    104. exit_thread1:  
    105.     TerminateProcess(pi.hProcess,THREAD_EXIT_CODE);
    106.     CloseHandle(pi.hProcess);
    107.     CloseHandle(pi.hThread);
    108.  
    109. exit_thread:
    110.     ExitThread(NULL);
    111. }
    112.  
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    В обработчике EXCEPTION_DEBUG_EVENT оставь только TerminateProcess, после EXIT_PROCESS_DEBUG_EVENT надо ещё раз вызвать ContinueDebugEvent, он закроет хендлы и отлаживаемый процесс завершится, потом получишь ещё раз EXIT_PROCESS_DEBUG_EVENT, аж после него можешь сделать CloseHandle
     
  3. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Что-то вроде этого:
    Код (Text):
    1. ;=====================================================================  
    2. sinfo       STARTUPINFO
    3. pinfo       PROCESS_INFORMATION
    4. event       TDebugEvent
    5. ;=====================================================================  
    6.             stdcall [GetStartupInfo],sinfo
    7.             stdcall [CreateProcess],0,buffer,0,0,0,DEBUG_PROCESS+\
    8.                     DEBUG_ONLY_THIS_PROCESS,0,0,sinfo,pinfo
    9.             or      eax,eax
    10.             jz      error
    11. ;=====================================================================  
    12. next:       stdcall [WaitForDebugEvent],event,INFINITE
    13.             cmp     [event.dwDebugEventCode],EXIT_PROCESS_DEBUG_EVENT
    14.             jz      exit
    15.             cmp     [event.dwDebugEventCode],EXCEPTION_DEBUG_EVENT
    16.             jz      exception
    17. continue:   stdcall [ContinueDebugEvent],[event.dwProcessId],\
    18.                     [event.dwThreadId],DBG_CONTINUE
    19.             jmp     next
    20. ;=====================================================================  
    21. exception:  cmp     [event.Exception.ExceptionRecord.ExceptionCode],\
    22.                     EXCEPTION_BREAKPOINT
    23.             jz      breakpoint
    24.             stdcall [ContinueDebugEvent],[event.dwProcessId],\
    25.                     [event.dwThreadId],DBG_EXCEPTION_NOT_HANDLED
    26.             jmp     next
    27. breakpoint: stdcall [TerminateProcess],[pinfo.hProcess],THREAD_EXIT_CODE
    28.             jmp     continue
    29. ;=====================================================================  
    30. exit:       xor     [event.ExitProcess.dwExitCode],THREAD_EXIT_CODE
    31.             jz      continue
    32.             stdcall [CloseHandle],[pinfo.hThread]
    33.             stdcall [CloseHandle],[pinfo.hProcess]
    34. ;=====================================================================
     
  4. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    спасибо, поправил код (см. первый пост), вроде работает, процесс грохается и хендлы закрываются удачно, НО теперь какой-то непонятный глюк в процедуре _patchfile



    а именно, пытаюсь удалить файл (который был только что запущен как процесс (szPath) и был грохнут как процесс (TerminateProcess)) код возврата положительный, т.е. вроде бы файл удалён, но файл не удалён (?!), пытаюсь во время работы программы что-нибудь сделать с этим файлом начинаются зверские тормоза и в итоге получаю 'нет доступа к файлу' (процесс точно грохнут, все хендлы к нему закрыты, в списке процессов его нет), далее если завершить нормальным образом всю программу, то файл удаляется (?!), чё за ерунда?
     
  5. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    хм, если пытаюсь всё сделать под отладчиком, то файл удаляется только после закрытия отладчика :\
     
  6. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Перед удаление надо закрыть хендл (event.CreateProcessInfo.hFile)
    Код (Text):
    1. ;=====================================================================
    2.             cmp     [event.dwDebugEventCode],CREATE_PROCESS_DEBUG_EVENT
    3.             jz      create
    4.             ...
    5. ;=====================================================================
    6. create:     mov     eax,[event.CreateProcessInfo.hFile]
    7.             mov     [hfile],eax
    8.             jmp     continue
    9. ;=====================================================================
    10. exit:       ...
    11.             stdcall [CloseHandle],[hfile]
    12.             stdcall [DeleteFile],buffer
    13. ;=====================================================================
     
  7. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia