1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
| .586 .model flat, stdcall option casemap :none ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> include windows.inc include kernel32.inc include user32.inc include Comctl32.inc include comdlg32.inc ;include macros.inc include masm32.inc
includelib kernel32.lib includelib user32.lib includelib Comctl32.lib includelib comdlg32.lib includelib masm32.lib
dwOrgOEP equ 00a6ee02h ;程序原始入口 BREAK_POINT1 equ 0056FF45h ;第一个断点 ;BREAK_POINT1 equ 0056FF45h ;第一个断点 .CONST DR0_ENABLED EQU 000000001b LOCAL_EXACT_BPM_ENABLED EQU 100000000b
.data FileName db 'sample.exe',0,0,0,0,0,0,0,0,0,0,0,0,0,0 int3 db 0cch value db 8 dup(?) buffer db 8 dup(?) oldbyte db 8 dup(?) szFormat db "%X",0 dwCountSS dd 0 dwCountBP dd 0 Startup STARTUPINFO <> processinfo PROCESS_INFORMATION <>
patchto90 db 2 dup(090h) patchto75 db 2 dup(075h) .data? startinfo STARTUPINFO <> pi PROCESS_INFORMATION <> DBEvent DEBUG_EVENT <> context CONTEXT <>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .code start: pushad ;******************************************************************** ; 创建进程 ;******************************************************************** invoke CreateProcess, addr FileName, NULL, NULL, NULL, FALSE, DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS, NULL, NULL, addr startinfo, addr pi .if !eax ;invoke MessageBox,hDlg,CTXT("不能创建进程"),CTXT("错误!"),MB_OK invoke ExitProcess,NULL .endif xor eax,eax mov dwCountBP, eax mov dwCountSS, eax ;******************************************************************** ; 调试进程,进入循环调试 ;******************************************************************** .while TRUE invoke WaitForDebugEvent, addr DBEvent, INFINITE .if DBEvent.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT ;invoke MessageBox, 0, CTXT("退出进程..."), CTXT("提示!"), MB_OK+MB_ICONINFORMATION .break ;******************************************************************** ; 异常中断 ;******************************************************************** .elseif DBEvent.dwDebugEventCode==EXCEPTION_DEBUG_EVENT .if DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT ;******************************************************************** ; 第一次中断时在原始入口点处设置断点 ;******************************************************************** inc dwCountBP .if dwCountBP==1 invoke ReadProcessMemory, pi.hProcess, dwOrgOEP, addr oldbyte, 1, 0 ;在dwOrgOEP中读出一个字节 invoke WriteProcessMemory, pi.hProcess, dwOrgOEP, addr int3, 1, 0 ;写入INT3断点 ;******************************************************************** ; 第二次中断,中断在起先设置的原始入口点,恢复代码,在机器码处设置硬件断点 ;******************************************************************** .elseif dwCountBP==2 mov context.ContextFlags, CONTEXT_CONTROL invoke GetThreadContext, pi.hThread, addr context dec context.regEip invoke WriteProcessMemory, pi.hProcess, dwOrgOEP, addr oldbyte, 1, 0 ;恢复入口代码 invoke SetThreadContext, pi.hThread, addr context mov context.ContextFlags, CONTEXT_DEBUG_REGISTERS invoke GetThreadContext, pi.hThread, addr context mov context.iDr0, BREAK_POINT1 ;设置硬件断点 mov context.iDr7, LOCAL_EXACT_BPM_ENABLED + DR0_ENABLED invoke SetThreadContext, pi.hThread, addr context .endif invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE .continue .elseif DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_SINGLE_STEP;0eedfadeh ;EXCEPTION_SINGLE_STEP ;单步运行模式
inc dwCountSS .IF dwCountSS == 1 ; mov context.ContextFlags, CONTEXT_FULL ; invoke GetThreadContext, pi.hThread, addr context ; mov eax,context.regEax
invoke WriteProcessMemory,pi.hProcess,056ff47h,addr patchto90,02h,NULL ; invoke WriteProcessMemory,pi.hProcess,056ff55h,addr patchto75,01h,NULL ; invoke WriteProcessMemory,pi.hProcess,056ffbah,addr patchto75,01h,NULL ; mov context.ContextFlags, CONTEXT_FULL invoke GetThreadContext, pi.hThread, addr context mov context.regEip ,056ff49h ;add EAX,01h mov context.iDr0, 0 mov context.iDr7, 0 invoke SetThreadContext,pi.hThread, addr context invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE .continue .endif invoke ContinueDebugEvent, DBEvent.dwProcessId,DBEvent.dwThreadId, DBG_CONTINUE .endif .endif invoke ContinueDebugEvent, DBEvent.dwProcessId,DBEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED .endw ;******************************************************************** ; 结束线程 ;******************************************************************** invoke CloseHandle, pi.hThread invoke CloseHandle, pi.hProcess popad ret end start
|