⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 map.asm

📁 Win32汇编写的端口映射器
💻 ASM
字号:
		.386
		.model flat, stdcall
		option casemap :none   ; case sensitive
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include		windows.inc
include		user32.inc
includelib	user32.lib
include		kernel32.inc
includelib	kernel32.lib
include		wsock32.inc
includelib	wsock32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WM_SOCKET       equ	WM_USER + 100
MAX_SOCKET	equ	300	;最大连接数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.data?
hWinMain	dd	?
hSocket		dd	?
dwsend          db      2 dup(?)
szBuffer	db	8192 dup (?)
stTable		dd	MAX_SOCKET*2 dup (?)
szgsip          db      16 dup(?)
dwsign          dd      ?
szip            db      16 dup(?)
stSin          sockaddr_in <?>
		.const
szErrBind	db	'无法绑定到TCP端口,请检查是否有其它程序在使用!',0
szsection       db      'setup',0
szkey1          db      'lport',0
szkey2          db      'ip',0
szkey3          db      'port',0
szfilename      db      '.\server.ini',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 在客户端列表中加上一个 socket
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_AddClient	proc _hSocket
                mov     dwsign,0
		mov	esi,offset stTable
		.while	dwsign < MAX_SOCKET*2
			.if	! dword ptr [esi]
				push	_hSocket
				pop	[esi]
                        add     dwsign,WM_SOCKET+1
		        invoke	WSAAsyncSelect,_hSocket,hWinMain,dwsign,FD_READ or FD_CLOSE
                        invoke	socket,AF_INET,SOCK_STREAM,0
                        mov     dword ptr [esi+4],eax
                        inc     dwsign
		        invoke	WSAAsyncSelect,eax,hWinMain,dwsign,FD_READ or FD_CLOSE
		        invoke	connect,[esi+4],addr stSin,sizeof stSin
				ret
			.endif
			inc	dwsign
			add	esi,4
		.endw
		invoke	closesocket,_hSocket
		ret

_AddClient	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 从客户端列表中去掉一个 socket
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_RemoveClient	proc	_wMsg

                mov    esi,offset stTable
                add    esi,_wMsg
                add    esi,_wMsg
                add    esi,_wMsg
                add    esi,_wMsg
                sub    esi,(WM_SOCKET+1)*4
                mov    eax,_wMsg
                and    eax,1
                jnz     @F
                invoke	closesocket,[esi]
                invoke	closesocket,[esi-4]
                mov    dword ptr [esi-4],0
                mov    dword ptr [esi],0
                ret
@@:             invoke	closesocket,[esi]
                invoke	closesocket,[esi+4]
                mov    dword ptr [esi],0
                mov    dword ptr [esi+4],0
		ret  

_RemoveClient	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 处理接收到的TCP包
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_RecvData	proc	_wMsg,_hSocket
                local	@dwRecv
		invoke	RtlZeroMemory,addr szBuffer,sizeof szBuffer
		invoke	recv,_hSocket,addr szBuffer,sizeof szBuffer,NULL
                mov     @dwRecv,eax

                mov    esi,offset stTable
                add    esi,_wMsg
                add    esi,_wMsg
                add    esi,_wMsg
                add    esi,_wMsg
                sub    esi,(WM_SOCKET+1)*4
                mov    eax,_wMsg
                and    eax,1
                jnz     @F
                invoke	send,[esi-4],addr szBuffer,@dwRecv,0
                ret

@@:             invoke	send,[esi+4],addr szBuffer,@dwRecv,0
		ret

