· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Ping in asm - работает как зверь

Посл.отвђт Сообщенiе


Дата: Мар 5, 2003 09:11:23

.386
.model flat, stdcall
option casemap :none ; case sensitive


include \MASM32\INCLUDE1\WINDOWS.INC
include \MASM32\INCLUDE1\KERNEL32.INC
include \MASM32\INCLUDE1\USER32.INC
include \MASM32\INCLUDE1\WS2_32.INC

includelib \MASM32\LIB\KERNEL32.LIB
includelib \MASM32\LIB\USER32.LIB
includelib \MASM32\LIB\WS2_32.LIB


DlgMain proto :dword, :dword, :dword, :dword
SendReguest proto :dword, :dword
FillBuffer proto :dword, :dword, :byte
checksum proto :dword, :dword
fill_icmp_data proto :dword, :dword
decode_resp proto :dword, :dword

IP struc
ip_hl_v db ? ; header length version
ip_tos db ? ; type of service
ip_len dw ? ; total length
ip_id dw ? ; identification
ip_off dw ? ; fragment offset field
ip_ttl db ? ; time to live
ip_p db ? ; protocol
ip_sum dw ? ; checksum
ip_src dd ? ; source address
ip_dst dd ? ; dest address
IP ends

ICMP struc
i_type db ?
i_code db ? ; type sub code
i_cksum dw ?
i_id dw ?
i_seq dw ?
timestamp dd ?
ICMP ends

ICMP_ECHO_REQUEST equ 8
MAX_PACKET equ 1024
DEFAULT_PACKET_SIZE equ 32

.data
ClassName db "DLGCLASS", 0
DlgName db "MainDialog", 0
h_Dlg dd 0
hInstance dd 0
pPacket dd 0
Pfrom sockaddr_in <>
fromlen dd sizeof sockaddr_in
recvbuf db MAX_PACKET dup (0)
sockRaw dd 0
template1 db "Recived %d bytes from %s - time %d ms",13,10,0
WM_SOCKET equ WM_USER + 104
id_ dw 0
TemplSendError db "Error Send data error code: %d",0
TemplRecvError db "Error Recv data error code: %d",0
szErrorTimeout db "Error time out ",0
szErrorAddrMes db "Error IP addres",0
szlocalhost db "localhost",0
timer1_id dd 87579
recvFlag dd 0
OutBuffer dd 300 dup (0)


.code
start:
invoke GetModuleHandleA, NULL
mov hInstance, eax
invoke DlgMain, hInstance, NULL, NULL, SW_SHOWDEFAULT
invoke closesocket, sockRaw
invoke ExitProcess, 0

;################################################################

DlgMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD

LOCAL wc : WNDCLASSEX
LOCAL msg : MSG

mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET DlgProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, DLGWINDOWEXTRA
push hInst
pop wc.hInstance
mov wc.hbrBackground, COLOR_BTNFACE+1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, OFFSET ClassName
mov wc.hIcon, 0
mov wc.hIconSm, 0
mov wc.hCursor, 0
invoke RegisterClassExA, addr wc
invoke CreateDialogParamA, hInstance, ADDR DlgName, NULL, NULL, NULL
mov h_Dlg, EAX
invoke ShowWindow, h_Dlg, SW_SHOWNORMAL
invoke UpdateWindow, h_Dlg
invoke SetTimer, h_Dlg, timer1_id, 1000, 0
call init_socket
.WHILE TRUE
invoke GetMessageA, ADDR msg,NULL,0,0
.BREAK .IF (!EAX)
invoke IsDialogMessage, h_Dlg, ADDR msg
.IF eax ==FALSE
invoke TranslateMessage, ADDR msg
invoke DispatchMessageA, ADDR msg
.ENDIF
.ENDW
mov eax, msg.wParam
ret

DlgMain ENDP

;################################################################

DlgProc proc uses edi esi ebx hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM


LOCAL intBufer : dword

.if uMsg == WM_DESTROY
invoke PostQuitMessage, NULL
.elseif uMsg == WM_COMMAND
mov EAX, wParam
.if ax == 35500
invoke SendDlgItemMessageA, hDlg, 10098, WM_GETTEXT, 300, addr OutBuffer
.if eax ==0
invoke lstrcpy, addr OutBuffer, addr szlocalhost
invoke SendDlgItemMessageA, hDlg, 10098, WM_SETTEXT, 0, addr OutBuffer
.endif
invoke GetDlgItemInt, h_Dlg, 10099, addr intBufer, FALSE
.if eax > MAX_PACKET
invoke SetDlgItemInt, h_Dlg, 10099, MAX_PACKET, FALSE
mov eax, MAX_PACKET
.elseif intBufer == FALSE
invoke SetDlgItemInt, h_Dlg, 10099, DEFAULT_PACKET_SIZE, FALSE
mov eax, DEFAULT_PACKET_SIZE
.endif
invoke SendReguest, addr OutBuffer, eax
.endif
.elseif uMsg == WM_TIMER
.if recvFlag == 4
invoke SendDlgItemMessageA, hDlg, 10100, WM_SETTEXT, 0, addr szErrorTimeout
.endif
.elseif uMsg == WM_SOCKET
mov eax,lParam
.if ax == FD_READ
mov recvFlag, 0
invoke recvfrom, sockRaw, addr recvbuf, MAX_PACKET, 0, addr Pfrom, addr fromlen
.if eax == SOCKET_ERROR
Scall wsprintfA, offset OutBuffer, offset TemplRecvError, eax
add esp, 4*3
invoke SendDlgItemMessageA, h_Dlg, 10100, WM_SETTEXT, 0, addr OutBuffer
.endif
invoke decode_resp, addr recvbuf, addr Pfrom
.endif
.else
invoke DefWindowProcA, hDlg, uMsg, wParam, lParam
ret
.endif
xor eax, eax
ret

