;-getip.asm v0.3------------------------------------------------------------- ; x86 - Dos & Win32 - Assembly Language Programming ; ; ; ; Written by: John A Lyons ; ; Email : sysop@megablast.8k.com ; ; Page : http://www.asmsource.8k.com/ ; ; Compiler : Masm32 v6.13 Microsoft Macro Assembler ; ; Date : 21-Jul-2001 ; ; Purpose : Gets the IP address for any website. Allows you to enter the ; ; website name, and retrieves the ip numbers. ; ; ; ; v0.1 : Looks up an address for slashdot.org correctly. ; ; v0.2 : Improved screen design, added lookup button, reads from ; ; HostName box. Added lookup number count in the about box. ; ; (21-Jul-2001) ; ; v0.3 : Fixed up menu options. Added a routine to copy the IP to the ; ; clipboard.(21-Jul-2001) ; ; ; ; ; ;---------------------------------------------------------------------------- .386 .MODEL FLAT , STDCALL option casemap:none include windows.inc include user32.inc include kernel32.inc include shell32.inc include gdi32.inc includelib user32.lib includelib kernel32.lib includelib shell32.lib includelib gdi32.lib include wsock32.inc includelib wsock32.lib include advapi32.inc includelib advapi32.lib ; external procedure EXTRN wsprintfA:PROC ; procedures declared later WinMain proto :DWORD,:DWORD,:DWORD,:DWORD AboutDlgProc proto hWnd:HWND,iMsg:DWORD,wParam:WPARAM, lParam:LPARAM regget proto regstring:DWORD regset proto regstring:DWORD,number:DWORD LookUpIP proto hWnd:HWND toclip proto hWnd:HWND .data ClassName db "DLGCLASS",0 MenuName db "MyMenu",0 DlgName db "MainDialog",0 AbtName db "AboutDialog",0 num2 db "%lu",0 hInstance HINSTANCE ? CommandLine LPSTR ? HostName db "asmsource.8k.com",0 buff db 256 dup(?) menuhand DWORD ? first BOOL FALSE ;about data hwnd HWND ? hover BOOL ? hFinger dd ? orgStatic dd ? hwndDlg dd ? szOpen db "open",0 WS db 0 count dword ? .const mlooking db "Looking... ",0 mfound db "Found. ",0 mnodata db "Name not found.",0 merror db "Error. ",0 wsok db "WinSock OK. ",0 wserror db "WinSock Error. ",0 ipcount db "%lu lookups.",0 ;------Registry regstring2 db "IP Count",0 subkeyname db "Software\getip",0 ;buttons IDC_EXIT equ 3002 ;menu IDM_EXIT equ 32003 IDM_ABOUT equ 32002 ;dialog IDI_ICON1 equ 5 IDC_URL equ 9 IDI_CUR1 equ 101 .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hDlg:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,DLGWINDOWEXTRA push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_BTNFACE+1 mov wc.lpszMenuName,OFFSET MenuName mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon, hInstance, IDI_ICON1 mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateDialogParam,hInstance,ADDR DlgName,NULL,NULL,NULL mov hDlg,eax INVOKE ShowWindow, hDlg,SW_SHOWNORMAL INVOKE UpdateWindow, hDlg .WHILE TRUE INVOKE GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke IsDialogMessage, hDlg, ADDR msg .if eax==FALSE INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessage, ADDR msg .endif .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL wsadata1:WSADATA .if uMsg==WM_GETMINMAXINFO ; 24 cmp first,FALSE jne nob1 invoke GetMenu,hWnd mov menuhand,eax invoke DefWindowProc,hWnd,uMsg,wParam,lParam invoke regget,ADDR regstring2 cmp eax,NULL jne regisok1 mov [count],0 regisok1: mov [count],eax ret .ELSEIF uMsg==WM_ACTIVATE invoke SetDlgItemText, hWnd, 501, ADDR HostName invoke WSAStartup, 0101h, ADDR wsadata1 cmp eax,0 jne wsfail2 invoke SetDlgItemText, hWnd, 504, ADDR wsok lea ebx,wsadata1 assume ebx: ptr WSADATA mov ax,[ebx].wVersion push eax push offset num2 push offset buff call wsprintfA invoke SetDlgItemText, hWnd, 502, ADDR buff ret wsfail2: invoke SetDlgItemText, hWnd, 504, ADDR wserror ret .ELSEIF uMsg==WM_DESTROY mov eax,[count] invoke regset,ADDR regstring2,eax invoke PostQuitMessage,NULL ret .ELSEIF uMsg==WM_COMMAND mov eax,wParam .IF lParam==0 .IF ax==IDM_EXIT invoke DestroyWindow,hWnd ret .ELSEIF ax==32000 invoke LookUpIP,hWnd .ELSEIF ax==32001 mov word ptr [HostName],0 invoke SetDlgItemText, hWnd, 501, ADDR HostName .ELSEIF ax==32006 invoke toclip,hWnd .ELSEIF ax==IDM_ABOUT invoke CreateDialogParam,hInstance, addr AbtName,hWnd,OFFSET AboutDlgProc,NULL mov hwndDlg,eax .ENDIF .ELSE .IF ax==IDC_EXIT invoke SendMessage,hWnd,WM_COMMAND,IDM_EXIT,0 ret .elseif ax==3001 invoke GetDlgItemText,hWnd,501,ADDR HostName,256 invoke LookUpIP,hWnd .ENDIF .ENDIF .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF nob1: xor eax,eax ret WndProc endp HyperLinkWndProc PROC uses ebx, hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD LOCAL tmpFont :LOGFONT LOCAL rect:RECT LOCAL pt:POINT LOCAL ps:PAINTSTRUCT mov eax,uMsg .IF eax==WM_NCHITTEST mov eax, 1 ;We want to handle the non client hit test so we return true or 1 ret .ELSEIF eax == WM_CTLCOLORSTATIC push ebx push edx 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 edx pop ebx ret .ELSEIF eax==WM_MOUSEMOVE invoke GetParent,hWnd push ebx mov ebx,eax invoke GetActiveWindow .if eax == ebx invoke GetCursorPos,addr pt invoke GetWindowRect,hWnd,addr rect invoke PtInRect,addr rect,pt.x,pt.y .if eax invoke GetCapture .if !eax invoke SetCapture,hWnd mov hover,TRUE invoke InvalidateRect,hWnd,FALSE,FALSE invoke SetCursor,hFinger .endif .else invoke GetCapture .if eax invoke ReleaseCapture mov hover,FALSE invoke InvalidateRect,hWnd,FALSE,FALSE .endif .endif .endif pop ebx xor eax,eax ret .ELSEIF eax==WM_LBUTTONDOWN invoke GetWindowText,hWnd,offset buff,sizeof buff ;change this for using a preset url invoke ShellExecute, NULL, offset szOpen, offset buff, NULL, NULL, SW_MAXIMIZE ;change this to represent your preset url mov hover,FALSE invoke InvalidateRect,hWnd,FALSE,FALSE invoke SendMessage, hWnd, WM_GETFONT, 0, 0 ;Get the defualt system font mov edx,eax ;store result invoke GetObject, edx, sizeof LOGFONT, addr tmpFont ;get our font into a logfont structure mov tmpFont.lfUnderline, TRUE ;under line the link invoke CreateFontIndirect, addr tmpFont ;Create the new font mov ebx,eax ;We need the return to free the memory later invoke SelectObject, wParam, ebx ;Select our control invoke SetTextColor, wParam, Blue ;change this to change the color of the link xor eax,eax ret .ENDIF invoke CallWindowProc, orgStatic, hWnd, uMsg, wParam, lParam ret HyperLinkWndProc 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 count push offset ipcount push offset buff call wsprintfA add esp,0ch ; invoke SendDlgItemMessage, hWnd, IDD_LOAD, WM_SETTEXT, 0,ADDR buff invoke SetDlgItemText,hWnd,510,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 push edx mov eax,wParam mov edx,eax shr edx,16 .if ax==IDC_EXIT invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL invoke EndDialog,hWnd,NULL mov hwndDlg,0 .endif pop edx .else mov eax,FALSE ret .endif mov eax,TRUE ret AboutDlgProc 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 ;----------------------------------------------------ABOUT procedure LookUpIP proc hWnd:HWND invoke SetDlgItemText, hWnd, 504, ADDR mlooking invoke gethostbyname, ADDR HostName cmp eax,NULL jne nameok invoke WSAGetLastError lea esi,merror ; push eax ; ; push eax ; push offset num2 ; push offset buff ; call wsprintfA ; invoke SetDlgItemText, hWnd, 502, ADDR buff ; ; pop eax cmp eax,WSAHOST_NOT_FOUND jne wsfail3 lea esi,mnodata wsfail3: invoke SetDlgItemText, hWnd, 503, esi invoke SetDlgItemText, hWnd, 504, ADDR merror jmp wsfail nameok: inc [count] mov ebx, eax assume ebx: ptr hostent mov eax, [ebx].h_list assume ebx: nothing mov ebx, eax lea esi,buff-30 nextip: mov eax, [ebx] or eax,eax jz endit mov eax, [eax] push ebx invoke inet_ntoa, eax mov edi,eax mov ecx,16 moveit: mov ah,[edi] mov [esi],ah or ah,ah jz endmove inc esi inc edi loop moveit endmove: invoke SendDlgItemMessage, hWnd, 503, WM_SETTEXT, 0,eax pop ebx add ebx, 4 jmp nextip endit: invoke SendDlgItemMessage, hWnd, 504, WM_SETTEXT, 0,ADDR mfound wsfail: ret LookUpIP endp toclip proc hWnd:HWND LOCAL gmem :DWORD invoke GlobalAlloc,GMEM_MOVEABLE+GMEM_DDESHARE,30 mov gmem,eax invoke GlobalLock,eax cmp eax,NULL je notopen lea esi,buff-30 mov edi,eax mov ecx,29 rep movsb invoke OpenClipboard,hWnd cmp eax,TRUE jne notopen2 mov eax,gmem invoke SetClipboardData,CF_TEXT,gmem invoke CloseClipboard notopen2: mov eax,gmem invoke GlobalFree,eax notopen: ret toclip endp end start