код утрирован,в нём обрабатывается только закрытие процесса потому что для темы это не главное синтаксис кода интуитивно должен быть понятен Код (ASM): ;--------------------------------------------------------------------- include 0.asm ;--------------------------------------------------------------------- global ssi:STARTUPINFO global spi:PROCESS_INFORMATION global sde:DEBUG_EVENT global dwContinueStatus global bContinueDebugging global Path='tst.exe' ;--------------------------------------------------------------------- fun FunTst ;--------------------------------------------------------------------- Exit ;===================================================================== ;===================================================================== ;===================================================================== func FunTst ;--------------------------------------------------------------------- fun memset,&ssi,0,68 ; sizeof STARTUPINFO mov ssi.cb,68 ; sizeof STARTUPINFO fun memset,&spi,0,16 ; sizeof PROCESS_INFORMATION ;------------------------------------------ fun CreateProcess,&Path,0,0,0,0,DEBUG_ONLY_THIS_PROCESS,0,0,&ssi,&spi mov bContinueDebugging,1 mov dwContinueStatus,DBG_CONTINUE ;------------------------------------------ while bContinueDebugging fun WaitForDebugEvent,&sde,INFINITE ;----------------------- if eax == 0 return endif ;----------------------- switch sde.dwDebugEventCode case EXIT_PROCESS_DEBUG_EVENT mov bContinueDebugging,0 endsw ;----------------------- fun ContinueDebugEvent,spi.dwProcessId,spi.dwThreadId,dwContinueStatus mov dwContinueStatus,DBG_CONTINUE endw ;--------------------------------------------------------------------- end ;===================================================================== ;===================================================================== ;===================================================================== end используемые структуры в файле - 0.asm Код (ASM): ;--------------------------------------- EXCEPTION_RECORD STRUCT ExceptionCode DWORD ? ExceptionFlags DWORD ? ExceptionRecord DWORD ? ExceptionAddress DWORD ? NumberParameters DWORD ? ExceptionInformation DWORD 15 dup(?) EXCEPTION_RECORD ENDS ;--------------------------------------- EXCEPTION_DEBUG_INFO STRUCT ExceptionRecord EXCEPTION_RECORD <?,?,?,?,?,15 dup(?)> dwFirstChance DWORD ? EXCEPTION_DEBUG_INFO ENDS ;--------------------------------------- CREATE_THREAD_DEBUG_INFO STRUCT hThread DWORD ? lpThreadLocalBase DWORD ? lpStartAddress DWORD ? CREATE_THREAD_DEBUG_INFO ENDS ;--------------------------------------- CREATE_PROCESS_DEBUG_INFO STRUCT hFile DWORD ? hProcess DWORD ? hThread DWORD ? lpBaseOfImage DWORD ? dwDebugInfoFileOffset DWORD ? nDebugInfoSize DWORD ? lpThreadLocalBase DWORD ? lpStartAddress DWORD ? lpImageName DWORD ? fUnicode WORD ? CREATE_PROCESS_DEBUG_INFO ENDS ;--------------------------------------- EXIT_THREAD_DEBUG_INFO STRUCT dwExitCode DWORD ? EXIT_THREAD_DEBUG_INFO ENDS ;--------------------------------------- EXIT_PROCESS_DEBUG_INFO STRUCT dwExitCode DWORD ? EXIT_PROCESS_DEBUG_INFO ENDS ;--------------------------------------- LOAD_DLL_DEBUG_INFO STRUCT hFile DWORD ? lpBaseOfDll DWORD ? dwDebugInfoFileOffset DWORD ? nDebugInfoSize DWORD ? lpImageName DWORD ? fUnicode WORD ? LOAD_DLL_DEBUG_INFO ENDS ;--------------------------------------- UNLOAD_DLL_DEBUG_INFO STRUCT lpBaseOfDll DWORD ? UNLOAD_DLL_DEBUG_INFO ENDS ;--------------------------------------- OUTPUT_DEBUG_STRING_INFO STRUCT lpDebugStringData DWORD ? fUnicode WORD ? nDebugStringiLength WORD ? OUTPUT_DEBUG_STRING_INFO ENDS ;--------------------------------------- RIP_INFO STRUCT dwError DWORD ? dwType DWORD ? RIP_INFO ENDS ;--------------------------------------- DEBUGSTRUCT UNION Exception EXCEPTION_DEBUG_INFO <{?,?,?,?,?,15 dup(?)},?> CreateThread CREATE_THREAD_DEBUG_INFO <?,?,?> CreateProcessInfo CREATE_PROCESS_DEBUG_INFO <?,?,?,?,?,?,?,?,?,?> ExitThread EXIT_THREAD_DEBUG_INFO <?> ExitProcess EXIT_PROCESS_DEBUG_INFO <?> LoadDll LOAD_DLL_DEBUG_INFO <?,?,?,?,?,?> UnloadDll UNLOAD_DLL_DEBUG_INFO <?> DebugString OUTPUT_DEBUG_STRING_INFO <?,?,?> RipInfo RIP_INFO <?,?> DEBUGSTRUCT ENDS ;--------------------------------------- DEBUG_EVENT STRUCT dwDebugEventCode DWORD ? dwProcessId DWORD ? dwThreadId DWORD ? u DEBUGSTRUCT <> DEBUG_EVENT ENDS ;--------------------------------------- STARTUPINFO STRUCT cb DWORD ? lpReserved DWORD ? lpDesktop DWORD ? lpTitle DWORD ? dwX DWORD ? dwY DWORD ? dwXSize DWORD ? dwYSize DWORD ? dwXCountChars DWORD ? dwYCountChars DWORD ? dwFillAttribute DWORD ? dwFlags DWORD ? wShowWindow WORD ? cbReserved2 WORD ? lpReserved2 DWORD ? hStdInput DWORD ? hStdOutput DWORD ? hStdError DWORD ? STARTUPINFO ENDS ;--------------------------------------- PROCESS_INFORMATION STRUCT hProcess DWORD ? hThread DWORD ? dwProcessId DWORD ? dwThreadId DWORD ? PROCESS_INFORMATION ENDS ;--------------------------------------- если к примеру сделать исполняемый файл - tst.exe просто с месаджбоксом то есть утрированно прописать в коде Код (ASM): fun MessageBoxA,0,'Test',0,0 Exit то этот исполняемый файл без лишних проблем откроется под - DEBUG то есть как и положено покажется месаджбокс но если сделать другой исполняемый файл а именно месаджбокс запихнуть в другую нить процесса утрированно но синтаксис - masm32 Код (ASM): CreateThread PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD ExitProcess PROTO :DWORD Sleep PROTO :DWORD FunThread PROTO ;--------------------------------------------------------------------- .data pText db 'Test',0 .code ;--------------------------------------------------------------------- invoke CreateThread,0,0,FunThread,0,0,0 invoke Sleep,3000 invoke ExitProcess,0 ;--------------------------------------------------------------------- FunThread proc invoke MessageBoxA,0,addr pText,addr pText,0 ret FunThread endp получившейся исполняемый файл спокойно работает при обычном запуске на три секунды показывается месаджбокс и программа закрывается но вот только этот исполняемый файл не хочет работать под - DEBUG точнее в диспетчере задач открыт процесс исполняемого файла - tst.exe но сам месаджбокс почему то не показывается понятно что это из за того что месаджбокс находится в другой нитке вопрос в том как это обойти Кто в теме не подскажите
Сейчас всё работает Код (ASM): ;-------------------------------------------------------------------- .686 .model flat, stdcall option casemap :none ;-------------------------------------------------------------------- include \masm32\include\user32.inc include \masm32\include\kernel32.inc ;-------------------------------------------------------------------- includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib ;-------------------------------------------------------------------- include 0.asm ;-------------------------------------------------------------------- DBG_CONTINUE EQU 00010002h DEBUG_PROCESS EQU 1h DEBUG_ONLY_THIS_PROCESS EQU 2h INFINITE EQU -1 ;-------------------------------------------------------------------- .data? sde DEBUG_EVENT <> startInfo STARTUPINFO <> processInfo PROCESS_INFORMATION <> dwContinueStatus dd ? bContinueDebugging dd ? asd dd ? .data Path db '#4.exe',0 ;-------------------------------------------------------------------- .code start: call main invoke ExitProcess,0 ;-------------------------------------------------------------------- ;-------------------------------------------------------------------- ;-------------------------------------------------------------------- main proc ;---------------------------------- invoke RtlZeroMemory,addr startInfo,sizeof startInfo mov startInfo.cb,sizeof startInfo invoke RtlZeroMemory,addr processInfo,sizeof processInfo mov dwContinueStatus,DBG_CONTINUE mov bContinueDebugging,1 ;---------------------------------- invoke CreateProcessA,addr Path,0,0,0,0,DEBUG_ONLY_THIS_PROCESS,0,0,addr startInfo,addr processInfo ;---------------------------------- .while bContinueDebugging invoke WaitForDebugEvent,addr sde,INFINITE invoke ContinueDebugEvent,sde.dwProcessId,sde.dwThreadId,dwContinueStatus mov dwContinueStatus,DBG_CONTINUE .endw ;---------------------------------- ret main endp ;-------------------------------------------------------------------- ;-------------------------------------------------------------------- ;-------------------------------------------------------------------- end start
Моя ошибка была в том что в первом коде на сороковой строчке перепутал идентификатор структуры в первых двух параметрах функции - ContinueDebugEvent там было: Код (ASM): fun ContinueDebugEvent,spi.dwProcessId,spi.dwThreadId,dwContinueStatus а нужно: Код (ASM): fun ContinueDebugEvent,sde.dwProcessId,sde.dwThreadId,dwContinueStatus Остаётся только догадываться почему одни всё таки открывались а другие нет но сейчас открываются все Тему можно считать закрытой