首页
社区
课程
招聘
[求助]会调试API的前辈请看看
发表于: 2011-6-3 02:10 5863

[求助]会调试API的前辈请看看

2011-6-3 02:10
5863
用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

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
2
为啥不C啊?看哈加密解密第3版,一定要汇编。哎。潮流趋势
2011-6-3 07:23
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
help me
2011-6-3 08:38
0
雪    币: 258
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
VirtualProtectEx修改写入目标区域的保护权限
2011-6-3 09:34
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
大哥,具体怎么用吗
2011-6-3 09:40
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
6
不会玩汇编,只会简单的,写程序就。。。。。
2011-6-3 13:36
0
雪    币: 1432
活跃值: (3037)
能力值: ( LV9,RANK:156 )
在线值:
发帖
回帖
粉丝
7
invoke  WriteProcessMemory,stProcInfo.hProcess,BREAK_POINT1,addr dbInt3,1,addr dwTemp

BREAK_POINT1 是内存地址   应该是 "1" 开头的。
2011-6-3 15:47
0
雪    币: 193
活跃值: (64)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
呵呵C3没有真正写入到DLL中!
2011-6-5 21:34
0
雪    币: 677
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
发生CREATE_PROCESS_DEBUG_EVENT时,进程刚创建,被调试程序只加载了ntdll.dll  一般来说要下断点的那个dll还没加载 那个内存地址是无效的。试试在LOAD_DLL_DEBUG_EVENT时进行判断并写内存
2011-6-6 01:45
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
试验了下,成功了,谢谢大侠
2011-6-11 03:38
0
游客
登录 | 注册 方可回帖
返回
//