DlgProc ENDP

;################################################################

checksum proc buffer:dword, syize:dword

LOCAL cksum : dword

mov cksum, 0
@@:
cmp syize, 1
jle @F
mov eax, buffer
xor ecx, ecx
mov cx, [eax]
mov edx, cksum
add edx, ecx
mov cksum, edx
mov eax, buffer
add eax, 2
mov buffer, eax
mov ecx, syize
sub ecx, 2
mov syize, ecx
jmp @b
@@:
cmp syize, 0
jz @f
mov edx, buffer
xor eax, eax
mov al, [edx]
mov ecx, cksum
add ecx, eax
mov cksum, ecx
@@:
mov edx, cksum
shr edx, 10h
mov eax, cksum
and eax, 0FFFFh
add edx, eax
mov cksum, edx
mov ecx, cksum
shr ecx, 10h
mov edx, cksum
add edx, ecx
mov cksum, edx
mov eax, cksum
not eax
ret

checksum endp

;################################################################

SendReguest proc uses edi esi ebx pAddrres:dword, packSiz:dword


LOCAL dest : sockaddr_in

invoke FillBuffer, addr dest, sizeof sockaddr_in, 0
invoke gethostbyname, pAddrres
.if eax != 0
mov eax, (hostent ptr [eax]).h_list
mov eax, [eax]
mov eax, [eax]
mov dest.sin_addr, eax
.else
invoke inet_addr, pAddrres
.endif
.if eax != INADDR_NONE
mov dest.sin_addr, eax
mov dest.sin_family, AF_INET
mov ebx, packSiz
add ebx, sizeof ICMP
invoke GlobalAlloc, 0, ebx
mov pPacket, eax
invoke FillBuffer, pPacket, ebx, 0
invoke fill_icmp_data, pPacket, ebx
invoke sendto, sockRaw, pPacket, ebx, 0, addr dest, sizeof sockaddr_in
push eax
invoke GlobalFree, pPacket
pop eax
.if eax == SOCKET_ERROR
invoke WSAGetLastError
Scall wsprintfA, offset OutBuffer, offset TemplSendError, eax
add esp, 4*3
invoke SendDlgItemMessageA, h_Dlg, 10100, WM_SETTEXT, 0, addr OutBuffer
mov recvFlag, 0
ret
.endif
mov recvFlag, 4
ret
.endif
invoke SendDlgItemMessageA, h_Dlg, 10100, WM_SETTEXT, 0, addr szErrorAddrMes
ret

SendReguest endp

;############################################################3

FillBuffer proc lpBuffer:DWORD,lenBuffer:DWORD,TheChar:BYTE

push edi
mov edi, lpBuffer ; address of buffer
mov ecx, lenBuffer ; buffer length
mov al, TheChar ; load al with character
rep stosb ; write character to buffer until ecx = 0
pop edi
ret

FillBuffer endp

;#################################################################

init_socket proc

LOCAL wsadata : WSADATA


invoke WSAStartup, 202h, addr wsadata
.if eax == 0
invoke WSASocketA, AF_INET, SOCK_RAW, IPPROTO_ICMP, 0, 0, 0 ;IPPROTO_ICMP
.if eax != -1
mov sockRaw, eax
invoke WSAAsyncSelect, sockRaw, h_Dlg, WM_SOCKET, FD_CONNECT+FD_READ+FD_CLOSE+FD_ACCEPT+FD_WRITE + FD_OOB
.if eax != -1
mov eax, TRUE
ret
.endif
.endif
.endif
mov eax, FALSE
ret

init_socket endp

;###############################################################3

decode_resp proc uses edi esi ebx pRecvData:dword, pRecvAddr:dword


LOCAL sizretrn : dword
LOCAL retrTim : dword
LOCAL pAddrs : dword


