xieglt 发表于 2016-9-28 18:28:47

新人报道,分享一段代码,请多关照

这段代码的作用就是以MessageBox 的方式显示一个 DWORD 的16进制值。
供调试用的。

.386
.MODEL FLAT

INCLUDE WINDOWS.INC
INCLUDELIB IMPORT32.LIB

EXTRN        ExitProcess:PROC
EXTRN        MessageBoxA:PROC
EXTRN        LoadLibraryA:PROC
EXTRN        GetProcAddress:PROC

.Data
        user32                        DB        "User32.Dll",0
        szMessageBoxA                DB        "MessageBoxA",0
        ddMessageBoxA        DD        0

.Code

_Start:
        PUSH        OFFSET user32
        CALL        LoadLibraryA

        PUSH        OFFSET szMessageBoxA
        PUSH        EAX
        CALL        GetProcAddress

        PUSH        EAX
        PUSH        012345678H
        CALL        _ShowDWORD
       
        PUSH        0
        CALL        ExitProcess

;***********************************************************
;        _ShowDWORD PROC stdcall,dd2Show:DWORD,addrOfMBA:DWORD
;        功能:                用MessageBox的方式显示一个双字的16进制值
;        参数说明:
;                                dd2Show:        要显示的双字
;                                addrOfMBA:        API MessageBoxA 的地址
;        调用方式:       
;                                PUSH        addrOfMBA
;                                PUSH        dd2Show
;                                CALL        _ShowDWORD
;***********************************************************
_ShowDWORD        PROC
        PUSH        EBP
        MOV                EBP,ESP

        SUB                ESP,12

        PUSH        EAX
        PUSH        ECX
        PUSH        EDI
        PUSHF
       
        STD

        MOV                EDI,EBP
        DEC                EDI
       
        MOV                AL,0
        STOSB
        MOV                AL,'H'
        STOSB
       
        MOV                EAX,DWORD PTR
        MOV                ECX,8

_Hex2Ascii:
        PUSH        EAX
        AND                AL,0FH
        ADD                AL,030H
        CMP                AL,039H
        JLE                _IsNumber
        ADD                AL,7
_IsNumber:
        STOSB
        POP                EAX
        SHR                EAX,4
        LOOP        _Hex2Ascii
       

        MOV                AL,'X'
        STOSB
        MOV                AL,'0'
        STOSB

        INC                EDI
        CLD

        PUSH        0
        PUSH        0
        PUSH        EDI
        PUSH        0
        CALL                DWORD PTR
        ;如果不是在壳之类的代码中,这里可以改成 CALLMessageBoxA
       
        POPF
        POP                EDI
        POP                ECX
        POP                EAX
       
        ADD                ESP,12
        MOV                ESP,EBP
        POP                EBP
        RET                8
_ShowDWORD        ENDP

End _Start
页: [1]
查看完整版本: 新人报道,分享一段代码,请多关照