Hi I'm trying to code a DebugBlocker, an application that monitors if its being debugged. But the code starts making many instances of itself. So you help needed, thnx in advance!

.386
.model flat, stdcall
option casemap:none

;---------------------------------------------------------------------------]
        include         \masm32\include\windows.inc
        include         \masm32\include\user32.inc
        include         \masm32\include\kernel32.inc
        include         \masm32\include\gdi32.inc
        include         \masm32\include\masm32.inc
        includelib      \masm32\lib\user32.lib
        includelib      \masm32\lib\kernel32.lib
        includelib      \masm32\lib\gdi32.lib
        includelib      \masm32\lib\masm32.lib
;---------------------------------------------------------------------------]


;---------------------------------------------------------------------------]
        WndProc         PROTO   : DWORD, : DWORD, : DWORD, : DWORD
        KeygenProc      PROTO   : DWORD
;--
        DebugThread     PROTO
;---------------------------------------------------------------------------]


.DATA
;---------------------------------------------------------------------------]
szWinCap                DB              "DebugBlocker", 0
szMsgCap                DB              "DebugBlocker", 0
szAbout                 DB              "DebugBlocker", 13, 10
                        DB              "by, Prof. DrAcULA", 0
font                    LOGFONT         <15,6,0,0,FW_BOLD>
szDefaultUser           DB              "Prof. DrAcULA", 0
szSerial                DB              "ALUcArD .forP", 0
szSpace                 DB              " ", 0
szShit                  DB              """", 0
;---------------------------------------------------------------------------]


.DATA?
;---------------------------------------------------------------------------]
hInstance               DD                      ?
hDlg                    DD                      ?
;--
pId                     DD                      ?
hdbgThread              DD                      ?
threadId                DD                      ?
cpid1                   DB                      16 DUP(?)
cpid2                   DB                      16 DUP(?)
szTemp                  DB                      255 DUP(?)
szAppLong               DB                      255 DUP(?)
szAppShort              DB                      266 DUP(?)
pif                     PROCESS_INFORMATION     <?>
sif                     STARTUPINFO             <?>
dbgr                    DEBUG_EVENT             <?>
;---------------------------------------------------------------------------]


.CONST
;---------------------------------------------------------------------------]
        ID_DIALOG               EQU             100
        ID_NAME                 EQU             105
        ID_SERIAL               EQU             106
        ID_AUTHOR               EQU             102
        ID_GENERATE             EQU             107
        ID_ABOUT                EQU             108
;---------------------------------------------------------------------------]


.CODE
;---------------------------------------------------------------------------]
START:
        invoke  GetModuleHandle, 0
        mov     hInstance, eax
        invoke  GetModuleFileName, hInstance, offset szAppLong, sizeof szAppLong
        invoke  GetShortPathName, offset szAppLong, offset szAppShort, sizeof szAppShort
        invoke  szCopy, offset szAppLong, offset szTemp
        invoke  GetCommandLine
        invoke  szRemove, eax, offset szTemp, offset szAppLong
        invoke  szRemove, offset szTemp, offset szTemp, offset szSpace
        invoke  szRemove, offset szTemp, offset szTemp, offset szShit
        invoke  szLen, offset szTemp
        .IF eax!=0
                invoke  atol, offset szTemp
                mov     pId, eax
                invoke  CreateThread, NULL, 0, addr DebugThread, 0, 0, addr threadId
        .ENDIF
        invoke  GetCurrentProcessId
        mov     pId, eax
        invoke  ltoa, pId, offset cpid1
        invoke  szCopy, offset szSpace, offset cpid2
        invoke  szCatStr, offset cpid2, offset cpid1
        invoke  CreateProcess, addr szAppShort, addr cpid2, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, addr sif, addr pif
        invoke  DialogBoxParam, hInstance, ID_DIALOG, 0, offset WndProc, 0
        invoke  ExitProcess, eax
;---------------------------------------------------------------------------]


;---------------------------------------------------------------------------]
WndProc PROC hWnd: DWORD, uMsg: DWORD, wParam: DWORD, lParam: DWORD
        mov     eax, uMsg
        cmp     eax, WM_COMMAND
        jz      _COMMAND
        cmp     eax, WM_INITDIALOG
        jz      _INITDIALOG
        cmp     eax, WM_CLOSE
        jz      _CLOSE
       
   _DEFAULT:
        xor     eax, eax
        ret
       
   _CLOSE:
        invoke  EndDialog, hWnd, 0
        xor     eax, eax
        ret
       
   _INITDIALOG:
        invoke  CreateFontIndirect,addr font
        push    ebx
        xchg    eax,ebx
        invoke  SendDlgItemMessage,hWnd,ID_AUTHOR,WM_SETFONT,ebx,1
        invoke  SendDlgItemMessage,hWnd,ID_NAME,WM_SETFONT,ebx,1
        invoke  SendDlgItemMessage,hWnd,ID_SERIAL,WM_SETFONT,ebx,1
        pop     ebx
        invoke  SetWindowText,hWnd,addr szWinCap
        push    hWnd
        pop     hDlg
        invoke  SetDlgItemText, hWnd, ID_NAME, offset szDefaultUser
        xor     eax, eax
        ret
       
   _COMMAND:
        mov     eax,wParam
        mov     edx,wParam
        shr     edx,16
        .IF wParam==ID_GENERATE
                jmp     _COMMAND_GENERATE
        .ELSEIF wParam==ID_ABOUT
                jmp     _COMMAND_ABOUT
        .ELSE
                jmp     _DEFAULT
        .ENDIF
        xor     eax, eax
        ret
       
   _COMMAND_GENERATE:
        invoke  KeygenProc, hWnd
        xor     eax, eax
        ret
       
   _COMMAND_ABOUT:
        invoke  MessageBox, hWnd, offset szAbout, offset szMsgCap, MB_OK
        xor     eax, eax
        ret
WndProc ENDP
;---------------------------------------------------------------------------]


;---------------------------------------------------------------------------]
KeygenProc      PROC    hWnd: DWORD
        invoke  SetDlgItemText, hWnd, ID_SERIAL, offset szSerial
        ret
KeygenProc      ENDP
;---------------------------------------------------------------------------]


;---------------------------------------------------------------------------]
DebugThread     PROC
        LOCAL   MainApp:DWORD
               
        invoke  OpenProcess, PROCESS_ALL_ACCESS, FALSE, pId
        mov     MainApp, eax
        invoke  DebugActiveProcess, pId
        .IF eax!=0
                invoke  TerminateProcess, MainApp, 0
                invoke  ExitProcess, 0
       .ENDIF
        .WHILE TRUE
                invoke  WaitForDebugEvent, addr dbgr, INFINITE
                .IF dbgr.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT
                        invoke  ExitProcess, 0
                .ELSE
                        invoke  ContinueDebugEvent, dbgr.dwProcessId, dbgr.dwThreadId, DBG_CONTINUE
                .ENDIF
        .ENDW
        ret 0
DebugThread     ENDP
;---------------------------------------------------------------------------]

END START
Posted on 2007-02-04 06:58:47 by profdracula
A quick look at your code..
it obtains the pathname from which it is currently executing, and then creates a process using that name .. of COURSE it starts many instances, since each instance spawns a child process, which spawns a child process, which spawns a child process... d'0h !!

I have to warn you about using Win32 debug api to monitor processes... there's no way I know of to 'detach' a debugged process from a debugger process without killing the debugged process.
The win32debug api is not the only way to monitor other processes.
Posted on 2007-02-04 23:16:39 by Homer
Thnx, but I myself managed to do it successfully  ;)
An app that can monitor/debug itself without making a zillion of self-instances.
Attachments:
Posted on 2007-02-05 04:41:21 by profdracula
and also you are not checking errors. After every call that can return error, you should check it.
Posted on 2007-02-05 11:24:45 by vid
detaching without exiting...

api :  DebugActiveProcessStop

only available in xp or higher...

takes 1 param.. the processid i think..


Posted on 2007-02-06 09:56:26 by evlncrn8
or DebugSetProcessKillOnExit. Also WIN XP and higher.
Posted on 2007-02-07 09:41:29 by ti_mo_n