欢迎来到 嗅灵易学

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

[原创]WIN32汇编邮件发送学习笔记

[原创]WIN32汇编邮件发送学习笔记

发上这两天写的一个简单的邮件发送模块源码,没什么技术含量,仅作为学习笔记共享了,注释写的还算详细吧,看看...
水平有限,自己写的一个简单的Base64编码函数:
;按Base64编码方式加密字符串
;参数:
;_lpSource:源字符地址                _lpDest:加密后的字符串存放缓冲区                _len:源字符串长度
Base64Encode        proc        _lpSource, _lpDest, _len
local        dwCount:DWORD        ;记录3位一次字节处理次数
local        dwYuShu:DWORD        ;被3位整除剩余的字节数
local        index:DWORD                ;记录当前正在处理的位置
        pushad
                mov esi, _lpSource        ;源字符地址
                mov edi, _lpDest                ;目的字符缓冲区
               
                ;求出余数和3位一次处理循环次数
                xor edx, edx
                mov eax, _len
                mov ecx, 3
                div cx
                mov dwCount, eax        ;循环次数
                mov dwYuShu, edx        ;余数保存
               
                mov index, 1        ;表示当前处理第一位
                .while dwCount != 0
                        .while TRUE
                                xor eax, eax
                                .if index == 1                ;第一位6Bit字符处理
                                        lodsb
                                        shr al, 2                ;源第一字节右移两位,去掉低2位,高2位补零
                                        mov al, BYTE ptr [offset base64_alphabet + eax]
                                        stosb                                ;填充字符到目的缓冲区
                                        add index, 1        ;索引加一,表示将要处理下一字符
                               
                                .elseif index == 2        ;第二位6Bit字符处理
                                        dec esi                                ;根据源字节的第一个字节和第二个字节联合处理。
                                        lodsw                                        ;规则:
                                        and al, 3                        ;第一个字节高6位去掉左移四位,第二个字节右移四位
                                        shl al, 4
                                        shr ah, 4
                                        add al, ah                        ;即:源第一字节低2位 + 源第2字节高4位
                                        and ax, 0FFH                ;清除AX中高8位无用数据
                                        mov al, BYTE ptr [offset base64_alphabet + eax]
                                        stosb                                        ;填充字符到目的缓冲区
                                        add index, 1
                                       
                                .elseif index == 3        ;第三位6Bit字符处理
                                        dec esi                                ;根据源字节的第二个字节和第三个字节联合处理
                                        lodsw                                        ;规则:第二个字节去掉高4位并左移两位(得高6位),第三个字节右移6位并去掉高6位(得低2位),相加即可
                                        and al, 0FH                        ;去除源第二字节高4位
                                        shl al, 2                       
                                        shr ah, 6                        ;第三字节右移6位
                                        and ah, 3                        ;去除高6位,只保留低两位 AND 00000011B
                                        add al, ah
                                        and ax, 0FFH                ;清除AX中高8位无用数据
                                        mov al, BYTE ptr [offset base64_alphabet + eax]
                                        stosb                                        ;填充字符到目的缓冲区
                                        add index, 1
                                .else                                ;第四个6Bit字符的处理       
                                        dec esi                ;源第三字节去掉高2位即可
                                        lodsb
                                        and al, 3FH        ;去除高两位
                                        mov al, BYTE ptr [offset base64_alphabet + eax]
                                        stosb                        ;填充字符到目的缓冲区
                                        mov index, 1
                                        .break                ;跳出3位一次的处理循环
                                .endif
                        .endw
                        dec dwCount               
                .endw       
               
                ;处理剩余的需要补齐的字节
                .if dwYuShu == 1                ;需要补齐两个字节'=='
                        ;按第一个字节的处理方式正常处理
                        xor eax, eax
                        lodsb
                        shr al, 2
                        mov al, BYTE ptr [offset base64_alphabet + eax]
                        stosb
                       
                        ;按第二个字节的处理方式正常处理
                        xor eax, eax
                        dec esi
                        lodsw
                        and al, 3
                        shl al, 4
                        shr ah, 4
                        add al, ah
                        and ax, 0FFH
                        mov al, BYTE ptr [offset base64_alphabet + eax]
                        stosb
                       
                        ;填充2个字节'=='
                        mov ax, 3D3DH
                        stosw
                .elseif dwYuShu == 2                        ;需要补齐一个字节'='
                        ;按第一个字节的处理方式正常处理
                        xor eax, eax
                        lodsb
                        shr al, 2
                        mov al, BYTE ptr [offset base64_alphabet + eax]
                        stosb
                       
                        ;按第二个字节的处理方式正常处理
                        xor eax, eax
                        dec esi
                        lodsw
                        and al, 3
                        shl al, 4
                        shr ah, 4
                        add al, ah
                        and ax, 0FFH
                        mov al, BYTE ptr [offset base64_alphabet + eax]
                        stosb
                       
                        ;按第三个字节的处理方式正常处理
                        dec esi
                        lodsw
                        and al, 0FH
                        shl al, 2
                        shr ah, 6
                        and ah, 3
                        add al, ah
                        and ax, 0FFH
                        mov al, BYTE ptr [offset base64_alphabet + eax]
                        stosb
                       
                        ;补齐一个字节'='
                        mov al, 3DH
                        stosb
                .endif
               
        popad
        ret
Base64Encode        endp
有错误和建议,欢迎提出
另外 求推荐好的C语言学习资料,最好是WIN32带界面的程序开发,不胜感激!
源码
EmailDll.rar

上传的附件 EmailDll.rar

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

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

0 0 0 举报
复制成功