首页
社区
课程
招聘
[原创]WIN32汇编邮件发送学习笔记
发表于: 2013-8-12 22:22 8920

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

2013-8-12 22:22
8920
发上这两天写的一个简单的邮件发送模块源码,没什么技术含量,仅作为学习笔记共享了,注释写的还算详细吧,看看...

水平有限,自己写的一个简单的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

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (19)
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
用c的话,就别记着写窗口了,c是驱动专用,
MFC才是真正写窗口的东西~
2013-8-12 22:36
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
c语言,个人只记得这个人的

Nisy C语言

百度搜索 nisy c语言
2013-8-12 22:38
0
雪    币: 93
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
用C调用系统API不能开发界面程序吗?
2013-8-13 07:03
0
雪    币: 93
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
看过两集,不太能接受他的教学方法,so...
C语言也算是有点基础吧,看过谭浩强的C书,C与指针,C缺陷与陷阱,就是不知道C能干嘛了..
2013-8-13 07:06
0
雪    币: 101
活跃值: (43)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
c不是不能开发界面  而是比masm简单不了多少 而mfc你直接画个窗口然后给每个组件写个子程序就行了 甚至只画个窗口一句代码不写也能显示出来那种  虽然我没用过mfc
2013-8-13 07:13
0
雪    币: 93
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
用C写了几个窗口,感觉确实没比汇编简单多少,不过如果用对话框当窗体的话,也是可以画的。我学C就是为了学驱动,准备看寒江独钓,又怕功力不够...想再了解点
2013-8-13 07:19
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8

其实咱也没用过MFC,咱只用易语言开发界面~
2013-8-13 07:20
0
雪    币: 93
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
易语言不敢再碰了...
2013-8-13 07:23
0
雪    币: 808
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
Windows程序设计(第五版)上下册 (超清晰)
经典win  c  教程
2013-8-13 08:11
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
Windows程序设计(第五版)
2013-8-13 08:16
0
雪    币: 93
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
嗯,谢谢
2013-8-13 13:50
0
雪    币: 297
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
难道楼主觉得用win32汇编写窗口程序困难?
2013-8-13 14:42
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
14
汇编写驱动也是不错的
2013-8-13 19:33
0
雪    币: 6
活跃值: (1282)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
嗯。。点击保存 改天就抄来用
2013-8-13 23:22
0
雪    币: 93
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
汇编写驱动这方面的资料太少啊,C驱动是个仓库啊
2013-8-14 10:23
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
17
额 ,也是,不过汇编有一个电子书 Kmdkit教程CHM版 还不错 ,零基础的
2013-8-16 08:53
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
18
C语言和易语言的概念不同的

C语言只做为一个语言,只是代码编写规范,与界面什么东西是无关的,MFC只是对Windows 窗口操作的一个封装,实质是windows API的调用,你可以看做一款C语言的一款IDE,所以学C/C++没错,应该是编程专业的基本功吧。
2013-8-16 18:39
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
19
呵呵,C的代码都是可以转为ASM的,底层好多操作ASM更方便,虽然C可以内联汇编。
2013-8-16 18:46
0
雪    币: 101
活跃值: (43)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
其实mfc的感觉就跟易语言差不多  拼个窗口然后写每个事件
2013-8-16 23:52
0
游客
登录 | 注册 方可回帖
返回
//