2022-01-07调试器00
请注意,本文编写于 326 天前,最后修改于 328 天前,其中某些信息可能已经过时。

目录


命令处理

asm
.386
.model flat, stdcall
option casemap:none

include ollycrdebugger.inc



.data
    g_szCmdBuf db MAXBYTE dup(0)
    g_szErrCmd db "错误的命令", 0dh, 0ah, 0

.code

SkipWhiteChar proc uses edi pCommand:dword  ;跳过空白字符
     mov edi,pCommand
     .while byte ptr[edi] == ' ' || byte ptr [edi] == 9 ;9是tab键
         add edi,1
     .endw
     mov eax,edi
     ret
SkipWhiteChar endp


ParseCommand proc uses esi
    LOCAL @dwStatus:DWORD
    LOCAL @pCmd:DWORD
    LOCAL @pEnd:DWORD

    mov @dwStatus, DBG_CONTINUE

    ;解析
    .while TRUE
        ;获取一行
        invoke crt_gets, offset g_szCmdBuf

        ;跳过命令前面的空白字符
        invoke SkipWhiteChar,offset g_szCmdBuf
        mov @pCmd, eax

        ;判断命令
        mov esi, @pCmd
        .if byte ptr [esi]=='b' && byte ptr [esi+1]=='p'

            add @pCmd, 2;跳过bp字符

            mov esi, @pCmd
            .if byte ptr [esi] == 'l' ;显示断点列表
                invoke ListBreakPoint

            .elseif byte ptr[esi] == 'c' ;清除断点
                inc @pCmd
                invoke SkipWhiteChar, @pCmd
                mov @pCmd, eax

                ;解析bpc命令序号
                invoke crt_strtoul, @pCmd, addr @pEnd, 10 ;转16进制数值
                mov edx, @pEnd
                .if @pCmd == edx
                    invoke crt_printf, offset g_szErrCmd
                    .continue
                .endif

                invoke DelBreakPoint,eax

            .else     ;设置断点
                invoke SkipWhiteChar, @pCmd
                mov @pCmd, eax

                ;解析bp命令地址
                invoke crt_strtoul, @pCmd, addr @pEnd, 16 ;转16进制数值
                mov edx, @pEnd
                .if eax == 0 || @pCmd == edx
                    invoke crt_printf, offset g_szErrCmd
                    .continue
                .endif

                ;设置断点
                invoke SetBreakPoint, eax, FALSE

            .endif

        .elseif byte ptr [esi]=='u'
        .elseif byte ptr [esi]=='g'
            mov eax, DBG_CONTINUE
            ret
        .elseif byte ptr [esi]=='t'

        .else
            invoke crt_printf, offset g_szErrCmd;
        .endif
    .endw

    mov eax, @dwStatus
    ret

ParseCommand endp

end

本文作者:Na1r

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!