用CreateProcess创建一个进程,然后用WriteProcessMemory向被调试程序调用的一个dll代码中写入断点,无法成功。但是向被调试程序本身的代码中写断点可以成功。如何向dll中写入断点才能成功,求助。
以下是代码
.data?
align dword
stCT CONTEXT <?>
stDE DEBUG_EVENT <?>
stStartUp STARTUPINFO <>
stProcInfo PROCESS_INFORMATION <>
dwTemp dd ?
szBuffer db 1024 dup (?)
szTmpBuffer db 512 dup (?)
.const
szFormat db 'String:%0x',0
dbPatched db 90h,90h
dbInt3 db 0cch
dbOldByte db 0c3h
szExecFilename db 'test.exe',0
szErrExec db '无法装载执行文件!',0
szCaption db '谢谢',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
Start:
;********************************************************************
; 创建进程
;********************************************************************
invoke GetStartupInfo,addr stStartUp
invoke CreateProcess,offset szExecFilename,NULL,NULL,NULL,NULL,\
DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS,NULL,NULL,\
offset stStartUp,offset stProcInfo
.if !eax
invoke MessageBox,NULL,addr szErrExec,NULL,MB_OK or MB_ICONSTOP
invoke ExitProcess,NULL
.endif
;********************************************************************
; 调试进程
;********************************************************************
.while TRUE
invoke WaitForDebugEvent,addr stDE,INFINITE
.break .if stDE.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT
;********************************************************************
; 如果进程开始,则将入口地址处的代码改为 int 3 断点中断
;********************************************************************
.if stDE.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT
invoke WriteProcessMemory,stProcInfo.hProcess,BREAK_POINT1,addr dbInt3,1,addr dwTemp
.if !eax
invoke wsprintf,addr szTmpBuffer,addr szFormat,eax
invoke MessageBox,NULL,addr szTmpBuffer,addr szCaption,MB_OK
.endif
;********************************************************************
; 如果发生断点中断,则恢复断点处代码并进行内存补丁
;********************************************************************
.elseif stDE.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
.if stDE.u.Exception.pExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT
mov stCT.ContextFlags,CONTEXT_FULL
invoke GetThreadContext,stProcInfo.hThread,addr stCT
.if stCT.regEip == BREAK_POINT1 + 1
dec stCT.regEip
mov eax,stCT.regEip
invoke wsprintf,addr szTmpBuffer,addr szFormat,eax
invoke MessageBox,NULL,addr szTmpBuffer,addr szCaption,MB_OK
invoke WriteProcessMemory,stProcInfo.hProcess,\
invoke SetThreadContext,stProcInfo.hThread,addr stCT
.endif
.endif
.endif
invoke ContinueDebugEvent,stDE.dwProcessId,stDE.dwThreadId,DBG_CONTINUE
.endw
invoke CloseHandle,stProcInfo.hProcess
invoke CloseHandle,stProcInfo.hThread
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end Start
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)