欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

用汇编构造sprintf函数

用汇编构造sprintf函数

使用汇编构造sprintf函数。
我没有去逆向sprintf函数,主要是过程太多了,并且只要知道运算结果就能大概推算出过程了。
以下构造并不完整,但能实现sprintf函数大多数功能,比如字符串中的'%%'解析为'%','%x'解析为十六进制单字节数,'%X'解析为十六进制双字数,'%d'解析为十进制数,其他的出于时间关系,我就没写了。
另外,为了方便调用,我将过程写为__stdcall调用方式,也算是__stdcall的sprintf吧。。。
在使用前应该加上两个宏:
put macro
    mov     byte ptr [ebp+ecx+08h], al
endm
get macro
    mov     al, byte ptr [ebp+ebx+0ch]
endm
put就是向新指针写入一字节,get就是向老字符串读取一字节
目前暂时只能处理ANSI格式字符串,不过对于不熟悉Unicode的童鞋们也够了
废话不多说,上源码:

;void sprintf(LPCTSTR lpFormatStr, LPCSTR lpStr, ...)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sprintf:
    push    ebp
    mov     ebp, esp
    ;无局部变量
    xor     ebx, ebx                              ;格式化前指针
    xor     ecx, ecx                              ;格式化后指针
    mov     edx, 0ch                              ;参数指针
@@1:                                              ;主循环
    inc     ecx
    get
    cmp     al, 0
    jz      @@end
    .if     al == '%'
        inc     ebx
        add     edx, 04h
        get
        .if     al == 'x'
            mov     al, '0'
            put
            inc     ecx
            mov     al, 'x'
            put
            xor     eax, eax
            mov     al, byte ptr [ebp+edx]
            ror     eax, 4
            .if     al > 9
                add     al, 37h
            .else
                add     al, 30h
            .endif
            inc     ecx
            put
            rol     eax, 4
            .if     al > 9
                add     al, 37h
            .else
                add     al, 30h
            .endif
            inc     ecx
            put
        .elseif al == 'X'
            mov     al, '0'
            put
            inc     ecx
            mov     al, 'x'
            put
            mov     eax, dword ptr [ebp+edx]
            push    edx
            mov     edx, 8
            .while  edx > 0
                push    eax
                dec     edx
                lea     edx, [edx*4]
                ror     eax, edx
                and     al, 0fh
                .if     al > 9
                    add     al, 37h
                .else
                    add     al, 30h
                .endif
                inc     ecx
                put
                pop     eax
            .endw
            pop     edx
        .elseif al == 'd'
            mov     eax, dword ptr [ebp+edx]
            push    ebx
            push    edx
            xor     ebx, ebx
            .while  eax > 0
                mov     edx, 0ah
                div     edx
                push    edx
                inc     ebx
            .endw
            .while ebx > 0
                pop     eax
                inc     ecx
                put
                dec     ebx
            .endw
            pop     edx
            pop     ebx
        .elseif al == '%'
            sub     edx, 04h
            put
        .endif
    .else
        put
    .endif
    inc     ebx
    jmp     @@1
@@end:                                              ;循环结束
    inc     ecx
    xor     al, al
    put
    leave
    sub     edx, 04h
    sub     esp, edx
    ret

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功