;-mail.asm-v0.3-------------------------------------------------------------- ; x86 - Dos & Win32 - Assembly Language Programming ; ; ; ; Written by: John A Lyons (megablast) ; ; Email : asm@megablast.8k.com ; ; Page : http://asmsource.8k.com/ ; ; Compiler : Masm32 v6.13 Microsoft Macro Assembler ; ; Date : 11-Jul-2001 ; ; Purpose : A program that checks your email POP3 accounts, telling you ; ; if you have any unread mail. ; ; ; ; !!!Program will not work until you assign correct server, ; ; username and password in MAIL.INI!!!!!! ; ; ; ; v0.1 : This stage manages to contact mail server. Does nothing ; ;(27Aug2001): useful at this point, but details how to set up a connection. ; ; Very early days yet!!! But this is the hard bit, as far as ; ; im concerned!!! (Gotta love those exclamation marks) ; ; ; ; v0.2 : Updated About box. ; ;(31Aug2001) Added better icon. ; ; Better window dialog. ; ; Got stages working on one mailbox. ; ; ; ; v0.3 : Contacts multiple mailboxes. ; ; (1Sep2001) Detects errors: Host not Found ; ; Incorrect Password ; ; Fixed major error of only allowing 256 byter per mailbox, ; ; increased to 512 ; ; ; ;---------------------------------------------------------------------------- ; Compile with nmake .386 .MODEL FLAT, STDCALL include windows.inc include user32.inc include kernel32.inc include comctl32.inc include gdi32.inc includelib kernel32.lib includelib user32.lib includelib comctl32.lib includelib gdi32.lib include shell32.inc includelib shell32.lib include advapi32.inc includelib advapi32.lib include wsock32.inc includelib wsock32.lib EXTRN wsprintfA:PROC ; ---------- procedures declared later HyperLinkWndProc PROTO :HWND, :DWORD, :DWORD, :DWORD regget proto regstring:DWORD regset proto regstring:DWORD,number:DWORD dofind proto searchstring:DWORD WinMain PROTO hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdShow:SDWORD openini proto hWnd:HWND stages proto lParam:LPARAM .CONST IDI_ICON1 equ 5 IDC_TAB1 EQU 1011 ;------------------------- buttons IDC_EXIT equ 3002 ;IDC_HIDE equ 3000 IDC_GO equ 1015 ;------------------------- menu IDM_FAST equ 32000 IDM_SLOW equ 32001 IDM_EXIT equ 32003 IDM_ABOUT equ 32002 ;------------------------- About IDC_URL equ 9 IDI_CUR1 equ 101 IDI_BITMAP equ 102 ;------------------------- Search IDC_EDIT1 equ 1012 IDC_EDIT2 equ 1013 IDC_LIST equ 1014 IDC_UPDATE equ 1016 IDC_UPDATE2 equ 1019 IDD_LOAD equ 507 STAGE1 equ 28000 STAGE2 equ 28100 STAGE3 equ 28200 sc db "Contacting..",0 s1 db "stage 1",0 s2 db "stage 2",0 s3 db "stage 3",0 s4 db "stage 4",0 s5 db "stage 5",0 s6 db "stage 6",0 s7 db "stage 7",0 errornum db "Error %lu",0 hostnotfound db "Host Not Found",0 outmsg_00 db 'USER %s', 0dh, 0ah, 0 outmsg_01 db 'PASS %s', 0dh, 0ah, 0 outmsg_02 db 'STAT', 0dh, 0ah, 0 outmsg_03 db 'RETR %u', 0dh, 0ah, 0 outmsg_quit db 'QUIT', 0dh, 0ah, 0 .DATA wmenu dd ? MainDlgName DB "MAINWINDOW",0 aboutdialog DB "ABOUTDIALOG",0 searchcount dd 0 num1 db "%%" num2 db "%lu",0 hInstance HINSTANCE ? CommandLine LPSTR ? mem1 db "Load %%%lu",0 runcount1 db "Searches %lu",0 buff db 256 dup(?) menuhand DWORD ? first BOOL FALSE ;------------------------- Options ontop BOOL FALSE windowmove BOOL TRUE ;------------------------- Popup Menu IDM_ONTOP equ 2 IDM_UPDATE equ 3 ;IDM_EXIT equ 1 ;IDM_ABOUT equ 4 IDM_SEARCH equ 5 pick1 db "Always On Top",0 pick2 db "Update Title",0 about db "About",0 exit db "Exit",0 ;------------------------- About hover BOOL ? ;first BOOL FALSE szOpen db "open",0 hwndDlg dd 0 first2 BOOL FALSE hFinger dd ? orgStatic dd ? tabwin dd ? newload BOOL TRUE memoryload dd ? mainhwnd HANDLE ? ItemStruct TC_ITEM WhichTabChosen DWORD ? ;-------------------------------- Registry regstring2 db "SearchCount",0 regstring1 db "xpos",0 regstring3 db "ypos",0 subkeyname db "Software\MegaMail",0 xpos dd NULL ypos dd NULL IDB_MAIN equ 102 memhand dword ? filesize dword ? mem dword ? sizeread dword ? ;-------------------------------- .ini Info ininame db "mail.ini",0 openok BOOL FALSE inidata db "acco" db "pop3" db "name" db "pass" db "smtp" temp dd ? memdata dword ? parts dword ? memmax dword ? index dword ? memserver dword ? mems dword ? memsdata dword ? ;-------------------------------- Search hlistview dd ? szname db "Name",0 szpop3 db "POP3 Server",0 szuser db "User Name",0 szpass db "Password",0 szsmtp db "SMTP Server",0 szprog db "Progress",0 szerror db "Errors",0 szmess db "Messages",0 sznopass db "Incorrect Pass",0 szadd db "add me",0 icc INITCOMMONCONTROLSEX ;-------------------------------- Search fmem dd ? listcount dd 0 filetype db "*.*",0 dirback db "..",0 searchfor db 100 dup(0) currentdir db 128 dup(0) searchdir db 128 dup(0) .CODE start: INVOKE GetModuleHandle, NULL MOV hInstance,EAX INVOKE WinMain, hInstance,NULL,SW_SHOWDEFAULT INVOKE ExitProcess,EAX WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdShow:SDWORD invoke InitCommonControlsEx, ADDR icc MOV EAX, OFFSET DlgProc INVOKE DialogBoxParam, hInst, OFFSET MainDlgName,NULL,EAX,NULL mov eax,hInst mov hInstance,eax RET WinMain endp AddCol proc hwndListView:DWORD, iColIndex:DWORD, iColMask:DWORD, iColFormat:DWORD, iColImage:DWORD, iColWidth:DWORD, pszColText:DWORD LOCAL lcNew:LVCOLUMN mov eax,[iColMask] mov [lcNew.imask],eax mov eax,[iColImage] mov [lcNew.iImage],eax mov eax,[iColFormat] mov [lcNew.fmt],eax mov eax,[iColWidth] mov [lcNew.lx],eax mov eax,[iColIndex] mov [lcNew.iSubItem],eax mov eax, [pszColText] mov [lcNew.pszText], eax invoke lstrlen, eax mov [lcNew.cchTextMax], eax and [lcNew.iOrder], 0 invoke SendMessage, [hwndListView], LVM_INSERTCOLUMN, [iColIndex], ADDR lcNew ret AddCol endp AddItem proc hwndListView:DWORD, iItemIndex:DWORD, iSubItemIndex:DWORD, iItemMask:DWORD, iItemImage:DWORD, iItemIndent:DWORD, lParam:DWORD, pszItemText:DWORD, lenItemText:DWORD, bAction:BYTE LOCAL liNew:LV_ITEM ; typedef struct _LV_ITEM { ; UINT mask; ; int iItem; ; int iSubItem; ; UINT state; ; UINT stateMask; ; LPTSTR pszText; ; int cchTextMax; ; int iImage; // index of the list view item's icon ; LPARAM lParam; // 32-bit value to associate with item ; } LV_ITEM; mov eax, [iItemMask] mov [liNew.imask],eax mov eax,[iItemIndex] mov [liNew.iItem],eax mov eax, [iSubItemIndex] mov [liNew.iSubItem],eax mov eax, [iItemImage] mov [liNew.iImage],eax mov eax,[lParam] ; mov [liNew.lParam],eax mov [liNew.lParam],eax mov edx, [pszItemText] mov [liNew.pszText], edx mov eax, [lenItemText] mov [liNew.cchTextMax], eax .if !eax invoke lstrlen, edx mov [liNew.cchTextMax], eax .endif and [liNew.state], 0 and [liNew.stateMask], 0 cmp [bAction],0 je newone invoke SendMessage, [hwndListView], LVM_INSERTITEM, 0, ADDR liNew ret newone: invoke SendMessage, [hwndListView], LVM_SETITEM, 0, ADDR liNew ret AddItem endp DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:DWORD LOCAL rect:RECT LOCAL Disp :DWORD LOCAL pKey :DWORD LOCAL Temp :DWORD mov eax,uMsg .if ax==WM_CLOSE bigclose: invoke GetWindowRect,hWnd,ADDR rect mov eax,rect.top mov eax,rect.left mov eax,[searchcount] invoke regset,ADDR regstring2,eax mov eax,xpos invoke regset,ADDR regstring1,eax mov eax,ypos invoke regset,ADDR regstring3,eax invoke GlobalFree,memhand invoke GlobalFree,memserver INVOKE ExitProcess,0 RET .ELSEIF ax==WM_MOVE call updatepos ret .ELSEIF ax==WM_DESTROY invoke GlobalFree,memhand invoke PostQuitMessage,NULL ret .elseif ax==WM_INITDIALOG invoke LoadIcon, hInstance, IDI_ICON1 invoke SendMessage, hWnd, WM_SETICON, 1, eax mov eax,hWnd mov mainhwnd,eax invoke regget,ADDR regstring2 mov [searchcount],eax invoke regget,ADDR regstring1 mov xpos,eax invoke regget,ADDR regstring3 mov ypos,eax invoke SetWindowPos,hWnd,NULL,xpos,ypos,0,0,SWP_NOSIZE+SWP_NOZORDER invoke CreatePopupMenu mov [wmenu],eax mov eax,[searchcount] push eax push offset runcount1 push offset buff call wsprintfA add esp,0ch invoke AppendMenu,wmenu,MF_STRING,IDM_SEARCH,ADDR buff ;invoke AppendMenu,wmenu,MF_STRING,IDM_ONTOP,ADDR pick1 ;invoke AppendMenu,wmenu,MF_STRING,IDM_UPDATE,ADDR pick2 invoke AppendMenu,wmenu,MF_STRING,IDM_ABOUT,ADDR about invoke AppendMenu,wmenu,MF_SEPARATOR,0,0 invoke AppendMenu,wmenu,MF_STRING,IDM_EXIT,ADDR exit invoke CheckMenuItem,wmenu,IDM_UPDATE,MF_CHECKED call updatepos invoke GetDlgItem, [hWnd],IDC_LIST mov [hlistview], eax ; invoke SendMessage, eax, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT invoke AddCol, [hlistview], 0, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 100, ADDR szname invoke AddCol, [hlistview], 1, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 70, ADDR szprog invoke AddCol, [hlistview], 2, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 50, ADDR szmess invoke AddCol, [hlistview], 3, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 200, ADDR szpop3 invoke AddCol, [hlistview], 4, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 100, ADDR szuser invoke AddCol, [hlistview], 5, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 100, ADDR szpass invoke AddCol, [hlistview], 6, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 200, ADDR szsmtp invoke AddCol, [hlistview], 7, LVCF_FMT OR LVCF_WIDTH OR LVCF_TEXT OR LVCF_SUBITEM, LVCFMT_LEFT, 0, 200, ADDR szerror ; invoke GetCurrentDirectory,128,ADDR buff ; invoke SendDlgItemMessage, mainhwnd, IDC_EDIT2,WM_SETTEXT, 0,ADDR buff invoke SendDlgItemMessage, mainhwnd, 1019,WM_SETTEXT, 0,ADDR s3 call contact RET .ELSEIF ax==WM_COMMAND mov eax,wParam .IF lParam==0 .IF ax==IDM_ONTOP xor ontop,1 cmp ontop,TRUE je setontop invoke SetWindowPos,mainhwnd,HWND_NOTOPMOST,200,200,242,88,SWP_NOMOVE invoke CheckMenuItem,wmenu,IDM_ONTOP,MF_UNCHECKED jmp clearontop setontop: invoke SetWindowPos,mainhwnd,HWND_TOPMOST,200,200,242,88,SWP_NOMOVE invoke CheckMenuItem,wmenu,IDM_ONTOP,MF_CHECKED clearontop: .ELSEIF ax==IDM_UPDATE xor windowmove,1 cmp windowmove,TRUE je setupdate invoke CheckMenuItem,wmenu,IDM_UPDATE,MF_UNCHECKED jmp noupdate1 setupdate: invoke CheckMenuItem,wmenu,IDM_UPDATE,MF_CHECKED noupdate1: .ELSEIF ax==IDM_ABOUT lea eax,AboutDlgProc invoke CreateDialogParam,hInstance,addr aboutdialog,hWnd,eax,NULL mov hwndDlg,eax .ELSEIF ax==IDM_EXIT jmp bigclose .endif .ENDIF mov eax,wParam mov edx,eax shr edx,16 .IF ax==IDC_GO mov eax,hWnd mov [mainhwnd],eax call process .ENDIF ret .elseif ax==WM_NOTIFY push esi mov eax,wParam mov esi,lParam add esi,8 mov eax,[esi] and eax,0ffffh push eax push offset runcount1 push offset buff call wsprintfA add esp,0ch invoke SendDlgItemMessage, mainhwnd, IDC_UPDATE,WM_SETTEXT, 0,ADDR buff pop esi ret .ELSEIF ax==WM_RBUTTONDOWN push ebx mov ebx,lParam mov ecx,ebx and ebx,0ffffh shr ecx,16 add ebx,xpos add ecx,ypos add ecx,20 invoke TrackPopupMenu,wmenu,TPM_CENTERALIGN +TPM_LEFTBUTTON,ebx,ecx,0,hWnd,NULL pop ebx ret .endif cmp ax,STAGE1 jb notastage cmp ax,STAGE1+800 ja notastage invoke stages,lParam notastage: xor EAX,EAX RET DlgProc endp updatepos proc LOCAL rect:RECT invoke GetWindowRect,mainhwnd,ADDR rect mov eax,rect.top mov ypos,eax mov eax,rect.left mov xpos,eax ret updatepos endp AboutDlgProc PROC hWnd:HWND,iMsg:DWORD,wParam:WPARAM, lParam:LPARAM LOCAL hdc:DWORD LOCAL ps:PAINTSTRUCT LOCAL rect:RECT mov eax,iMsg .if eax==WM_INITDIALOG invoke GetDlgItem, hWnd, IDC_URL invoke SetWindowLong, eax, GWL_WNDPROC, ADDR HyperLinkWndProc mov orgStatic,eax invoke LoadCursor,hInstance,IDI_CUR1 mov hFinger,eax push [searchcount] push offset runcount1 push offset buff call wsprintfA add esp,0ch invoke SendDlgItemMessage, hWnd, IDD_LOAD, WM_SETTEXT, 0,ADDR buff xor eax,eax ret .ELSEIF eax == WM_CTLCOLORSTATIC invoke SendMessage,lParam,iMsg,wParam,lParam ret .elseif eax==WM_CLOSE invoke EndDialog,hWnd,NULL mov hwndDlg,0 .elseif eax==WM_COMMAND mov eax,wParam mov edx,eax shr edx,16 .if eax==IDC_EXIT invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL invoke EndDialog,hWnd,NULL mov hwndDlg,0 .endif .else mov eax,FALSE ret .endif mov eax,TRUE ret AboutDlgProc endp HyperLinkWndProc PROC uses ebx, hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD LOCAL tmpFont :LOGFONT LOCAL rect:RECT LOCAL pt:POINT .IF uMsg==WM_NCHITTEST mov eax, 1 ret .ELSEIF eax == WM_CTLCOLORSTATIC push ebx invoke SendMessage, hWnd, WM_GETFONT, 0, 0 mov edx,eax invoke GetObject, edx, sizeof LOGFONT, addr tmpFont mov tmpFont.lfUnderline, TRUE invoke CreateFontIndirect, addr tmpFont mov ebx,eax invoke SelectObject, wParam, ebx .if hover == FALSE invoke SetTextColor, wParam, Blue .else invoke SetTextColor, wParam,Red .endif invoke GetSysColor, COLOR_MENU invoke SetBkColor, wParam, eax invoke DeleteObject,ebx invoke GetStockObject, HOLLOW_BRUSH pop ebx ret .ELSEIF uMsg==WM_MOUSEMOVE invoke SetCursor,hFinger .ELSEIF uMsg==WM_LBUTTONDOWN invoke GetWindowText,hWnd,offset buff,sizeof buff invoke ShellExecute, NULL, offset szOpen, offset buff, NULL, NULL, SW_MAXIMIZE ;change this to represent your preset url xor eax,eax ret .ENDIF invoke CallWindowProc, orgStatic, hWnd, uMsg, wParam, lParam ret HyperLinkWndProc endp regget proc regstring:DWORD LOCAL number:DWORD LOCAL Disp :DWORD LOCAL pKey :DWORD LOCAL Temp :DWORD mov Temp,4 invoke RegCreateKeyEx, HKEY_LOCAL_MACHINE,ADDR subkeyname, NULL, NULL,REG_OPTION_NON_VOLATILE,KEY_READ, NULL,addr pKey, addr Disp cmp eax,ERROR_SUCCESS jne regok1 invoke RegQueryValueEx, pKey, regstring,NULL, ADDR Disp, ADDR number, ADDR Temp invoke RegCloseKey, pKey mov eax,number ret regok1: mov eax,NULL ret regget endp regset proc regstring:DWORD,number:DWORD LOCAL Disp :DWORD LOCAL pKey :DWORD LOCAL Temp :DWORD mov Temp,4 invoke RegCreateKeyEx, HKEY_LOCAL_MACHINE,ADDR subkeyname, NULL, NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE, NULL, addr pKey, addr Disp cmp eax,ERROR_SUCCESS jne regok2 invoke RegSetValueEx, pKey, regstring,NULL, REG_DWORD_LITTLE_ENDIAN,ADDR number, Temp invoke RegCloseKey, pKey regok2: ret regset endp openini proc hWnd:HWND LOCAL filehand:DWORD invoke CreateFile,ADDR ininame,\ GENERIC_READ ,0,\ NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,\ NULL cmp eax,INVALID_HANDLE_VALUE je notop1 mov filehand,eax mov openok,TRUE invoke GetFileSize,filehand,addr temp mov filesize,eax invoke GlobalAlloc,GMEM_MOVEABLE + GMEM_ZEROINIT,filesize mov memhand,eax invoke GlobalLock,eax mov mem,eax mov esi,eax ;mov [esi],dword ptr 1 invoke ReadFile,filehand,mem,filesize,addr sizeread,NULL mov esi,mem mov ecx,filesize mov ebx,ecx add ebx,esi mov memmax,ebx xor eax,eax notset: inc esi cmp [esi],dword ptr 06f636361h jne notset2 inc eax notset2: loop notset inc eax mov parts,eax invoke CloseHandle,filehand notop1: ret openini endp iniscan2 proc LOCAL onon:BYTE LOCAL index1:DWORD mov [index1],0 ;invoke AddItem, [hlistview], 0, 0, LVIF_TEXT OR LVIF_PARAM, 0, 0, [mainhwnd], ADDR s1, 0, 1 inc [index1] mov esi,[memdata] mov onon,1 bigtry: lea edi,inidata xor ecx,ecx cmp [esi],byte ptr ";" je foundone retry: mov al,[esi] cmp al,[edi] jne notit xor ch,ch push esi push edi retry1: inc esi inc edi mov al,[esi] cmp al,[edi] jne notit2 inc ch cmp ch,3 jb retry1 xor eax,eax mov al,cl inc esi inc esi push eax mov ebx,50 mul ebx mov edi,[memsdata] add edi,eax push edi ok1: mov bh,[esi] cmp bh,0dh je endit mov [edi],bh inc esi inc edi jmp ok1 endit: mov [edi],byte ptr 0 pop edi pop eax isone: inc [index1] jmp foundone notit2: pop edi pop esi notit: add edi,4 inc cl cmp cl,6 jb retry foundone: cmp esi,memmax jae overit inc esi cmp [esi],byte ptr 0ah jne foundone cmp esi,memmax jae overit inc esi cmp [esi],byte ptr 0dh jne bigtry overit: ret iniscan2 endp process proc mov ecx,[parts] mov edi,[mems] xor ebx,ebx addone1: push ecx push edi push ebx invoke AddItem, [hlistview], ebx, 0, LVIF_TEXT OR LVIF_PARAM, 0, 0, [mainhwnd], edi, 0, 1 add edi,50 invoke AddItem, [hlistview], ebx, 3, LVIF_TEXT , 0, 0, 0, edi, 0, 0 add edi,50 invoke AddItem, [hlistview], ebx, 4, LVIF_TEXT , 0, 0, 0, edi, 0, 0 add edi,50 invoke AddItem, [hlistview], ebx, 5, LVIF_TEXT , 0, 0, 0, edi, 0, 0 add edi,50 invoke AddItem, [hlistview], ebx, 6, LVIF_TEXT , 0, 0, 0, edi, 0, 0 pop ebx pop edi add edi,512 inc ebx pop ecx dec ecx or ecx,ecx jnz addone1 ret process endp readin proc invoke openini,mainhwnd mov eax,mem mov memdata,eax mov ebx,[parts] shl ebx,9 ; eax * 512 invoke GlobalAlloc,GMEM_MOVEABLE + GMEM_ZEROINIT,ebx mov memserver,eax invoke GlobalLock,eax mov [mems],eax mov [memsdata],eax cmp openok,TRUE jne notopen1 call iniscan2 mov ecx,[parts] rescan1: dec ecx or ecx,ecx jz endscan add [memsdata],512 push ecx mov esi,memdata add esi,4 cmp esi,memmax jae toobig gosi: inc esi cmp esi,memmax je toobig cmp [esi],word ptr 0d0ah jne gosi add esi,3 mov memdata,esi inc index call iniscan2 toobig: pop ecx jmp rescan1 endscan: notopen1: ret readin endp printf proc p1:dword, p2:dword, p3:dword push p3 push p2 push p1 call wsprintfA add esp, 12 ret printf endp contact proc LOCAL wsadata1:WSADATA LOCAL stageid:DWORD cmp mem,0 jne okok2 call readin okok2: call process invoke WSAStartup, 0101h, ADDR wsadata1 cmp eax,0 je nowsfail2 invoke SendDlgItemMessage, mainhwnd, 1019,WM_SETTEXT, 0,ADDR hostnotfound jmp wsfail2 nowsfail2: mov eax,[mems] mov [memsdata],eax mov [stageid],0 mov ecx,[parts] restart1: push ecx xor ecx, ecx xor esi, esi mov ebx,[memsdata] mov [ebx+250],dword ptr 0 mov edx,ebx add edx,258 add ebx,50 mov eax,STAGE1 add eax,[stageid] invoke WSAAsyncGetHostByName,mainhwnd, eax, ebx, edx, 250 or eax,eax jnz works1 invoke MessageBox,[mainhwnd],ADDR s1,ADDR s2,MB_OK invoke WSAGetLastError invoke printf,ADDR buff,ADDR errornum,eax invoke AddItem, [hlistview], [stageid], 1, LVIF_TEXT , 0, 0, 0, ADDR buff, 0, 0 jmp gonum works1: invoke AddItem, [hlistview], [stageid], 1, LVIF_TEXT , 0, 0, 0, ADDR sc, 0, 0 gonum: inc [stageid] add [memsdata],512 pop ecx dec ecx or ecx,ecx jnz restart1 wsfail2: ret contact endp stages proc lParam:LPARAM LOCAL stageno:DWORD LOCAL stagemem:DWORD LOCAL sockethand:DWORD cmp ax,STAGE1+99 ja notstage1 ;------------- 1 sub eax,STAGE1 mov [stageno],eax shl eax,9 add eax,[mems] mov [stagemem],eax cmp word ptr [lParam+2],0 je noerr2 xor eax,eax mov ax,word ptr [lParam+2] cmp eax,WSAHOST_NOT_FOUND jne unerr invoke AddItem, [hlistview], [stageno], 1, LVIF_TEXT , 0, 0, 0, ADDR hostnotfound, 0, 0 jmp error unerr: invoke printf,ADDR buff,ADDR num2,eax invoke AddItem, [hlistview], [stageno], 1, LVIF_TEXT , 0, 0, 0, ADDR buff, 0, 0 jmp error noerr2: invoke AddItem, [hlistview], [stageno], 1, LVIF_TEXT , 0, 0, 0, ADDR s1, 0, 0 mov esi,[stagemem] push esi add esi,258 mov eax,dword ptr [esi+12] mov eax,dword ptr [eax] mov eax,dword ptr [eax] pop esi add esi,480 mov word ptr [esi], AF_INET mov word ptr [esi+2], 6e00h mov dword ptr [esi+4], eax mov dword ptr [esi+8], 0 mov dword ptr [esi+12], 0 invoke socket, AF_INET, SOCK_STREAM, 0 cmp eax,-1 jne noerrors invoke printf,ADDR buff,ADDR errornum,eax invoke SendDlgItemMessage, [mainhwnd], 1019,WM_SETTEXT, 0,ADDR buff jmp error noerrors: mov esi,[stagemem] mov [esi+250],eax push eax mov ebx,STAGE2 add ebx,[stageno] invoke WSAAsyncSelect, eax, [mainhwnd], ebx, FD_CONNECT pop eax mov ebx,[stagemem] add ebx,480 invoke connect,eax,ebx,16 error: ret notstage1: cmp ax,STAGE2+99 ja notstage2 ;------------- 2 sub eax,STAGE2 mov [stageno],eax shl eax,9 add eax,[mems] mov [stagemem],eax invoke AddItem, [hlistview], [stageno], 1, LVIF_TEXT , 0, 0, 0, ADDR s2, 0, 0 cmp word ptr [lParam+2],0 je noerr3 xor eax,eax mov ax,word ptr [lParam+2] invoke printf,ADDR buff,ADDR errornum,eax invoke SendDlgItemMessage, [mainhwnd], 1019,WM_SETTEXT, 0,ADDR buff invoke AddItem, [hlistview], [stageno], 1, LVIF_TEXT , 0, 0, 0, ADDR buff, 0, 0 mov esi,[stagemem] mov ebx,[esi+250] invoke closesocket,ebx jmp error3 noerr3: mov esi,[stagemem] mov [esi+254],stage_3 mov eax,[esi+250] mov ebx,STAGE3 add ebx,[stageno] invoke WSAAsyncSelect, eax, [mainhwnd], ebx, FD_READ xor eax,eax error3: ret notstage2: cmp ax,STAGE3+99 ja notstage3 ;------------- 3=> sub eax,STAGE3 mov [stageno],eax shl eax,9 add eax,[mems] mov [stagemem],eax cmp word ptr [lParam+2],0 je noerr4 xor eax,eax mov ax,word ptr [lParam+2] invoke printf,ADDR buff,ADDR num1,eax invoke SendDlgItemMessage, [mainhwnd], 1019,WM_SETTEXT, 0,ADDR buff jmp error4 noerr4: mov esi,[stagemem] mov eax,[esi+250] mov [sockethand],eax mov eax,[esi+254] call eax error4: notstage3: ret stage_3: invoke AddItem, [hlistview], [stageno], 1, LVIF_TEXT , 0, 0, 0, ADDR s3, 0, 0 mov esi,[stagemem] add esi,258 invoke recv, [sockethand], esi, 250, NULL ;cmp byte ptr [ebx], '+' ; jne ServeE0 mov esi,[stagemem] mov [esi+254],stage_4 add esi,100 push esi push offset outmsg_00 ;username push offset buff call wsprintfA add esp, 12 invoke lstrlen,ADDR buff mov esi,[stagemem] add esi,258 invoke send, [sockethand], ADDR buff, eax, NULL ; cmp eax, -1 ; je shoWSE0 xor eax, eax ret stage_4: invoke AddItem, [hlistview], [stageno], 1, LVIF_TEXT , 0, 0, 0, ADDR s4, 0, 0 mov esi,[stagemem] add esi,258 invoke recv, [sockethand], esi, 250, NULL mov esi,[stagemem] mov [esi+254],stage_5 add esi,150 push esi push offset outmsg_01 ;password push offset buff call wsprintfA add esp, 12 invoke lstrlen,ADDR buff invoke send, [sockethand], ADDR buff, eax, NULL ret stage_5: mov esi,[stagemem] add esi,258 invoke recv, [sockethand], esi, 250, NULL cmp byte ptr [esi],"+" je passok invoke AddItem, [hlistview], [stageno], 1, LVIF_TEXT , 0, 0, 0, ADDR sznopass, 0, 0 jmp endstages passok: invoke AddItem, [hlistview], [stageno], 1, LVIF_TEXT , 0, 0, 0, ADDR s5, 0, 0 mov esi,[stagemem] mov [esi+254],stage_6 invoke lstrlen,ADDR outmsg_02 invoke send, [sockethand], ADDR outmsg_02, eax, NULL ret stage_6: invoke AddItem, [hlistview], [stageno], 1, LVIF_TEXT , 0, 0, 0, ADDR s6, 0, 0 mov esi,[stagemem] add esi,258 invoke recv, [sockethand], esi, 250, NULL invoke AddItem, [hlistview], [stageno], 2, LVIF_TEXT , 0, 0, 0, esi, 0, 0 endstages: mov esi,[stagemem] mov [esi+254],stage_7 invoke lstrlen,ADDR outmsg_quit invoke send, [sockethand], ADDR outmsg_quit, eax, NULL ret stage_7: invoke AddItem, [hlistview], [stageno], 1, LVIF_TEXT , 0, 0, 0, ADDR s7, 0, 0 mov esi,[stagemem] add esi,258 invoke recv, [sockethand], esi, 250, NULL invoke closesocket,[sockethand] ret stages endp END start