mov edi, pRecvAddr
mov ebx, pRecvData
invoke inet_ntoa, dword ptr (sockaddr_in ptr [edi]).sin_addr
mov pAddrs, eax
mov ax, (IP ptr [ebx]).ip_len
invoke htons, ax
movzx eax, ax
mov sizretrn, eax
mov al, (IP ptr [ebx]).ip_hl_v
and al, 0fh
movzx eax, al
lea ecx, [eax*4]
add ebx, ecx
.if byte ptr (ICMP ptr [ebx]).i_type == ICMP_ECHOREPLY
mov ax, id_
.if word ptr (ICMP ptr [ebx]).i_id == ax
invoke GetTickCount
mov ecx, (ICMP ptr [ebx]).timestamp
sub eax, ecx
mov retrTim, eax
lea edx, OutBuffer
Scall wsprintfA, edx, offset template1, sizretrn, pAddrs, retrTim
add esp, 4*5
invoke SendDlgItemMessageA, h_Dlg, 10100, WM_SETTEXT, 0, addr OutBuffer
.endif
.endif
ret

decode_resp endp

;################################################################

fill_icmp_data proc uses edi esi ebx icmp_data:dword, datasize:dword

mov ebx, icmp_data
mov (ICMP ptr [ebx]).i_type, ICMP_ECHO_REQUEST
mov (ICMP ptr [ebx]).i_code, 0
mov (ICMP ptr [ebx]).i_cksum, 0
invoke GetCurrentProcessId
mov id_, ax
mov (ICMP ptr [ebx]).i_id, ax
mov (ICMP ptr [ebx]).i_seq, 1
invoke GetTickCount
mov (ICMP ptr [ebx]).timestamp, eax
add ebx, sizeof ICMP
mov eax, datasize
sub eax, sizeof ICMP
invoke FillBuffer, ebx, eax, 'E'
invoke checksum, icmp_data, datasize
sub ebx, sizeof ICMP
mov (ICMP ptr [ebx]).i_cksum, ax
ret

fill_icmp_data endp

;################################################################

end start

======================================================================


#include "\masm32\include\resource.h"


MAINDIALOG DIALOGEX MOVEABLE PURE LOADONCALL DISCARDABLE 49, 7, 212, 106, 0
STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED
CAPTION "PINGER"
CLASS "DLGCLASS"
FONT 12, "System", 700, 0 /*FALSE*/
BEGIN
PUSHBUTTON "Ping", 35500, 61,85,71,11, 0, , 0
LTEXT "Addres or IP to Ping", IDC_STATIC, 8,18,98,9, SS_LEFT, , 0
EDITTEXT 10098, 7,29,149,11, ES_AUTOHSCROLL | ES_LEFT, , 0
LTEXT "Packet size", IDC_STATIC, 160,18,41,9, SS_LEFT, , 0
EDITTEXT 10099, 161,29,42,11, ES_AUTOHSCROLL | ES_LEFT, , 0
LTEXT "Replay", IDC_STATIC, 6,43,153,9, SS_LEFT, , 0
EDITTEXT 10100, 7,56,199,23, ES_AUTOHSCROLL | ES_LOWERCASE | ES_MULTILINE | ES_READONLY | ES_LEFT, , 0
GROUPBOX "", IDC_STATIC, 2,5,208,98, 0, , 0
END


Дата: Мар 5, 2003 17:57:51

Что, такой злой?


Дата: Мар 22, 2003 16:06:15

у меня не компилируется
говорит проблемма в - Scall wsprintfA, offset OutBuffer, offset TemplRecvError, eax


Дата: Мар 22, 2003 20:54:07

Замените на invoke и уберите add esp,***
У меня всё компилируется и работает... как зверь! ((c) Аноним)


Дата: Мар 24, 2003 05:52:22

у меня Windows XP - может из за этого не работает ?
я вроде уже откомпилировал, но ни чего не происходит когда экзешник запускаю, только в памяти висит и все, а вообще что должно на экране появиться, а то у меня вообще ни чего не появляется ?


Дата: Мар 24, 2003 17:38:18

Я пробовал на ME, NT4 и 2000 - всё OK! Правда, я там много чего поменял: добавил настройку исходящей последовательности байт (совсем не обязательно посылать 32 байта "abcdefg" и т.д.) Могу отправить на мыл исходник + exe.


Дата: Мар 24, 2003 17:47:36

давай
и исходник с изменениями если можно
yandex2002@inbox.ru


Дата: Мар 24, 2003 19:50:21

Отослал вместе с исходниками. Можете проверить ping на следующих хостах: www.yahoo.com, www.ukr.net, localhost :)
А вот www.microsoft.com молчит. :(


Дата: Мар 25, 2003 09:53:52

спасибо, у меня все заработало


Дата: Мар 25, 2003 13:06:11

Можно и мне исходник :)
ign@e-mail.ru


Дата: Мар 29, 2003 22:54:45

Можно и мне исходник :)
Можно, но...
ign@e-mail.ru не отвечает :( Если ещё нужен исходник, пишите прямо на мой мыл (cpp_master@ukr.net)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.068