ZtsFw.Asm
上传用户:lingfuwu
上传日期:2013-03-31
资源大小:13k
文件大小:10k
开发平台:

Asm

  1. .386
  2. .model flat, stdcall  ;32 bit memory model
  3. option casemap :none  ;case sensitive
  4. include common.inc
  5. include ZtsFw.inc
  6. .code
  7. start:
  8. invoke GetModuleHandle, NULL
  9. mov g_hInst, eax
  10. invoke _OpenDevice
  11. .if eax
  12. invoke DialogBoxParam, g_hInst, IDD_DIALOG1, NULL, addr DlgProc, NULL
  13. invoke InitCommonControls
  14. invoke _CloseDevice
  15. .else
  16. invoke MessageBox, NULL, offset szDrvError, offset szZtsFw, MB_OK + MB_ICONINFORMATION
  17. .endif
  18. invoke ExitProcess, 0
  19. DlgProc proc uses ebx esi edi, hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
  20. LOCAL buf[512] : BYTE
  21. LOCAL dwByteReturned
  22. mov eax, uMsg
  23. .if eax==WM_INITDIALOG
  24. invoke _Init, hWnd
  25. .elseif eax==WM_COMMAND
  26. mov eax, wParam
  27. and eax, 0ffffh
  28. .if eax==IDC_BTN_Exit
  29. invoke EndDialog, hWnd, 0
  30. .elseif eax==IDC_BTN_AddPorts
  31. xor ebx, ebx
  32. lea esi, buf
  33. mov edi, offset g_Ports
  34. invoke GetDlgItemText, hWnd, IDC_PORTS, esi, sizeof buf
  35. @001:
  36. xor eax, eax
  37. push eax
  38. invoke sscanf, esi, offset szFormat, esp
  39. pop eax
  40. .if eax<=0FFFFh && ax!=0 && ebx<MAX_PORTS
  41. rol ax, 8
  42. stosw
  43. inc ebx
  44. .endif
  45. @002:
  46. lodsb
  47. test al, al
  48. jz @003
  49. cmp al, ','
  50. jz @001
  51. jmp @002
  52. @003:
  53. add ebx, ebx
  54. invoke DeviceIoControl, g_hDevice, IOCTL_ADD_FILTER, offset g_Ports, ebx, 0, 0, addr dwByteReturned, 0
  55. .elseif eax==IDC_BTN_Start
  56. .if g_bStarted==0
  57. invoke CreateThread, NULL, 0, offset _StartRoutine, NULL, NULL, addr g_dwThreadID
  58. mov g_hThread, eax
  59. mov g_bStarted, 1
  60. .endif
  61. .elseif eax==IDC_BTN_Stop
  62. .if g_bStarted
  63. invoke EnableWindow, g_hStartBtn, TRUE
  64. invoke EnableWindow, g_hStopBtn, FALSE
  65. invoke TerminateThread, g_hThread, 0
  66. invoke DeviceIoControl, g_hDevice, IOCTL_STOP_IP_HOOK, 0, 0, 0, 0, addr dwByteReturned, 0
  67. mov g_bStarted, 0
  68. .endif
  69. .endif
  70. .elseif eax==WM_PAINT
  71. invoke _Paint, hWnd
  72. .elseif eax==WM_CLOSE
  73. invoke EndDialog, hWnd, 0
  74. .else
  75. mov eax, FALSE
  76. ret
  77. .endif
  78. mov eax, TRUE
  79. ret
  80. DlgProc endp
  81. _StartRoutine proc uses ebx esi edi, lParam:DWORD
  82. LOCAL FwEvent
  83. LOCAL stIpInfo : CALLBACK_IP_INFO
  84. LOCAL dwByteReturned
  85. invoke EnableWindow, g_hStartBtn, FALSE
  86. invoke EnableWindow, g_hStopBtn, TRUE
  87. invoke DeviceIoControl, g_hDevice, IOCTL_START_IP_HOOK, 0, 0, 0, 0, addr dwByteReturned, 0
  88. invoke OpenEvent, SYNCHRONIZE, 0, addr szFwEvent
  89. mov FwEvent, eax
  90. xor eax, eax
  91. .while TRUE
  92. invoke WaitForSingleObject, FwEvent, INFINITE
  93. invoke DeviceIoControl, g_hDevice, IOCTL_GET_IP_INFO, 0, 0, addr stIpInfo, sizeof stIpInfo, addr dwByteReturned, 0
  94. invoke _InsertIpInfo, addr stIpInfo
  95. .endw
  96. ret
  97. _StartRoutine endp
  98. _InsertIpInfo proc uses ebx esi edi, lpIpInfo:DWORD
  99. LOCAL lvi : LV_ITEM
  100. LOCAL buf[256] : BYTE
  101. mov esi, lpIpInfo
  102. assume esi : ptr CALLBACK_IP_INFO
  103. ;Protocol
  104. mov lvi.imask, LVIF_TEXT
  105. m2m lvi.iItem, g_dwNum
  106. mov lvi.iSubItem, 0
  107. mov lvi.pszText, CTXT("TCP")
  108. invoke SendMessage, g_hList, LVM_INSERTITEM, 0, addr lvi
  109. inc g_dwNum
  110. ;Source IP
  111. mov lvi.iSubItem, 1
  112. mov eax, [esi].srcIp
  113. invoke inet_ntoa, eax
  114. mov lvi.pszText, eax
  115. invoke SendMessage, g_hList, LVM_SETITEM, 0, addr lvi
  116. ;Source Port
  117. mov lvi.iSubItem, 2
  118. xor eax, eax
  119. mov ax, [esi].srcPort
  120. rol ax, 8
  121. lea edi, buf
  122. invoke wsprintf, edi, offset szFormat, eax
  123. mov lvi.pszText, edi
  124. invoke SendMessage, g_hList, LVM_SETITEM, 0, addr lvi
  125. ;Destination IP
  126. mov lvi.iSubItem, 3
  127. mov eax, [esi].dstIp
  128. invoke inet_ntoa, eax
  129. mov lvi.pszText, eax
  130. invoke SendMessage, g_hList, LVM_SETITEM, 0, addr lvi
  131. ;Destination Port
  132. mov lvi.iSubItem, 4
  133. xor eax, eax
  134. mov ax, [esi].dstPort
  135. rol ax, 8
  136. lea edi, buf
  137. invoke wsprintf, edi, offset szFormat, eax
  138. mov lvi.pszText, edi
  139. invoke SendMessage, g_hList, LVM_SETITEM, 0, addr lvi
  140. ;Flags
  141. mov lvi.iSubItem, 5
  142. mov eax, [esi].bIn
  143. .if eax
  144. mov eax, CTXT("In")
  145. .else
  146. mov eax, CTXT("Out")
  147. .endif
  148. mov lvi.pszText, eax
  149. invoke SendMessage, g_hList, LVM_SETITEM, 0, addr lvi
  150. ret
  151. _InsertIpInfo endp
  152. ;安装驱动程序
  153. _OpenDevice proc uses ebx esi edi
  154. LOCAL hSCManager
  155. LOCAL hService
  156. LOCAL buf[MAX_PATH] : byte
  157. LOCAL szDriverPath[MAX_PATH] : byte
  158. LOCAL hResInfo, dwResSize, lpRes, hFile, dwResult
  159. invoke GetEnvironmentVariable, CTXT("TEMP"), addr g_szDrvFile, MAX_PATH
  160. invoke lstrcat, addr g_szDrvFile, CTXT("drvZtsFw.sys")
  161. invoke FindResource, g_hInst, ID_DRVFILE, RT_RCDATA
  162. test eax, eax
  163. jz exit_0
  164. mov hResInfo, eax
  165. invoke SizeofResource, g_hInst, eax
  166. mov dwResSize, eax
  167. invoke LoadResource, g_hInst, hResInfo
  168. test eax, eax
  169. jz exit_0
  170. invoke LockResource, eax
  171. test eax, eax
  172. jz exit_0
  173. mov lpRes, eax
  174. invoke CreateFile, addr g_szDrvFile, GENERIC_WRITE, FILE_SHARE_READ, 
  175. NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL
  176. cmp eax, INVALID_HANDLE_VALUE
  177. jz exit_0
  178. mov hFile, eax
  179. invoke WriteFile, hFile, lpRes, dwResSize, addr dwResult, NULL
  180. invoke CloseHandle, hFile
  181. ;打开驱动链接
  182. invoke CreateFile, CTXT("\.slZtsFw"), GENERIC_READ+GENERIC_WRITE, 
  183. FILE_SHARE_READ+FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL
  184. .if eax!=INVALID_HANDLE_VALUE
  185. mov g_hDevice, eax
  186. ret
  187. .endif
  188. ;如果上面的打开失败,则说明驱动没有安装或者没有启动
  189. invoke OpenSCManager, NULL, NULL, SC_MANAGER_CREATE_SERVICE
  190. .if eax!=0
  191. mov hSCManager, eax
  192. ;如果驱动已经安装了,则启动驱动程序
  193. invoke OpenService, hSCManager, CTXT("drvZtsFw"), SERVICE_START+DELETE
  194. .if eax!=0
  195. mov hService, eax
  196. invoke StartService, hService, 0, NULL
  197. invoke CloseServiceHandle, hService
  198. ;如果驱动程序没有安装,则先安装,再启动
  199. .else
  200. invoke CreateService, hSCManager, CTXT("drvZtsFw"), CTXT("ZTS's Simple Firewall Service"), 
  201. SERVICE_START+DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, 
  202. SERVICE_ERROR_IGNORE, addr g_szDrvFile, NULL, NULL, NULL, NULL, NULL
  203. .if eax!=0
  204. mov hService, eax
  205. invoke StartService, hService, 0, NULL
  206. invoke CloseServiceHandle, hService
  207. .endif
  208. .endif
  209. invoke CloseServiceHandle, hSCManager
  210. .endif
  211. ;启动驱动程序后,再一次打开驱动链接,如果不出意外,这一次应该可以成功
  212. invoke CreateFile, CTXT("\.slZtsFw"), GENERIC_READ+GENERIC_WRITE, 
  213. FILE_SHARE_READ+FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL
  214. .if eax!=INVALID_HANDLE_VALUE
  215. mov g_hDevice, eax
  216. .else
  217. xor eax, eax
  218. .endif
  219. ret
  220. exit_0:
  221. xor eax, eax
  222. ret
  223. _OpenDevice endp
  224. ;卸载驱动程序
  225. _CloseDevice proc uses ebx esi edi
  226. LOCAL hSCManager
  227. LOCAL hService
  228. LOCAL sest : SERVICE_STATUS
  229. .if g_hDevice
  230. invoke CloseHandle, g_hDevice
  231. .endif
  232. invoke OpenSCManager, NULL, NULL, SC_MANAGER_CONNECT
  233. .if eax!=0
  234. mov hSCManager, eax
  235. invoke OpenService, hSCManager, CTXT("drvZtsFw"), SERVICE_STOP+DELETE
  236. .if eax!=0
  237. mov hService, eax
  238. invoke ControlService, hService, SERVICE_CONTROL_STOP, addr sest
  239. invoke DeleteService, hService
  240. invoke CloseServiceHandle, hService
  241. .endif
  242. invoke CloseServiceHandle, hSCManager
  243. .endif
  244. invoke DeleteFile, addr g_szDrvFile
  245. ret
  246. _CloseDevice endp
  247. _ListViewProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
  248. mov eax, uMsg
  249. .if eax == WM_CONTEXTMENU
  250. invoke SendMessage, g_hList, LVM_GETITEMCOUNT, 0, 0
  251. .if eax != 0
  252. mov eax, lParam
  253. mov ecx, eax
  254. and eax, 0FFFFh
  255. shr ecx, 16
  256. invoke TrackPopupMenu, g_hListMenu, TPM_LEFTALIGN, eax, ecx, NULL, hWnd, NULL
  257. .endif
  258. .elseif eax == WM_COMMAND
  259. mov eax, wParam
  260. and eax, 0ffffh
  261. .if eax == IDM_CLEAR_LOG
  262. invoke SendMessage, g_hList, LVM_DELETEALLITEMS, 0, 0
  263. mov g_dwNum, 0
  264. .endif
  265. .endif
  266. invoke CallWindowProc, g_lpListViewOldProc, hWnd, uMsg, wParam, lParam
  267. ret
  268. _ListViewProc endp
  269. _Init proc uses ebx esi edi, hWnd:HWND
  270. LOCAL lvc:LV_COLUMN
  271. mov g_bStarted, 0
  272. mov g_dwNum, 0
  273. invoke CreateFont, 16, 6, 0, 0, FW_NORMAL, FALSE, FALSE, 0, 0, 0, 0, 0, 0, CTXT("Tahoma")
  274. mov g_hFont, eax
  275. invoke GetDlgItem, hWnd, IDC_BTN_Start
  276. mov g_hStartBtn, eax
  277. invoke GetDlgItem, hWnd, IDC_BTN_Stop
  278. mov g_hStopBtn, eax
  279. invoke EnableWindow, g_hStopBtn, FALSE
  280. invoke GetDlgItem, hWnd, IDC_LIST
  281. mov g_hList, eax
  282. mov lvc.imask, LVCF_TEXT+LVCF_WIDTH
  283. mov lvc.pszText, CTXT("Protocol")
  284. mov lvc.lx, 60
  285. invoke SendMessage, g_hList, LVM_INSERTCOLUMN, 0, addr lvc
  286. mov lvc.pszText, CTXT("Source IP")
  287. mov lvc.lx, 160
  288. invoke SendMessage, g_hList, LVM_INSERTCOLUMN, 1, addr lvc
  289. mov lvc.pszText, CTXT("S.Port")
  290. mov lvc.lx, 60
  291. invoke SendMessage, g_hList, LVM_INSERTCOLUMN, 2, addr lvc
  292. mov lvc.pszText, CTXT("Destination IP")
  293. mov lvc.lx, 160
  294. invoke SendMessage, g_hList, LVM_INSERTCOLUMN, 3, addr lvc
  295. mov lvc.pszText, CTXT("D.Port")
  296. mov lvc.lx, 60
  297. invoke SendMessage, g_hList, LVM_INSERTCOLUMN, 4, addr lvc
  298. mov lvc.pszText, CTXT("Flags")
  299. mov lvc.lx, 120
  300. invoke SendMessage, g_hList, LVM_INSERTCOLUMN, 5, addr lvc
  301. invoke SendMessage, g_hList, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT
  302. invoke CreatePopupMenu
  303. mov g_hListMenu, eax
  304. invoke AppendMenu, g_hListMenu, MF_STRING, IDM_CLEAR_LOG, CTXT("&Clear log")
  305. invoke SetWindowLong, g_hList, GWL_WNDPROC, offset _ListViewProc
  306. mov g_lpListViewOldProc, eax
  307. ret
  308. _Init endp
  309. _Paint proc hWnd:HWND
  310. LOCAL hdc : HDC
  311. LOCAL ps : PAINTSTRUCT
  312. LOCAL rect : RECT
  313. LOCAL pt : POINT
  314. pushad
  315. ;根据最左边的一个控件和最下边的一个控件来计算左下角的位置
  316. invoke BeginPaint, hWnd, addr ps
  317. mov hdc, eax
  318. invoke GetDlgItem, hWnd, IDC_STC1
  319. mov ebx, eax
  320. invoke GetWindowRect, ebx, addr rect
  321. mov ebx, rect.left
  322. invoke GetDlgItem, hWnd, IDC_BTN_Exit
  323. mov esi, eax
  324. invoke GetWindowRect, esi, addr rect
  325. m2m pt.x, rect.left
  326. m2m pt.y, rect.bottom
  327. invoke ScreenToClient, hWnd, addr pt
  328. m2m rect.right, pt.x
  329. m2m rect.bottom, pt.y
  330. m2m pt.x, ebx
  331. m2m pt.y, rect.top
  332. invoke ScreenToClient, hWnd, addr pt
  333. m2m rect.left, pt.x
  334. m2m rect.top, pt.y
  335. ;画上标志,用不同的颜色画两次,产生立体效果
  336. invoke SetBkMode, hdc, TRANSPARENT
  337. invoke SelectObject, hdc, g_hFont
  338. invoke GetSysColor, COLOR_3DHILIGHT
  339. invoke SetTextColor, hdc, eax
  340. invoke DrawText, hdc, offset szLogo, sizeof szLogo, addr rect, DT_VCENTER or DT_LEFT or DT_SINGLELINE
  341. invoke GetSysColor, COLOR_3DSHADOW
  342. invoke SetTextColor, hdc, eax
  343. invoke OffsetRect, addr rect, -1, -1
  344. invoke DrawText, hdc, offset szLogo, sizeof szLogo, addr rect, DT_VCENTER or DT_LEFT or DT_SINGLELINE
  345. invoke EndPaint, hWnd, addr ps
  346. popad
  347. ret
  348. _Paint endp
  349. end start