всем привет, значит написал распаковщик aspack'a v2.12, но теперь у меня возникает проблема, не могу завершить отладочный процесс (см. комментарии к коду), где моя ошибка, подскажите пожалста, буду очень благодарен вызываю вот так: Код (Text): hDebugThread=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)_debug,hW nd,NULL,NULL); CloseHandle(hDebugThread); код, который вызывает подозрения (поправлено): Код (Text): #define THREAD_EXIT_CODE 1234 void _debug(HWND hWnd) { DWORD hOldPage=0; DWORD hINT3=0xCC; DWORD hBytes=0; HANDLE hDump=0; HANDLE hFile=0,hMap=0,hView=0; WORD hSections,i=0; char szTitle[256]; IMAGE_DOS_HEADER *hDosHeader; IMAGE_NT_HEADERS *hNtHeader; IMAGE_SECTION_HEADER *hSectionHeader; STARTUPINFO si; PROCESS_INFORMATION pi; DEBUG_EVENT de; CONTEXT ctx; ZeroMemory(&si,sizeof(STARTUPINFO)); ZeroMemory(&pi,sizeof(PROCESS_INFORMATION)); ZeroMemory(&de,sizeof(DEBUG_EVENT)); ZeroMemory(&ctx,sizeof(CONTEXT)); si.cb=sizeof(STARTUPINFO); GetStartupInfo(&si); _getfiletitle(szPath,szTitle); if(!CreateProcess(szPath,NULL,NULL,NULL,FALSE,DEBUG_PROCESS|DEBUG_ONL Y_THIS_PROCESS,NULL,NULL,&si,&pi)) { _wtlex(hWnd,"- Unable to create process: %s",szTitle); goto exit_thread; } if(!VirtualProtectEx(pi.hProcess,(LPVOID)pei.hImageBase,pei.hSizeOfIm age,PAGE_EXECUTE_READWRITE,&hOldPage)) { _wtl(hWnd,"- VirtualProtectEx failed!",TRUE); goto exit_thread1; } for(;;) { if(!WaitForDebugEvent(&de,INFINITE)) { _wtl(hWnd,"- WaitForDebugEvent failed!",TRUE); break; } if(de.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT) { ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE); if(de.u.ExitProcess.dwExitCode == THREAD_EXIT_CODE) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); _patchfile(hWnd); goto exit_thread; } else { _wtl(hWnd,"- Process was unexpectedly closed! Maybe not packed by AsPack!",TRUE); break; } } else if(de.dwDebugEventCode==EXCEPTION_DEBUG_EVENT) { if(de.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOI NT) { ctx.ContextFlags=CONTEXT_FULL; GetThreadContext(pi.hThread,&ctx); _wtlex(hWnd,"- Breakpoint reached at: %08Xh",ctx.Eip); TerminateProcess(pi.hProcess,THREAD_EXIT_CODE); } else { ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_ HANDLED); continue; } } ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE); } goto exit_thread1; error_debug3: if(hMap) CloseHandle(hMap); error_debug2: if(hFile) CloseHandle(hFile); error_debug1: if(hDump) VirtualFree(hDump,pei.hSizeOfImage,MEM_DECOMMIT); error_debug: _wtl(hWnd,"- File was not unpacked, due to error(s)!",TRUE); exit_thread1: TerminateProcess(pi.hProcess,THREAD_EXIT_CODE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); exit_thread: ExitThread(NULL); }
В обработчике EXCEPTION_DEBUG_EVENT оставь только TerminateProcess, после EXIT_PROCESS_DEBUG_EVENT надо ещё раз вызвать ContinueDebugEvent, он закроет хендлы и отлаживаемый процесс завершится, потом получишь ещё раз EXIT_PROCESS_DEBUG_EVENT, аж после него можешь сделать CloseHandle
Что-то вроде этого: Код (Text): ;===================================================================== sinfo STARTUPINFO pinfo PROCESS_INFORMATION event TDebugEvent ;===================================================================== stdcall [GetStartupInfo],sinfo stdcall [CreateProcess],0,buffer,0,0,0,DEBUG_PROCESS+\ DEBUG_ONLY_THIS_PROCESS,0,0,sinfo,pinfo or eax,eax jz error ;===================================================================== next: stdcall [WaitForDebugEvent],event,INFINITE cmp [event.dwDebugEventCode],EXIT_PROCESS_DEBUG_EVENT jz exit cmp [event.dwDebugEventCode],EXCEPTION_DEBUG_EVENT jz exception continue: stdcall [ContinueDebugEvent],[event.dwProcessId],\ [event.dwThreadId],DBG_CONTINUE jmp next ;===================================================================== exception: cmp [event.Exception.ExceptionRecord.ExceptionCode],\ EXCEPTION_BREAKPOINT jz breakpoint stdcall [ContinueDebugEvent],[event.dwProcessId],\ [event.dwThreadId],DBG_EXCEPTION_NOT_HANDLED jmp next breakpoint: stdcall [TerminateProcess],[pinfo.hProcess],THREAD_EXIT_CODE jmp continue ;===================================================================== exit: xor [event.ExitProcess.dwExitCode],THREAD_EXIT_CODE jz continue stdcall [CloseHandle],[pinfo.hThread] stdcall [CloseHandle],[pinfo.hProcess] ;=====================================================================
спасибо, поправил код (см. первый пост), вроде работает, процесс грохается и хендлы закрываются удачно, НО теперь какой-то непонятный глюк в процедуре _patchfile а именно, пытаюсь удалить файл (который был только что запущен как процесс (szPath) и был грохнут как процесс (TerminateProcess)) код возврата положительный, т.е. вроде бы файл удалён, но файл не удалён (?!), пытаюсь во время работы программы что-нибудь сделать с этим файлом начинаются зверские тормоза и в итоге получаю 'нет доступа к файлу' (процесс точно грохнут, все хендлы к нему закрыты, в списке процессов его нет), далее если завершить нормальным образом всю программу, то файл удаляется (?!), чё за ерунда?
Перед удаление надо закрыть хендл (event.CreateProcessInfo.hFile) Код (Text): ;===================================================================== cmp [event.dwDebugEventCode],CREATE_PROCESS_DEBUG_EVENT jz create ... ;===================================================================== create: mov eax,[event.CreateProcessInfo.hFile] mov [hfile],eax jmp continue ;===================================================================== exit: ... stdcall [CloseHandle],[hfile] stdcall [DeleteFile],buffer ;=====================================================================