_RecvData	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 初始化 Socket,绑定到服务TCP端口并监听
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Init		proc
		local	@stWsa:WSADATA
		local	@stSin:sockaddr_in
                local   @lport:DWORD
                local   @sport:DWORD
                invoke  GetDlgItemInt,hWinMain,1001,addr @lport,NULL
                mov     @lport,eax
                invoke  GetDlgItemInt,hWinMain,1003,addr @sport,NULL
                mov     @sport,eax
                invoke  GetDlgItemText,hWinMain,1002,offset szip,16

		invoke	WSAStartup,101h,addr @stWsa
		invoke	socket,AF_INET,SOCK_STREAM,0
		mov	hSocket,eax
		invoke	WSAAsyncSelect,hSocket,hWinMain,WM_SOCKET,FD_ACCEPT

		invoke	RtlZeroMemory,addr @stSin,sizeof @stSin
		invoke	htons,@lport
		mov	@stSin.sin_port,ax
		mov	@stSin.sin_family,AF_INET
		mov	@stSin.sin_addr,INADDR_ANY
		invoke	bind,hSocket,addr @stSin,sizeof @stSin
		.if	eax ==	SOCKET_ERROR
			invoke	MessageBox,hWinMain,addr szErrBind,NULL,\
				MB_OK or MB_ICONWARNING
			invoke	SendMessage,hWinMain,WM_CLOSE,0,0
		.else
			invoke	listen,hSocket,5

		invoke	inet_addr,addr szip
                mov     stSin.sin_addr,eax
   		mov	stSin.sin_family,AF_INET
		invoke	htons,@sport
		mov	stSin.sin_port,ax
                invoke	GetDlgItem,hWinMain,1000
                invoke	EnableWindow,eax,FALSE
                invoke	GetDlgItem,hWinMain,1001
                invoke	EnableWindow,eax,FALSE
                invoke	GetDlgItem,hWinMain,1002
                invoke	EnableWindow,eax,FALSE
                invoke	GetDlgItem,hWinMain,1003
                invoke	EnableWindow,eax,FALSE
		.endif
		ret

_Init		endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 主窗口程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain	proc	uses ebx edi esi hWnd,wMsg,wParam,lParam
		mov	eax,wMsg
		.if	eax>WM_SOCKET && eax<WM_SOCKET+MAX_SOCKET*2+1
                  	mov	eax,lParam
			.if	ax ==	FD_READ
				invoke	_RecvData,wMsg,wParam
			.elseif	ax ==	FD_CLOSE
				invoke	_RemoveClient,wMsg
			.endif      
                .elseif eax ==	WM_SOCKET
			mov	eax,lParam
			.if	ax ==	FD_ACCEPT
				invoke	accept,wParam,0,0
                                invoke  _AddClient,eax
				
			.endif
;********************************************************************
; 退出时关闭全部连接
;********************************************************************
		.elseif	eax ==	WM_CLOSE
			invoke	closesocket,hSocket
			xor	ebx,ebx
			mov	esi,offset stTable
			cld
			.while	ebx <	MAX_SOCKET*2
				lodsd
				.if	eax
					invoke	closesocket,eax
				.endif
				inc	ebx
			.endw
			invoke	WSACleanup
			invoke	EndDialog,hWinMain,NULL
;********************************************************************
		.elseif	eax ==	WM_INITDIALOG
			push	hWnd
			pop	hWinMain
                        mov     esi,offset dwsend
                        mov     byte ptr [esi],0C3h                          ;在每个数据包前加个头
                        mov     byte ptr [esi+1],22h
                        invoke	GetPrivateProfileInt,offset szsection,offset szkey1,0,offset szfilename
                        invoke	SetDlgItemInt,hWinMain,1001,eax,NULL
                        invoke	GetPrivateProfileInt,offset szsection,offset szkey3,0,offset szfilename
                        invoke	SetDlgItemInt,hWinMain,1003,eax,NULL
                        invoke	GetPrivateProfileString,offset szsection,offset szkey2,0,offset szgsip,16,offset szfilename
                        invoke  SetDlgItemText,hWinMain,1002,offset szgsip
;**********************************************************************
		.elseif	eax ==	WM_COMMAND
                        mov     eax,wParam
                         .if    ax==1000
                          call  _Init
                         .endif

;********************************************************************
		.else
			mov	eax,FALSE
			ret
		.endif
		mov	eax,TRUE
		ret

_ProcDlgMain	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 程序开始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
		invoke	GetModuleHandle,NULL
		invoke	DialogBoxParam,eax,101,NULL,offset _ProcDlgMain,0
		invoke	ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		end	start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -