smtp邮件发送程序ASM源代码
使用ASM制作的一款smtp邮件发送程序,作者asm参考了老罗的那段代码,在基础上作出了改进。作者ASM,虽然年经很轻不过内力和水平不一般,佩服。
ESMTP_ASM.rar (18.9 KiB, 335 hits)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 | ;--------------------------------------------------------- ;程序作者:asm ;信息来源:红狼安全小组 ;如欲转载,请保持文章的完整性,并且注明作者等版权信息 ;红狼安全小组 http://www.wolfexp.net/forum/ ;--------------------------------------------------------- .386 .model flat,stdcall option casemap:none include windows.inc include user32.inc include kernel32.inc include wsock32.inc include Ws2_32.inc include comdlg32.inc includelib user32.lib includelib kernel32.lib includelib wsock32.lib includelib Ws2_32.lib includelib comdlg32.lib ;--------------------------------------------------------- ; Equ 等值定义 ;--------------------------------------------------------- ICO_MAIN equ 1000h ;图标 DLG_MAIN equ 1 IDC_Server equ 1001 IDC_User equ 1002 IDC_Pass equ 1003 IDC_Sender equ 1004 IDC_RecvServer equ 1005 IDC_Recver equ 1006 IDC_FuJian equ 1007 IDC_LiuLang equ 1008 IDC_Title equ 1009 IDC_ZhengWen equ 1010 IDC_ServerRecv equ 1011 IDC_About equ 1012 Base64Encode proto :DWORD,:DWORD,:DWORD ;--------------------------------------------------------- ; 数据段 ;--------------------------------------------------------- .data ;用来方便调式的 sz1 db "smtp.163.com",0 sz2 db "asm_code",0 sz3 db "asm_code@163.com",0 szPa db "123456789",0 sz4 db "smtp.qq.com",0 sz5 db "448761813@163.com",0 sz6 db "月亮MM",0 sz7 db "喂,月亮MM,我asm来拉.....",0 szEhlo db "EHLO <%s>",13,10,0 szAUTH db "AUTH LOGIN",13,10,0 sendUserWorld db "%s",13,10,0 sendPassWorld db "%s",13,10,0 szFrom db "MAIL FROM: <%s>",13,10,0 szTo db "RCPT TO: <%s>",13,10,0 szData db "Data",13,10,0 szBody db "MAIL FROM: <%s>", 13, 10 db "RCPT TO: <%s>", 13, 10 db "Subject: <%s>", 13, 10 db "MIME_Version:1.0", 13, 10 db "Content-type:multipart/mixed;Boundary=fuckyou", 13, 10, 13, 10 db "--fuckyou", 13, 10 db "Content-type:text/plain;Charset=GB2312", 13, 10 db "Content-Transfer-Encoding:8bit", 13, 10, 13, 10 db "<%s>", 13, 10, 13, 10, 0 szBody2 db "--fuckyou", 13, 10, 0 szBody3 db "Content-Type:application/octet-stream;Name=1.rar", 0 szBody4 db 13, 10, 0 szBody5 db "Content-Disposition:attachment;FileName=", 0 szBody6 db 13, 10, 0 szBody7 db "Content-Transfer-Encoding:Base64", 13, 10, 13, 10, 0 szBody8 db 13, 10, 13, 10, 0 szEnd db "--fuckyou--",13, 10, "." , 13, 10, 0 szEnd1 db "." , 13, 10, 0 szOut db "QUIT",13,10,0 base64_alphabet db "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",0 szFilter db '选择你要打开的文件(*.*)',0,'*.*',0 szMyTitle db '选择你要打开的文件',0 szMessageTitle db '文件',0 about db "本程序使用ESMTP协议发送邮件,采用win32汇编语言编写",13,10 db "在windows下测试通过,对方可以接收到您发的邮件",13,10 db "本程序是开源的,您可以随便修改,但至少要尊重一下作者保留版权",13,10 db "程序编写 by asm[红狼安全小组]",13,10 db "http://www.wolfexp.net",13,10 db "2007-3-27",13,10,0 ok db "关于程序的一点说明",0 .data? hInstance dd ? hWinMain dd ? szServer db 256 dup(?) szUser db 156 dup(?) szPass1 db 156 dup(?) szEmail db 256 dup(?) szRecvServer db 256 dup(?) szRecver db 256 dup(?) szTitle db 256 dup(?) szZheng db 256 dup(?) szPass db 156 dup(?) szEhlo1 db 156 dup(?) sendUser db 556 dup(?) sendUser1 db 556 dup(?) sendPass db 556 dup(?) sendPass1 db 556 dup(?) szFrom1 db 156 dup(?) szTo1 db 156 dup(?) senddata db 1024 dup(?) szFujian db 224 dup(?) SendEstmpData db 5054 dup(?) ThreadId DWORD ? .const MEMORYSIZE equ 65535 ;--------------------------------------------------------- ; 代码段 ;--------------------------------------------------------- .code ;--------------------------------------------------------- ;创建一个线程来发送邮件 ;--------------------------------------------------------- _SendEsmtp proc uses ebx edi esi local @wsaData:WSADATA ;以下是此线程的局部变量 local @stAddr:sockaddr_in local hsocket:DWORD local @stFindFile:WIN32_FIND_DATA local @hFile:DWORD local @dwFileSize:DWORD local @hMapFile:DWORD local @lpMemory:DWORD local hMemory:DWORD local hMemory1:DWORD local buff[156]:DWORD pushad invoke WSAStartup,202h,addr @wsaData ;初始化WSAStartup库 .if eax!=NULL jmp close .endif invoke socket,AF_INET, SOCK_STREAM,0 ;创建一个套接字 .if eax==INVALID_SOCKET jmp close .endif mov hsocket,eax invoke gethostbyname,addr szServer ;从服务器玉米获取服务器IP .if eax==NULL jmp close .endif mov eax,[eax+hostent.h_list];取出其IP地址,因为是hostent结构的一个指针,同时又是函数返回值的一个指针, mov eax,[eax] ;所以分别取两次 mov eax,[eax] mov @stAddr.sin_addr,eax mov @stAddr.sin_family,AF_INET invoke htons,25 mov @stAddr.sin_port,ax invoke connect,hsocket,addr @stAddr,sizeof @stAddr .if eax==SOCKET_ERROR jmp close .endif invoke RtlZeroMemory,addr buff,sizeof buff invoke recv,hsocket,addr buff,256,0 .if eax==SOCKET_ERROR jmp close .elseif invoke SendDlgItemMessage,hWinMain,IDC_ServerRecv,LB_ADDSTRING,0,addr buff ;发送服务器消息到编辑框上 .endif ;发送"HELO Server\r\n" invoke RtlZeroMemory,addr szEhlo1,sizeof szEhlo1 invoke wsprintf,addr szEhlo1,addr szEhlo,addr szRecvServer invoke lstrlen,addr szEhlo1 invoke send,hsocket,addr szEhlo1,eax,0 ;发送"AUTH LOGIN\r\n" invoke lstrlen,addr szAUTH invoke send,hsocket,addr szAUTH,eax,0 ;发送经过编码的用户名 invoke Base64Encode,addr szUser,addr sendUser,156 ;其参数:编码前用户,编码后用户,编码后用户长度 invoke wsprintf,addr sendUser1,addr sendUserWorld,addr sendUser invoke lstrlen,addr sendUser1 invoke send,hsocket,addr sendUser1,eax,0 ;--------------------------------------------------------- invoke RtlZeroMemory,addr buff,sizeof buff invoke recv,hsocket,addr buff,256,0 .if eax==SOCKET_ERROR mov eax,FALSE .elseif invoke SendDlgItemMessage,hWinMain,IDC_ServerRecv,LB_ADDSTRING,0,addr buff .endif ;--------------------------------------------------------- ;发送经过编码的密码 invoke Base64Encode,addr szPass1,addr sendPass,156 invoke wsprintf,addr sendPass1,addr sendPassWorld,addr sendPass invoke lstrlen,addr sendPass1 invoke send,hsocket,addr sendPass1,eax,0 ;--------------------------------------------------------- invoke RtlZeroMemory,addr buff,sizeof buff invoke recv,hsocket,addr buff,256,0 .if eax==SOCKET_ERROR mov eax,FALSE .elseif invoke SendDlgItemMessage,hWinMain,IDC_ServerRecv,LB_ADDSTRING,0,addr buff .endif ;--------------------------------------------------------- ;发送"Mail From: " 发送者的 Mail Address invoke wsprintf,addr szFrom1,addr szFrom,addr szEmail invoke lstrlen,addr szFrom1 invoke send,hsocket,addr szFrom1,eax,0 ;--------------------------------------------------------- invoke RtlZeroMemory,addr buff,sizeof buff invoke recv,hsocket,addr buff,256,0 .if eax==SOCKET_ERROR mov eax,FALSE .elseif invoke SendDlgItemMessage,hWinMain,IDC_ServerRecv,LB_ADDSTRING,0,addr buff .endif ;--------------------------------------------------------- ;发送"RCPT TO: ",接收者的 Mail Address invoke wsprintf,addr szTo1,addr szTo,addr szRecver invoke lstrlen,addr szTo1 invoke send,hsocket,addr szTo1,eax,0 ;--------------------------------------------------------- invoke RtlZeroMemory,addr buff,sizeof buff invoke recv,hsocket,addr buff,256,0 .if eax==SOCKET_ERROR mov eax,FALSE .elseif invoke SendDlgItemMessage,hWinMain,IDC_ServerRecv,LB_ADDSTRING,0,addr buff .endif ;--------------------------------------------------------- ;发送"DATA" invoke lstrlen,addr szData invoke send,hsocket,addr szData,eax,0 ;--------------------------------------------------------- invoke RtlZeroMemory,addr buff,sizeof buff invoke recv,hsocket,addr buff,256,0 .if eax==SOCKET_ERROR mov eax,FALSE .elseif invoke SendDlgItemMessage,hWinMain,IDC_ServerRecv,LB_ADDSTRING,0,addr buff .endif ;--------------------------------------------------------- ;发送Mail Context invoke LocalAlloc, LPTR, 10000000 ; 分配内存,这里和老罗说的一样,根据具体附件大小进行分配 mov hMemory1, eax invoke wsprintf,hMemory1,addr szBody,addr szEmail,addr szTo,addr szTitle,addr szZheng invoke lstrlen,addr szFujian ;检查是否有附件,长度不为0则有. .if eax!=NULL ;因为这里要假设是否有附件和没有附件两种情况 invoke CreateFile,addr szFujian,GENERIC_READ,\ ;打开文件 FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,\ OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL .if eax != INVALID_HANDLE_VALUE mov @hFile,eax invoke GetFileSize,eax,NULL ;获取其长度 mov @dwFileSize,eax .if eax invoke CreateFileMapping,@hFile,\ ;创建一个内存映射 NULL,PAGE_READONLY,0,0,NULL .if eax mov @hMapFile,eax invoke MapViewOfFile,eax,\ ;把文件读进内存中 FILE_MAP_READ,0,0,0 .if eax mov @lpMemory,eax assume fs:nothing ;这里是创建用于处理异常错误的SEH push ebp push offset _ErrorExit push fs:[0] mov fs:[0],esp .endif .endif .endif .endif invoke LocalAlloc, LPTR, 10000000 ; 分配内存 mov hMemory, eax invoke Base64Encode,@lpMemory,hMemory,@dwFileSize ;对附件进行编码 invoke lstrcat,hMemory1,addr senddata invoke lstrcat,hMemory1,addr szBody2 invoke lstrcat,hMemory1,addr szBody3 invoke lstrcat,hMemory1,addr szFujian invoke lstrcat,hMemory1,addr szBody4 invoke lstrcat,hMemory1,addr szBody5 invoke lstrcat,hMemory1,addr szFujian invoke lstrcat,hMemory1,addr szBody6 invoke lstrcat,hMemory1,addr szBody7 invoke lstrcat,hMemory1,hMemory invoke lstrcat,hMemory1,addr szBody8 invoke lstrcat,hMemory1,addr szEnd invoke lstrlen,hMemory1 invoke send,hsocket,hMemory1,eax,0 ;发送Mail Context,这里包含了附件 invoke CloseHandle,@hFile invoke CloseHandle,@hMapFile invoke UnmapViewOfFile,@lpMemory invoke GlobalFree, hMemory invoke GlobalFree, hMemory1 invoke RtlZeroMemory,addr szFujian,sizeof szFujian ;清空,如果要发附件,则再次选择 .elseif ;如果没有附件,就直接发送内容 invoke RtlZeroMemory,addr szFujian,sizeof szFujian invoke lstrcat,addr SendEstmpData,hMemory1 invoke lstrcat,addr SendEstmpData,addr szEnd1 invoke lstrlen,addr SendEstmpData invoke send,hsocket,addr SendEstmpData,eax,0 .endif ;--------------------------------------------------------- invoke RtlZeroMemory,addr buff,sizeof buff invoke recv,hsocket,addr buff,256,0 .if eax==SOCKET_ERROR mov eax,FALSE .elseif invoke SendDlgItemMessage,hWinMain,IDC_ServerRecv,LB_ADDSTRING,0,addr buff .endif ;--------------------------------------------------------- ;发送"QUIT" invoke lstrlen,addr szOut invoke send,hsocket,addr szOut,eax,0 ;--------------------------------------------------------- invoke RtlZeroMemory,addr buff,sizeof buff invoke recv,hsocket,addr buff,256,0 .if eax==SOCKET_ERROR mov eax,FALSE .elseif invoke SendDlgItemMessage,hWinMain,IDC_ServerRecv,LB_ADDSTRING,0,addr buff .endif ;--------------------------------------------------------- invoke closesocket,hsocket invoke WSACleanup jmp close _ErrorExit: pop fs:[0] add esp,0ch invoke UnmapViewOfFile,@lpMemory jmp close close: popad ret _SendEsmtp endp ;--------------------------------------------------------- ;函数功能:进行Base64编码 ;入口参数: ; source = 传入的字符串 ; sourcelen = 传入的字符串的长度 ;出口参数: ; destination = 返回的编码 ;--------------------------------------------------------- Base64Encode proc uses ebx edi esi source:DWORD, destination:DWORD, sourcelen:DWORD mov esi, source mov edi, destination @@base64loop: xor eax, eax .if sourcelen == 1 lodsb ;source ptr + 1 mov ecx, 2 ;bytes to output = 2 mov edx, 03D3Dh ;padding = 2 byte dec sourcelen ;length - 1 .elseif sourcelen == 2 lodsw ;source ptr + 2 mov ecx, 3 ;bytes to output = 3 mov edx, 03Dh ;padding = 1 byte sub sourcelen, 2 ;length - 2 .else lodsd mov ecx, 4 ;bytes to output = 4 xor edx, edx ;padding = 0 byte dec esi ;source ptr + 3 (+4-1) sub sourcelen, 3 ;length - 3 .endif xchg al,ah ;flip eax completely rol eax, 16 ;can this be done faster xchg al,ah @@: push eax and eax, 0FC000000h ;get the last 6 high bits rol eax, 6 ;rotate them into al mov al, byte ptr [offset base64_alphabet + eax] ;get encode character stosb pop eax shl eax, 6 ;shift left 6 bits dec ecx jnz @B ;loop cmp sourcelen, 0 jnz @@base64loop ;main loop mov eax, edx ;add padding and null terminate stosd ret Base64Encode endp ;--------------------------------------------------------- _GetFile proc local @stOF:OPENFILENAME local @stES:EDITSTREAM ;******************************************************************** ; 显示“打开文件”对话框,这里选择附件 ;******************************************************************** invoke RtlZeroMemory,addr @stOF,sizeof @stOF mov @stOF.lStructSize,sizeof @stOF push hWinMain pop @stOF.hwndOwner mov @stOF.lpstrFilter,offset szFilter mov @stOF.lpstrFile,offset szFujian mov @stOF.nMaxFile,MAX_PATH mov @stOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST mov @stOF.lpstrDefExt,offset szMessageTitle invoke GetOpenFileName,addr @stOF ret _GetFile endp ;--------------------------------------------------------- ;主程序代码 ;--------------------------------------------------------- _ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam mov eax,wMsg .if eax == WM_CLOSE invoke EndDialog,hWnd,NULL .elseif eax == WM_INITDIALOG invoke LoadIcon,hInstance,ICO_MAIN invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax invoke SetDlgItemText,hWnd,IDC_Server,addr sz1 invoke SetDlgItemText,hWnd,IDC_User,addr sz2 invoke SetDlgItemText,hWnd,IDC_Pass,addr szPa invoke SetDlgItemText,hWnd,IDC_Sender,addr sz3 invoke SetDlgItemText,hWnd,IDC_RecvServer,addr sz4 invoke SetDlgItemText,hWnd,IDC_Recver,addr sz5 invoke SetDlgItemText,hWnd,IDC_Title,addr sz6 invoke SetDlgItemText,hWnd,IDC_ZhengWen,addr sz7 .elseif eax == WM_COMMAND mov eax,wParam push hWnd pop hWinMain .if ax == IDOK invoke RtlZeroMemory,addr szServer,sizeof szServer invoke RtlZeroMemory,addr szUser,sizeof szUser invoke RtlZeroMemory,addr szPass1,sizeof szPass1 invoke RtlZeroMemory,addr szEmail,sizeof szEmail invoke RtlZeroMemory,addr szRecvServer,sizeof szRecvServer invoke RtlZeroMemory,addr szRecver,sizeof szRecver invoke RtlZeroMemory,addr szTitle,sizeof szTitle invoke RtlZeroMemory,addr szZheng,sizeof szZheng invoke GetDlgItemText,hWnd,IDC_Server,addr szServer,sizeof szServer invoke GetDlgItemText,hWnd,IDC_User,addr szUser,sizeof szUser invoke GetDlgItemText,hWnd,IDC_Pass,addr szPass1,sizeof szPass1 invoke GetDlgItemText,hWnd,IDC_Sender,addr szEmail,sizeof szEmail invoke GetDlgItemText,hWnd,IDC_RecvServer,addr szRecvServer,sizeof szRecvServer invoke GetDlgItemText,hWnd,IDC_Recver,addr szRecver,sizeof szRecver invoke GetDlgItemText,hWnd,IDC_Title,addr szTitle,sizeof szTitle invoke GetDlgItemText,hWnd,IDC_ZhengWen,addr szZheng,sizeof szZheng invoke CreateThread,NULL,0,addr _SendEsmtp,0,0,addr ThreadId .elseif ax == IDC_LiuLang invoke GetDlgItemText,hWnd,IDC_FuJian,addr szFujian,sizeof szFujian call _GetFile invoke SetDlgItemText,hWnd,IDC_FuJian,addr szFujian .elseif ax == IDC_About invoke MessageBox,NULL,addr about,addr ok,MB_ICONINFORMATION .endif .else mov eax,FALSE ret .endif mov eax,TRUE ret _ProcDlgMain endp ;--------------------------------------------------------- start: invoke GetModuleHandle,NULL mov hInstance,eax invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL invoke ExitProcess,NULL ;--------------------------------------------------------- end start |
评论已关闭。