() {
197 | @Override
198 | public String call() {
199 | // in real life, do real work here...
200 | if (Objects.equals(PortScanner(bean.getTarget(), NPort, bean.getDelay()), "OPEN")) {
201 | // System.out.println(NPort + ": open");
202 | ProgressSet();
203 | // ResultSet(String.valueOf(NPort));
204 | if(PORT_CONTER>=bean.getEnd_port())
205 | {
206 | PortScanEnd();
207 | }
208 | return String.valueOf(NPort); // value to be processed in onSucceeded
209 | } else {
210 | // System.out.println(NPort);
211 | ProgressSet();
212 | if(PORT_CONTER>=bean.getEnd_port())
213 | {
214 | PortScanEnd();
215 | }
216 | return null; // value to be processed in onSucceeded
217 | }
218 | }
219 | };
220 | task.setOnSucceeded(e -> ResultSet(task.getValue()));
221 | exec.execute(task);
222 | }
223 | }
224 |
225 | private String PortScanner(String address, int port, int delay) {
226 | String result = "OPEN";
227 | Socket socket;
228 | try {
229 | socket = new Socket();
230 | SocketAddress addport = new InetSocketAddress(address, port);
231 | socket.connect(addport, delay);
232 | socket.close();
233 | } catch (IOException e) {
234 | result = "CLOSE";
235 | }
236 | return result;
237 | }
238 | }
239 |
--------------------------------------------------------------------------------
/src/main/java/View/UtilsView/DirectoryScan/DirectoryScan.fxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
--------------------------------------------------------------------------------
/src/main/java/View/UtilsView/DirectoryScan/StstusCodeFast.java:
--------------------------------------------------------------------------------
1 | package View.UtilsView.DirectoryScan;
2 |
3 | import javafx.application.Application;
4 | import javafx.scene.Group;
5 | import javafx.scene.Scene;
6 | import javafx.scene.image.Image;
7 | import javafx.scene.layout.VBox;
8 | import javafx.scene.web.WebEngine;
9 | import javafx.scene.web.WebView;
10 | import javafx.stage.Stage;
11 |
12 | public class StstusCodeFast extends Application {
13 |
14 | final String a = "信息响应(100)
\n" +
15 | "\n" +
16 | "100 Continue
\n" +
17 | "\n" +
18 | "这个临时响应表明,迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它。
\n" +
19 | "\n" +
20 | "101 Switching Protocol
\n" +
21 | "\n" +
22 | "该代码是响应客户端的 Upgrade 标头发送的,并且指示服务器也正在切换的协议。
\n" +
23 | "\n" +
24 | "102 Processing (WebDAV)
\n" +
25 | "\n" +
26 | "此代码表示服务器已收到并正在处理该请求,但没有响应可用。
\n" +
27 | "\n" +
28 | "103 Early Hints
\n" +
29 | "\n" +
30 | "此状态代码主要用于与Link 链接头一起使用,以允许用户代理在服务器仍在准备响应时开始预加载资源。
\n" +
31 | "\n" +
32 | "成功响应(200)
\n" +
33 | "\n" +
34 | "200 OK
\n" +
35 | "\n" +
36 | "请求成功。成功的含义取决于HTTP方法:
GET:资源已被提取并在消息正文中传输。
HEAD:实体标头位于消息正文中。
POST:描述动作结果的资源在消息体中传输。
TRACE:消息正文包含服务器收到的请求消息
\n" +
37 | "\n" +
38 | "201 Created
\n" +
39 | "\n" +
40 | "该请求已成功,并因此创建了一个新的资源。这通常是在POST请求,或是某些PUT请求之后返回的响应。
\n" +
41 | "\n" +
42 | "202 Accepted
\n" +
43 | "\n" +
44 | "请求已经接收到,但还未响应,没有结果。意味着不会有一个异步的响应去表明当前请求的结果,预期另外的进程和服务去处理请求,或者批处理。
\n" +
45 | "\n" +
46 | "203 Non-Authoritative Information
\n" +
47 | "\n" +
48 | "服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超集。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的。
\n" +
49 | "\n" +
50 | "204 No Content
\n" +
51 | "\n" +
52 | "服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。由于204响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾。
\n" +
53 | "\n" +
54 | "205 Reset Content
\n" +
55 | "\n" +
56 | "服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。
\n" +
57 | "\n" +
58 | "206 Partial Content
\n" +
59 | "\n" +
60 | "服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。
\n" +
61 | "\n" +
62 | "207 Multi-Status (WebDAV)
\n" +
63 | "\n" +
64 | "由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
\n" +
65 | "\n" +
66 | "208 Already Reported (WebDAV)
\n" +
67 | "\n" +
68 | "在 DAV 里面使用: propstat 响应元素以避免重复枚举多个绑定的内部成员到同一个集合。
\n" +
69 | "\n" +
70 | "226 IM Used (HTTP Delta encoding)
\n" +
71 | "\n" +
72 | "服务器已经完成了对资源的 GET 请求,并且响应是对当前实例应用的一个或多个实例操作结果的表示。
\n" +
73 | "\n" +
74 | "重定向(300)
\n" +
75 | "\n" +
76 | "300 Multiple Choice
\n" +
77 | "\n" +
78 | "被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。
\n" +
79 | "\n" +
80 | "301 Moved Permanently
\n" +
81 | "\n" +
82 | "被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。
\n" +
83 | "\n" +
84 | "302 Found
\n" +
85 | "\n" +
86 | "请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
\n" +
87 | "\n" +
88 | "303 See Other
\n" +
89 | "\n" +
90 | "对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。
\n" +
91 | "\n" +
92 | "304 Not Modified
\n" +
93 | "\n" +
94 | "如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304 响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。
\n" +
95 | "\n" +
96 | "305 Use Proxy
\n" +
97 | "\n" +
98 | "被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的 URI 信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。
\n" +
99 | "\n" +
100 | "306 unused
\n" +
101 | "\n" +
102 | "在最新版的规范中,306 状态码已经不再被使用。
\n" +
103 | "\n" +
104 | "307 Temporary Redirect
\n" +
105 | "\n" +
106 | "请求的资源现在临时从不同的URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
\n" +
107 | "\n" +
108 | "308 Permanent Redirect
\n" +
109 | "\n" +
110 | "这意味着资源现在永久位于由 Location: HTTP Response 标头指定的另一个 URI。 这与 301 Moved Permanently HTTP 响应代码具有相同的语义,但用户代理不能更改所使用的 HTTP 方法:如果在第一个请求中使用 POST,则必须在第二个请求中使用 POST。
\n" +
111 | "\n" +
112 | "客户端响应(400)
\n" +
113 | "\n" +
114 | "400 Bad Request
\n" +
115 | "\n" +
116 | "1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
2、请求参数有误。
\n" +
117 | "\n" +
118 | "401 Unauthorized
\n" +
119 | "\n" +
120 | "当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端可以重复提交一个包含恰当的 Authorization 头信息的请求。如果当前请求已经包含了 Authorization 证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。
\n" +
121 | "\n" +
122 | "402 Payment Required
\n" +
123 | "\n" +
124 | "此响应码保留以便将来使用,创造此响应码的最初目的是用于数字支付系统,然而现在并未使用。
\n" +
125 | "\n" +
126 | "403 Forbidden
\n" +
127 | "\n" +
128 | "服务器已经理解请求,但是拒绝执行它。与 401 响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。如果这不是一个 HEAD 请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个 404 响应,假如它不希望让客户端获得任何信息。
\n" +
129 | "\n" +
130 | "404 Not Found
\n" +
131 | "\n" +
132 | "请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。
\n" +
133 | "\n" +
134 | "405 Method Not Allowed
\n" +
135 | "\n" +
136 | "请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表。 鉴于 PUT,DELETE 方法会对服务器上的资源进行写操作,因而绝大部分的网页服务器都不支持或者在默认配置下不允许上述请求方法,对于此类请求均会返回405错误。
\n" +
137 | "\n" +
138 | "406 Not Acceptable
\n" +
139 | "\n" +
140 | "请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。
\n" +
141 | "\n" +
142 | "407 Proxy Authentication Required
\n" +
143 | "\n" +
144 | "与401响应类似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个 Proxy-Authenticate 用以进行身份询问。客户端可以返回一个 Proxy-Authorization 信息头用以验证。
\n" +
145 | "\n" +
146 | "408 Request Timeout
\n" +
147 | "\n" +
148 | "请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改。
\n" +
149 | "\n" +
150 | "409 Conflict
\n" +
151 | "\n" +
152 | "由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。
\n" +
153 | "\n" +
154 | "410 Gone
\n" +
155 | "\n" +
156 | "被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应当被认为是永久性的。如果可能,拥有链接编辑功能的客户端应当在获得用户许可后删除所有指向这个地址的引用。如果服务器不知道或者无法确定这个状况是否是永久的,那么就应该使用 404 状态码。除非额外说明,否则这个响应是可缓存的。
\n" +
157 | "\n" +
158 | "411 Length Required
\n" +
159 | "\n" +
160 | "服务器拒绝在没有定义 Content-Length 头的情况下接受请求。在添加了表明请求消息体长度的有效 Content-Length 头之后,客户端可以再次提交该请求。
\n" +
161 | "\n" +
162 | "412 Precondition Failed
\n" +
163 | "\n" +
164 | "服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。
\n" +
165 | "\n" +
166 | "413 Payload Too Large
\n" +
167 | "\n" +
168 | "服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求。如果这个状况是临时的,服务器应当返回一个 Retry-After 的响应头,以告知客户端可以在多少时间以后重新尝试。
\n" +
169 | "\n" +
170 | "414 URI Too Long
\n" +
171 | "\n" +
172 | "请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见,通常的情况包括:本应使用POST方法的表单提交变成了GET方法,导致查询字符串(Query String)过长。
\n" +
173 | "\n" +
174 | "415 Unsupported Media Type
\n" +
175 | "\n" +
176 | "对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。
\n" +
177 | "\n" +
178 | "416 Range Not Satisfiable
\n" +
179 | "\n" +
180 | "如果请求中包含了 Range 请求头,并且 Range 中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回416状态码。
\n" +
181 | "\n" +
182 | "417 Expectation Failed
\n" +
183 | "\n" +
184 | "此响应代码意味着服务器无法满足 Expect 请求标头字段指示的期望值。
\n" +
185 | "\n" +
186 | "418 I'm a teapot
\n" +
187 | "\n" +
188 | "服务器拒绝尝试用 “茶壶冲泡咖啡”。
\n" +
189 | "\n" +
190 | "421 Misdirected Request
\n" +
191 | "\n" +
192 | "该请求针对的是无法产生响应的服务器。 这可以由服务器发送,该服务器未配置为针对包含在请求 URI 中的方案和权限的组合产生响应。
\n" +
193 | "\n" +
194 | "422 Unprocessable Entity (WebDAV)
\n" +
195 | "\n" +
196 | "请求格式良好,但由于语义错误而无法遵循。
\n" +
197 | "\n" +
198 | "423 Locked (WebDAV)
\n" +
199 | "\n" +
200 | "正在访问的资源被锁定。
\n" +
201 | "\n" +
202 | "424 Failed Dependency (WebDAV)
\n" +
203 | "\n" +
204 | "由于先前的请求失败,所以此次请求失败。
\n" +
205 | "\n" +
206 | "425 Too Early
\n" +
207 | "\n" +
208 | "服务器不愿意冒着风险去处理可能重播的请求。
\n" +
209 | "\n" +
210 | "426 Upgrade Required
\n" +
211 | "\n" +
212 | "服务器拒绝使用当前协议执行请求,但可能在客户机升级到其他协议后愿意这样做。 服务器在 426 响应中发送 Upgrade 头以指示所需的协议。
\n" +
213 | "\n" +
214 | "428 Precondition Required
\n" +
215 | "\n" +
216 | "原始服务器要求该请求是有条件的。 旨在防止“丢失更新”问题,即客户端获取资源状态,修改该状态并将其返回服务器,同时第三方修改服务器上的状态,从而导致冲突。
\n" +
217 | "\n" +
218 | "429 Too Many Requests
\n" +
219 | "\n" +
220 | "用户在给定的时间内发送了太多请求(“限制请求速率”)。
\n" +
221 | "\n" +
222 | "431 Request Header Fields Too Large
\n" +
223 | "\n" +
224 | "服务器不愿意处理请求,因为它的 请求头字段太大( Request Header Fields Too Large)。 请求可以在减小请求头字段的大小后重新提交。
\n" +
225 | "\n" +
226 | "451 Unavailable For Legal Reasons
\n" +
227 | "\n" +
228 | "用户请求非法资源,例如:由政府审查的网页。
\n" +
229 | "\n" +
230 | "服务端响应(500)
\n" +
231 | "\n" +
232 | "500 Internal Server Error
\n" +
233 | "\n" +
234 | "服务器遇到了不知道如何处理的情况。
\n" +
235 | "\n" +
236 | "501 Not Implemented
\n" +
237 | "\n" +
238 | "此请求方法不被服务器支持且无法被处理。只有GET和HEAD是要求服务器支持的,它们必定不会返回此错误代码。
\n" +
239 | "\n" +
240 | "502 Bad Gateway
\n" +
241 | "\n" +
242 | "此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应。
\n" +
243 | "\n" +
244 | "503 Service Unavailable
\n" +
245 | "\n" +
246 | "服务器没有准备好处理请求。 常见原因是服务器因维护或重载而停机。 请注意,与此响应一起,应发送解释问题的用户友好页面。 这个响应应该用于临时条件和 Retry-After:如果可能的话,HTTP头应该包含恢复服务之前的估计时间。 网站管理员还必须注意与此响应一起发送的与缓存相关的标头,因为这些临时条件响应通常不应被缓存。
\n" +
247 | "\n" +
248 | "504 Gateway Timeout
\n" +
249 | "\n" +
250 | "当服务器作为网关,不能及时得到响应时返回此错误代码。
\n" +
251 | "\n" +
252 | "505 HTTP Version Not Supported
\n" +
253 | "\n" +
254 | "服务器不支持请求中所使用的HTTP协议版本。
\n" +
255 | "\n" +
256 | "506 Variant Also Negotiates
\n" +
257 | "\n" +
258 | "服务器有一个内部配置错误:对请求的透明内容协商导致循环引用。
\n" +
259 | "\n" +
260 | "507 Insufficient Storage
\n" +
261 | "\n" +
262 | "服务器有内部配置错误:所选的变体资源被配置为参与透明内容协商本身,因此不是协商过程中的适当端点。
\n" +
263 | "\n" +
264 | "508 Loop Detected (WebDAV)
\n" +
265 | "\n" +
266 | "服务器在处理请求时检测到无限循环。
\n" +
267 | "\n" +
268 | "510 Not Extended
\n" +
269 | "\n" +
270 | "客户端需要对请求进一步扩展,服务器才能实现它。服务器会回复客户端发出扩展请求所需的所有信息。
\n" +
271 | "\n" +
272 | "511 Network Authentication Required
\n" +
273 | "\n" +
274 | "511 状态码指示客户端需要进行身份验证才能获得网络访问权限。
";
275 |
276 | @Override
277 | public void start(Stage primaryStage) {
278 | primaryStage.setTitle("StstusCodeFast");
279 | primaryStage.setWidth(670);
280 | primaryStage.setHeight(800);
281 | primaryStage.setResizable(false);
282 | primaryStage.getIcons().add(new Image(StstusCodeFast.class.getResourceAsStream("/img/icon/book-2-line.png")));
283 | VBox root = new VBox();
284 | Scene scene = new Scene(new Group());
285 | final WebView browser = new WebView();
286 | final WebEngine webEngine = browser.getEngine();
287 |
288 | browser.setPrefHeight(800);
289 |
290 | webEngine.loadContent(a);
291 |
292 | root.getChildren().addAll(browser);
293 | scene.setRoot(root);
294 |
295 | primaryStage.setScene(scene);
296 | primaryStage.show();
297 | }
298 | }
299 |
--------------------------------------------------------------------------------
/src/main/java/View/UtilsView/DirectoryScan/DirectoryScanController.java:
--------------------------------------------------------------------------------
1 | package View.UtilsView.DirectoryScan;
2 |
3 | import Init.Init;
4 | import com.jfoenix.controls.*;
5 | import javafx.animation.KeyFrame;
6 | import javafx.animation.KeyValue;
7 | import javafx.animation.Timeline;
8 | import javafx.application.Platform;
9 | import javafx.collections.FXCollections;
10 | import javafx.collections.ObservableList;
11 | import javafx.concurrent.Task;
12 | import javafx.fxml.FXML;
13 | import javafx.geometry.Pos;
14 | import javafx.scene.control.Alert;
15 | import javafx.scene.layout.AnchorPane;
16 | import javafx.stage.FileChooser;
17 | import javafx.stage.Stage;
18 | import javafx.util.Duration;
19 |
20 | import javax.swing.filechooser.FileSystemView;
21 | import java.awt.*;
22 | import java.awt.datatransfer.Clipboard;
23 | import java.awt.datatransfer.StringSelection;
24 | import java.awt.datatransfer.Transferable;
25 | import java.io.File;
26 | import java.io.FileOutputStream;
27 | import java.io.OutputStreamWriter;
28 | import java.util.ArrayList;
29 | import java.util.concurrent.Executor;
30 | import java.util.concurrent.Executors;
31 |
32 | public class DirectoryScanController {
33 | DirectoryScanBean bean = new DirectoryScanBean();
34 | DirectoryScanIcon directoryScanIcon = new DirectoryScanIcon();
35 | DirectoryScanImpl directoryScanimpl = new DirectoryScanImpl();
36 |
37 | ArrayList allCheckBoxList = new ArrayList<>();
38 |
39 | ObservableList ResultList = FXCollections.observableArrayList();
40 |
41 | private static int SCAN_CONTER = 0;
42 | private static String PROTOCOL = "http://";
43 |
44 | @FXML AnchorPane settingPane;
45 | @FXML AnchorPane resultPane;
46 | @FXML JFXComboBox CB_Protocol;
47 |
48 | @FXML JFXTextField field_target;
49 | @FXML JFXTextField field_dicPath;
50 | @FXML JFXTextField field_preview;
51 |
52 | @FXML JFXTextField field_threadCount;
53 | @FXML JFXTextField field_delay;
54 | @FXML JFXTextField field_dicCount;
55 | @FXML JFXTextField field_state;
56 |
57 | @FXML JFXCheckBox check_200_box;
58 | @FXML JFXCheckBox check_301_box;
59 | @FXML JFXCheckBox check_302_box;
60 | @FXML JFXCheckBox check_303_box;
61 | @FXML JFXCheckBox check_401_box;
62 | @FXML JFXCheckBox check_403_box;
63 | @FXML JFXCheckBox check_404_box;
64 | @FXML JFXCheckBox check_1XX_box;
65 | @FXML JFXCheckBox check_2XX_box;
66 | @FXML JFXCheckBox check_3XX_box;
67 | @FXML JFXCheckBox check_4XX_box;
68 | @FXML JFXCheckBox check_5XX_box;
69 | @FXML JFXCheckBox check_ALL_box;
70 |
71 | @FXML JFXButton BT_start;
72 | @FXML JFXButton BT_selectDic;
73 | @FXML JFXButton BT_next;
74 | @FXML JFXButton BT_back;
75 |
76 | @FXML JFXComboBox CB_filter;
77 |
78 | @FXML JFXButton LBT_save;
79 | @FXML JFXButton LBT_ststusCodeFast;
80 | @FXML JFXButton LBT_copy;
81 | @FXML JFXButton LBT_order;
82 | @FXML JFXButton LBT_05;
83 |
84 | @FXML
85 | JFXListView view_result;
86 |
87 | @FXML JFXProgressBar progressBar;
88 | @FXML JFXSpinner spinner;
89 |
90 | @FXML private void initialize(){
91 | LBT_ststusCodeFast.setGraphic(directoryScanIcon.book_mark_fill);
92 | LBT_save.setGraphic(directoryScanIcon.save_fill);
93 | BT_back.setGraphic(directoryScanIcon.arrow_go_back);
94 | BT_next.setGraphic(directoryScanIcon.arrow_right);
95 | LBT_copy.setGraphic(directoryScanIcon.clipbord);
96 | LBT_order.setGraphic(directoryScanIcon.sort_desc);
97 |
98 | view_result.setItems(ResultList);
99 |
100 | BT_start.setDisable(true);
101 | initCB_CB_Protocol();
102 | FieldsListener();
103 | CheckBoxListCreate();
104 | }
105 | // Button
106 | @FXML private void OnBT_start(){
107 | initOnBT_start();
108 | initCB_filter();
109 | ResultList.clear();
110 | paneCheckAnime(resultPane,settingPane);
111 | BT_start.setDisable(true);
112 | DirectoryScan();
113 | }
114 |
115 | private void initOnBT_start(){
116 | progressBar.lookup(".bar").setStyle("-fx-background-color: #26a7e2;");
117 | bean.setThreadCount(Integer.parseInt(field_threadCount.getText()));
118 | bean.setDelay(Integer.parseInt(field_delay.getText()));
119 | field_state.setVisible(false);
120 | spinner.setVisible(true);
121 | SCAN_CONTER = 0;
122 | CB_filter.setDisable(true);
123 | }
124 |
125 | @FXML private void OnDirectory_select(){
126 | bean.setDirectoryFile(directoryScanimpl.DirectoryGet(Init.languageResourceBundle.getString("FileChooserTitle")));
127 | try{
128 | field_dicPath.setText(bean.getDirectoryFile().toString());
129 | field_dicPath.setAlignment(Pos.CENTER_LEFT);
130 | bean.setDirectoryLineCountNum(directoryScanimpl.DirectoryLineGet(bean.getDirectoryFile()));
131 | field_dicCount.setText(String.valueOf(bean.getDirectoryLineCountNum()));
132 | bean.setDirectoryText(directoryScanimpl.DirectoryTextGet(bean.getDirectoryFile()));
133 | // for (String a: bean.getDirectoryText()) { System.out.println(a); }
134 | // System.out.println(bean.getDirectoryFile());
135 | }catch (Exception e){
136 | e.printStackTrace();
137 | }
138 | }
139 |
140 | @FXML private void OnBT_back(){
141 | paneCheckAnime(settingPane,resultPane);
142 | }
143 |
144 | @FXML private void OnBT_next(){
145 | paneCheckAnime(resultPane,settingPane);
146 | }
147 |
148 | @FXML private void OnLBT_save(){
149 | FileChooser fileChooser = new FileChooser();
150 | FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("TXT files (*.txt)", "*.txt");
151 | fileChooser.getExtensionFilters().add(extFilter);
152 | Stage s = new Stage();
153 | FileSystemView fsv = FileSystemView.getFileSystemView();
154 | fileChooser.setInitialDirectory(fsv.getHomeDirectory());
155 | fileChooser.setInitialFileName("Result");
156 | File file = fileChooser.showSaveDialog(s);
157 | if(file==null) {
158 | return;
159 | }else{
160 | try {
161 | OutputStreamWriter OSW = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
162 | for (String a:view_result.getItems()) {
163 | OSW.write(a.replace(" "," "+PROTOCOL+bean.getTargetURL())+"\n");
164 | //System.out.println(a.substring(0,3));
165 | }
166 | OSW.flush();
167 | OSW.close();
168 | Desktop.getDesktop().open(file);
169 | } catch (Exception e) {
170 | e.printStackTrace();
171 | }
172 | }
173 | // String exportFilePath = file.getAbsolutePath();
174 | // System.out.println(exportFilePath);
175 | }
176 |
177 | @FXML private void OnLBT_ststusCodeFast(){
178 | new StstusCodeFast().start(new Stage());
179 | }
180 |
181 | @FXML private void OnLBT_copy(){
182 | StringBuilder result = new StringBuilder();
183 | for (String a:view_result.getItems()) {
184 | result.append(a).append("\n");
185 | }
186 |
187 | Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
188 | Transferable tText = new StringSelection(result.toString());
189 | clip.setContents(tText, null);
190 |
191 | Alert alert = new Alert(Alert.AlertType.INFORMATION);
192 | alert.setGraphic(directoryScanIcon.clipbord_alert);
193 | alert.setTitle(Init.languageResourceBundle.getString("Infomation"));
194 | alert.setHeaderText(Init.languageResourceBundle.getString("Copy_Complete"));
195 | alert.setContentText(Init.languageResourceBundle.getString("Copy_Complete_message"));
196 | alert.showAndWait();
197 | }
198 |
199 | @FXML private void OnLBT_order(){
200 | for (int i = 0; i < view_result.getItems().size()-1; i++) {
201 | for (int j = 0; j < view_result.getItems().size()-1; j++) {
202 | if(Integer.parseInt((view_result.getItems().get(j)).substring(0,3))>Integer.parseInt((view_result.getItems().get(j+1)).substring(0,3))){
203 | String Temp = view_result.getItems().get(j);
204 | view_result.getItems().set(j,view_result.getItems().get(j+1));
205 | view_result.getItems().set(j+1,Temp);
206 | }
207 | }
208 | }
209 | }
210 | // Field
211 | private void FieldsListener(){
212 | field_target.textProperty().addListener((observable, oldValue, newValue) -> Platform.runLater(() -> {
213 | if(!field_target.getText().isEmpty()&&!field_dicPath.getText().isEmpty()){
214 | bean.setTargetURL(field_target.getText());
215 | PROTOCOL = CB_Protocol.getValue();
216 | field_preview.setText(PROTOCOL + bean.getTargetURL()+bean.getDirectoryText().get(1));
217 | }
218 | }));
219 |
220 | field_preview.textProperty().addListener((observable, oldValue, newValue) -> Platform.runLater(() -> {
221 | if(!field_preview.getText().isEmpty()){
222 | BT_start.setDisable(false);
223 | }
224 | }));
225 |
226 | field_dicPath.textProperty().addListener((observable, oldValue, newValue) -> Platform.runLater(() -> {
227 | if(!field_target.getText().isEmpty()&&!field_dicPath.getText().isEmpty()){
228 | bean.setTargetURL(field_target.getText());
229 | PROTOCOL = CB_Protocol.getValue();
230 | field_preview.setText(PROTOCOL + bean.getTargetURL()+bean.getDirectoryText().get(1));
231 | }
232 | }));
233 | }
234 | // Anime
235 | private void paneCheckAnime(AnchorPane set,AnchorPane noset){
236 | Timeline timeLine = new Timeline();
237 |
238 | KeyValue kv_S_Start = new KeyValue(noset.translateXProperty(), 0);
239 | KeyFrame kf_S_Start = new KeyFrame(Duration.seconds(0), "Start", event -> noset.setVisible(false),kv_S_Start);
240 |
241 | KeyValue kv_S_Stop = new KeyValue(noset.translateXProperty(), -680);
242 | KeyFrame kf_S_Stop = new KeyFrame(Duration.seconds(0.3), "Stop", event -> { },kv_S_Stop);
243 |
244 | KeyValue kv_N_Start = new KeyValue(set.translateXProperty(), 680);
245 | KeyFrame kf_N_Start = new KeyFrame(Duration.seconds(0), "Start", event -> set.setVisible(true),kv_N_Start);
246 |
247 | KeyValue kv_N_Stop = new KeyValue(set.translateXProperty(), 0);
248 | KeyFrame kf_N_Stop = new KeyFrame(Duration.seconds(0.3), "Stop", event -> { },kv_N_Stop);
249 |
250 | timeLine.getKeyFrames().addAll(kf_S_Start,kf_S_Stop,kf_N_Start,kf_N_Stop);
251 | timeLine.play();
252 | }
253 | // CheckBox
254 | private void CheckBoxListCreate(){
255 | allCheckBoxList.add(check_200_box);
256 | allCheckBoxList.add(check_301_box);
257 | allCheckBoxList.add(check_302_box);
258 | allCheckBoxList.add(check_303_box);
259 | allCheckBoxList.add(check_401_box);
260 | allCheckBoxList.add(check_403_box);
261 | allCheckBoxList.add(check_404_box);
262 | allCheckBoxList.add(check_1XX_box);
263 | allCheckBoxList.add(check_2XX_box);
264 | allCheckBoxList.add(check_3XX_box);
265 | allCheckBoxList.add(check_4XX_box);
266 | allCheckBoxList.add(check_5XX_box);
267 | allCheckBoxList.add(check_ALL_box);
268 | }
269 |
270 | private ObservableList CheckBoxCheck(){
271 | ObservableList result = FXCollections.observableArrayList();
272 | for (JFXCheckBox TempCB:allCheckBoxList) {
273 | if(TempCB.isSelected()){
274 | result.add(TempCB.getText());
275 | }
276 | TempCB.getText();
277 | }
278 | // for (String a:result) { System.out.println(a); }
279 | return result;
280 | }
281 | // ComboBox
282 | private void initCB_filter(){
283 | bean.setCheckStstusCode(CheckBoxCheck());
284 | ObservableList Checking = FXCollections.observableArrayList();
285 | Checking.addAll("ALL");
286 | for (String a:bean.getCheckStstusCode()) {
287 | if(!a.equals("ALL")){
288 | Checking.addAll(a);
289 | }
290 | }
291 | CB_filter.setItems(Checking);
292 | CB_filter.getSelectionModel().select(0);
293 | }
294 |
295 | private void initCB_CB_Protocol(){
296 | ObservableList Protocol = FXCollections.observableArrayList();
297 | Protocol.add("http://");
298 | Protocol.add("https://");
299 | CB_Protocol.setItems(Protocol);
300 | CB_Protocol.getSelectionModel().select(0);
301 | }
302 |
303 | @FXML private void SelectCB_filter(){
304 | // System.out.println(CB_filter.getValue());
305 |
306 | ObservableList SelectedList = FXCollections.observableArrayList();
307 |
308 | if(!CB_filter.getValue().equals("ALL")&&!CB_filter.getValue().contains("X")){
309 | SelectedList.clear();
310 | for (String a:ResultList) {
311 | if(CB_filter.getValue().equals(a.substring(0,3))){
312 | SelectedList.add(a);
313 | }
314 | }
315 | view_result.setItems(SelectedList);
316 | }else if (!CB_filter.getValue().equals("ALL")&&CB_filter.getValue().contains("X")){
317 | SelectedList.clear();
318 | for (String a:ResultList) {
319 | if(CB_filter.getValue().replace("X","").equals(a.substring(0,1))){
320 | SelectedList.add(a);
321 | }
322 | }
323 | view_result.setItems(SelectedList);
324 | }else {
325 | view_result.setItems(ResultList);
326 | }
327 | }
328 | // OnScan
329 | private void DirectoryScan(){
330 | Executor exec = Executors.newFixedThreadPool(bean.getThreadCount(), runnable -> {
331 | Thread t = Executors.defaultThreadFactory().newThread(runnable);
332 | t.setDaemon(true);
333 | return t ;
334 | });
335 |
336 | for (int Times = 0; Times <= bean.getDirectoryLineCountNum(); Times++) {
337 | int frequency = Times;
338 | Task task = new Task() {
339 | @Override
340 | public String call() {
341 | // in real life, do real work here...
342 | String Result = null;
343 | try{
344 | Result = DirectoryScanner(frequency);
345 | ProgressSet();
346 | if(SCAN_CONTER>=bean.getDirectoryLineCountNum())
347 | {
348 | DirectoryScanEnd();
349 | }
350 | }catch(Exception e){
351 | ProgressSet();
352 | if(SCAN_CONTER>=bean.getDirectoryLineCountNum())
353 | {
354 | DirectoryScanEnd();
355 | }
356 | }
357 | return Result;
358 | }
359 | };
360 | task.setOnSucceeded(e -> ResultSet(task.getValue()));
361 | exec.execute(task);
362 | }
363 | }
364 |
365 | private void ResultSet(String Result){
366 | if(Result!=null){
367 | synchronized(this) {
368 | ResultList.add(Result);
369 | }
370 | }
371 | }
372 |
373 | private void DirectoryScanEnd(){
374 | BT_start.setDisable(false);
375 | spinner.setVisible(false);
376 | field_state.setVisible(true);
377 | progressBar.lookup(".bar").setStyle("-fx-background-color: #26e283;");
378 | CB_filter.setDisable(false);
379 | }
380 |
381 | private void ProgressSet(){
382 | PortCountAdd();
383 |
384 | spinner.setProgress((double)SCAN_CONTER/bean.getDirectoryLineCountNum());
385 | progressBar.setProgress((double)SCAN_CONTER/bean.getDirectoryLineCountNum());
386 | }
387 |
388 | private void PortCountAdd(){
389 | synchronized(this) {
390 | SCAN_CONTER++;
391 | }
392 | }
393 |
394 | private String DirectoryScanner(int frequency){
395 | String ResultNumber = directoryScanimpl.ResponseNumGet(PROTOCOL + bean.getTargetURL()+bean.getDirectoryText().get(frequency),bean.getDelay());
396 | String Result;
397 | for (String a : bean.getCheckStstusCode()) {
398 | if (a.equals(ResultNumber)) {
399 | Result = ResultNumber+" "+bean.getDirectoryText().get(frequency);
400 | return Result;
401 | }else if(a.equals(((Integer.parseInt(ResultNumber)/100)+"XX"))){
402 | Result = ResultNumber+" "+bean.getDirectoryText().get(frequency);
403 | return Result;
404 | }
405 | }
406 | return null;
407 | }
408 |
409 | }
410 |
--------------------------------------------------------------------------------
/src/main/java/View/UtilsView/PortScan/PortFast.java:
--------------------------------------------------------------------------------
1 | package View.UtilsView.PortScan;
2 | import javafx.application.Application;
3 |
4 | import javafx.scene.Group;
5 | import javafx.scene.Scene;
6 | import javafx.scene.image.Image;
7 | import javafx.scene.layout.VBox;
8 | import javafx.scene.web.WebEngine;
9 | import javafx.scene.web.WebView;
10 | import javafx.stage.Stage;
11 |
12 | public class PortFast extends Application {
13 |
14 | final String a = "\n" +
15 | "\n" +
16 | " t2\n" +
17 | " \n" +
18 | " \n" +
19 | " \n" +
20 | " \n" +
111 | " \n" +
112 | " \n" +
113 | " \n" +
114 | "
\n" +
115 | "\n" +
116 | "\n" +
117 | "| 端口 | \n" +
118 | "服务 | \n" +
119 | "入侵方式 | \n" +
120 | "
\n" +
121 | "\n" +
122 | "\n" +
123 | "\n" +
124 | "| 21 | \n" +
125 | "ftp/tftp/vsftpd文件传输协议 | \n" +
126 | "爆破/嗅探/溢出/后门 | \n" +
127 | "
\n" +
128 | "\n" +
129 | "| 22 | \n" +
130 | "ssh远程连接 | \n" +
131 | "爆破/openssh漏洞 | \n" +
132 | "
\n" +
133 | "\n" +
134 | "| 23 | \n" +
135 | "Telnet远程连接 | \n" +
136 | "爆破/嗅探/弱口令 | \n" +
137 | "
\n" +
138 | "\n" +
139 | "| 25 | \n" +
140 | "SMTP邮件服务 | \n" +
141 | "邮件伪造 | \n" +
142 | "
\n" +
143 | "\n" +
144 | "| 53 | \n" +
145 | "DNS域名解析系统 | \n" +
146 | "域传送/劫持/缓存投毒/欺骗 | \n" +
147 | "
\n" +
148 | "\n" +
149 | "| 67/68 | \n" +
150 | "dhcp服务 | \n" +
151 | "劫持/欺骗 | \n" +
152 | "
\n" +
153 | "\n" +
154 | "| 110 | \n" +
155 | "pop3 | \n" +
156 | "爆破/嗅探 | \n" +
157 | "
\n" +
158 | "\n" +
159 | "| 139 | \n" +
160 | "Samba服务 | \n" +
161 | "爆破/未授权访问/远程命令执行 | \n" +
162 | "
\n" +
163 | "\n" +
164 | "| 143 | \n" +
165 | "Imap协议 | \n" +
166 | "爆破 | \n" +
167 | "
\n" +
168 | "\n" +
169 | "| 161 | \n" +
170 | "SNMP协议 | \n" +
171 | "爆破/搜集目标内网信息 | \n" +
172 | "
\n" +
173 | "\n" +
174 | "| 389 | \n" +
175 | "Ldap目录访问协议 | \n" +
176 | "注入/未授权访问/弱口令 | \n" +
177 | "
\n" +
178 | "\n" +
179 | "| 445 | \n" +
180 | "smb | \n" +
181 | "ms17-010/端口溢出 | \n" +
182 | "
\n" +
183 | "\n" +
184 | "| 512/513/514 | \n" +
185 | "Linux Rexec服务 | \n" +
186 | "爆破/Rlogin登陆 | \n" +
187 | "
\n" +
188 | "\n" +
189 | "| 873 | \n" +
190 | "Rsync服务 | \n" +
191 | "文件上传/未授权访问 | \n" +
192 | "
\n" +
193 | "\n" +
194 | "| 1080 | \n" +
195 | "socket | \n" +
196 | "爆破 | \n" +
197 | "
\n" +
198 | "\n" +
199 | "| 1352 | \n" +
200 | "Lotus domino邮件服务 | \n" +
201 | "爆破/信息泄漏 | \n" +
202 | "
\n" +
203 | "\n" +
204 | "| 1433 | \n" +
205 | "mssql | \n" +
206 | "爆破/注入/SA弱口令 | \n" +
207 | "
\n" +
208 | "\n" +
209 | "| 1521 | \n" +
210 | "oracle | \n" +
211 | "爆破/注入/TNS爆破/反弹shell | \n" +
212 | "
\n" +
213 | "\n" +
214 | "| 2049 | \n" +
215 | "Nfs服务 | \n" +
216 | "配置不当 | \n" +
217 | "
\n" +
218 | "\n" +
219 | "| 2181 | \n" +
220 | "zookeeper服务 | \n" +
221 | "未授权访问 | \n" +
222 | "
\n" +
223 | "\n" +
224 | "| 2375 | \n" +
225 | "docker remote api | \n" +
226 | "未授权访问 | \n" +
227 | "
\n" +
228 | "\n" +
229 | "| 3306 | \n" +
230 | "mysql | \n" +
231 | "爆破/注入 | \n" +
232 | "
\n" +
233 | "\n" +
234 | "| 3389 | \n" +
235 | "Rdp远程桌面链接 | \n" +
236 | "爆破/shift后门 | \n" +
237 | "
\n" +
238 | "\n" +
239 | "| 4848 | \n" +
240 | "GlassFish控制台 | \n" +
241 | "爆破/认证绕过 | \n" +
242 | "
\n" +
243 | "\n" +
244 | "| 5000 | \n" +
245 | "sybase/DB2数据库 | \n" +
246 | "爆破/注入/提权 | \n" +
247 | "
\n" +
248 | "\n" +
249 | "| 5432 | \n" +
250 | "postgresql | \n" +
251 | "爆破/注入/缓冲区溢出 | \n" +
252 | "
\n" +
253 | "\n" +
254 | "| 5632 | \n" +
255 | "pcanywhere服务 | \n" +
256 | "抓密码/代码执行 | \n" +
257 | "
\n" +
258 | "\n" +
259 | "| 5900 | \n" +
260 | "vnc | \n" +
261 | "爆破/认证绕过 | \n" +
262 | "
\n" +
263 | "\n" +
264 | "| 6379 | \n" +
265 | "Redis数据库 | \n" +
266 | "未授权访问/爆破 | \n" +
267 | "
\n" +
268 | "\n" +
269 | "| 7001/7002 | \n" +
270 | "weblogic | \n" +
271 | "java反序列化/控制台弱口令 | \n" +
272 | "
\n" +
273 | "\n" +
274 | "| 80/443 | \n" +
275 | "http/https | \n" +
276 | "web应用漏洞/心脏滴血 | \n" +
277 | "
\n" +
278 | "\n" +
279 | "| 8069 | \n" +
280 | "zabbix服务 | \n" +
281 | "远程命令执行/注入 | \n" +
282 | "
\n" +
283 | "\n" +
284 | "| 8161 | \n" +
285 | "activemq | \n" +
286 | "弱口令/写文件 | \n" +
287 | "
\n" +
288 | "\n" +
289 | "| 8080/8089 | \n" +
290 | "Jboss/Tomcat/Resin | \n" +
291 | "破/PUT文件上传/反序列化 | \n" +
292 | "
\n" +
293 | "\n" +
294 | "| 8083/8086 | \n" +
295 | "influxDB | \n" +
296 | "未授权访问 | \n" +
297 | "
\n" +
298 | "\n" +
299 | "| 9000 | \n" +
300 | "fastcgi | \n" +
301 | "远程命令执行 | \n" +
302 | "
\n" +
303 | "\n" +
304 | "| 9090 | \n" +
305 | "Websphere控制台 | \n" +
306 | "爆破/java反序列化/弱口令 | \n" +
307 | "
\n" +
308 | "\n" +
309 | "| 9200/9300 | \n" +
310 | "elasticsearch | \n" +
311 | "远程代码执行 | \n" +
312 | "
\n" +
313 | "\n" +
314 | "| 11211 | \n" +
315 | "memcached | \n" +
316 | "未授权访问 | \n" +
317 | "
\n" +
318 | "\n" +
319 | "| 27017/27018 | \n" +
320 | "mongodb | \n" +
321 | "未授权访问/爆破 | \n" +
322 | "
\n" +
323 | "\n" +
324 | "
\n" +
325 | "\n" +
326 | "
\n" +
327 | " ";
328 |
329 | @Override
330 | public void start(Stage primaryStage) {
331 | primaryStage.setTitle("PortFast");
332 | primaryStage.setWidth(670);
333 | primaryStage.setHeight(800);
334 | primaryStage.setResizable(false);
335 | primaryStage.getIcons().add(new Image(PortFast.class.getResourceAsStream("/img/icon/book-2-line.png")));
336 | VBox root = new VBox();
337 | Scene scene = new Scene(new Group());
338 | final WebView browser = new WebView();
339 | final WebEngine webEngine = browser.getEngine();
340 |
341 | browser.setPrefHeight(800);
342 |
343 | webEngine.loadContent(a);
344 |
345 | root.getChildren().addAll(browser);
346 | scene.setRoot(root);
347 |
348 | primaryStage.setScene(scene);
349 | primaryStage.show();
350 | }
351 | }
352 |
--------------------------------------------------------------------------------