From cc80ffc7552384dc30ce848b16de7b5cdd29470a Mon Sep 17 00:00:00 2001 From: chinashiyu Date: Thu, 27 Oct 2022 22:56:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9=E9=87=8F=E5=AD=90?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E6=9C=BA=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/press/gfw/Client.class | Bin 4660 -> 4803 bytes bin/press/gfw/ClientThread.class | Bin 2923 -> 3633 bytes bin/press/gfw/Config.class | Bin 5730 -> 5825 bytes bin/press/gfw/DecryptForwardThread.class | Bin 2732 -> 2836 bytes bin/press/gfw/Encrypt.class | Bin 14610 -> 14605 bytes bin/press/gfw/EncryptForwardThread.class | Bin 2448 -> 2506 bytes bin/press/gfw/PointThread.class | Bin 342 -> 465 bytes bin/press/gfw/Server.class | Bin 7123 -> 7261 bytes bin/press/gfw/ServerThread.class | Bin 2927 -> 3637 bytes bin/press/gfw/Windows$ButtonListener.class | Bin 2643 -> 2643 bytes bin/press/gfw/Windows$TrayListener.class | Bin 823 -> 823 bytes bin/press/gfw/Windows$WindowsListener.class | Bin 1310 -> 1310 bytes bin/press/gfw/Windows.class | Bin 8580 -> 8580 bytes src/press/gfw/Client.java | 18 +- src/press/gfw/ClientThread.java | 122 +++++++---- src/press/gfw/Config.java | 28 +-- src/press/gfw/DecryptForwardThread.java | 120 ++++++----- src/press/gfw/Encrypt.java | 226 ++++++++------------ src/press/gfw/EncryptForwardThread.java | 86 ++++---- src/press/gfw/PointThread.java | 14 +- src/press/gfw/Server.java | 29 ++- src/press/gfw/ServerThread.java | 123 +++++++---- src/press/gfw/Windows.java | 100 ++++----- 23 files changed, 478 insertions(+), 388 deletions(-) diff --git a/bin/press/gfw/Client.class b/bin/press/gfw/Client.class index 0c7c84b7f17a5da9514c4480e9f956dbfe135c8b..0e6a23d60380b74619c80209901e303cadbcb985 100644 GIT binary patch delta 1195 zcmaKreN5F=7{@;k;C=H4)D0bx;(&nb#WZ`v*DM3nCb&Rpl9qS)6R8_)a7EkN?jPk^ z<`nnqMaiu<7G$O(+zUa9MrvV1_9j+lSqO&x(Ry)NiykhUxw-krIp=$xJ>Td1J?A;6 z<>sz*SNFf|2Z1}d(B!&c3+`gKowtRFkNRqS8>Us5foVl%RgGCyR9X6%8OZaM1}dwb zFnEVOf~(97-+&B#WQ*FHA%Bw>|&om6Z-{sX_e^s1GuT->_}b>nG7dhsCOKv}PZ}&` znVnPCD#uNZKE5$X;9Kh{M~bFsA!Hn6WP1tGG%K7Es1+z-1Cg#MaEO7Zg!Hwt7K4b zh2oxc?$Pt?Q)m0FS@E|!JFux9Qf}46=LXw&%iBUyn7tvq4b08Y3e&s;dvqINZ%l{` zZwDKfyW3lN)*I%%Fq_?-I*oD;yFXAI=7kWRCM6ynA=go_%SR73urt4b?UJv#O8rdPukgCAje1wj_@zinWToz-nX8|23u!tZ(0+GnpAR#W zE@p8|dw85edMKusm7KuGm#pEW=AU9Kr?EJrm4DRQ{k*{tZ}N*O{Hhwi(ZU}b;bKrj zfAKqibCF@0BqFI|muzv#Y=&gM#Hkgxnn{p{B~eOcf~=KfePHOYjWm*Z`qUst()per z^p_Q@y|XGBrBW6@sdSWzRYYRZlCAAO$ABK}US%!B7C&|DFiF<=>pf|Mh#mhw+^6#; Syq8F{l_*q(@Uvz|G4vm;1ZQXf delta 1040 zcmaKrU2IfU6otP{+v%O*b_zow*rE|CZJ8DbL9{485;_72t&jpuMQIAXHYH;p=!ktF z%!`<)1WS%Y3nYM$3@A`5of&9rtAdDyKt({sAFx{6C;>u*@L<3_Ljooy=H{HU*12cz zwa(r99v$EIn5XAXdlxX3-&#FaTw#X~Y_j-JNG(_}VVQ?L9I!daD#7J6)-{A0JT&l; zO>6RuZiOrk>C1uk?t#5;c@UyDF{TLVwN9w4`en!Bu#nl`)YAXv-rwJi4Q$)o-?ZPu z2HI^l(IJdcrG=}j*H%vsnlvj*J~7$W`03p?pYo7k*Em5Zw=C4hc9f7^QCFD#*X?*B?r5k26t_|FKKbov{=RNGd4?Dn$Fkex|L(~ z@=fBx=gbIqiK~|jHs6{T-J9i?L)YAe5_pzpQ4rb&_ zeG>htXl)V|c=Khwq8ajflE1HfQxaYBE*@z}V+*5bRyW%i%MS9`Z33C=+z0eNEj&T1 z>B*ex?!={f$ZF#n76^CXRQlVTdvy7%BEt642=7U$p4HG}O4gJm@Ns6}+p5_b zX4-%ApZHh)p8NUzS)7VNmFk9goHLT(4Wl|?ExM#m#M#>F{XHZjI|#d*zlYt8)O zMd5Om5!7$Clij-R(^hUHC`)9ytWch!wL}{;SLb#n(aGalv+q_v}cr+NFLwuz5a0(YVRUHFhr${ v8u&?3l=|deiWF=4f98^2Y>r0F$CWv0=v{J5qpv_Nn_a$~^gi7m!ms}TQ-v>s diff --git a/bin/press/gfw/ClientThread.class b/bin/press/gfw/ClientThread.class index f8b192c07a1edbfcf06df4b2b04bd4e8b750233a..a53bfbbccbfb7d6894d50d4809cdf5b29b3e9962 100644 GIT binary patch literal 3633 zcmZuz>vt688UM{@!z9aqA%Td{5MpZCY!bFuD%PdQB}5i-p-oI1EXB!Y5*9W)>+CEf zz1da^)`}LZwOFgw7QstZB|~;XvEO!xp(Qoc9JOXNtX8m&ZgaM8t#qWq>*I&J#Ix% zgWC+O!Wz0H+A&fO4WBVkizNcBGoYhRp!Ejo5fSKi1505D^jQPTJm_-kpi!VM15Mu9MguF+sNt5rbk-UuOpRI2usN2oBxrWZ%#4^$TE6|muzNV2mmpQc z9!v>(a>=25#V$|gESmSQJ*bnIfDC|SX4 zpXa{N4!mVOTO@vp^#TzJ{+e zRbAVwAq^{|9XDrK1PAa99Sf4tL3~rPw=kAh2jaeDauFu=RQf>!CdR0WEoD)y zoc%1|a^>h4*KljVF2#0dA)OhwoH|S}iVsAP!eKEZeS_=#Rv=lD!chYmFzQRpT+Ygp zYj@DgWz?I@^+hG>z@UW=u8-g$Fci)L>%AC>6pAX~xQ=6i*az$}FfCf@IWaNAJPdX& zKhn%>mx1CY-KCa&l0U6Wa`IsVUyxvF=%L%3LN*(j zcZ`oqQ;*;YJSDODX|<9Tv?~eD(|AV5&)6d>d^{cop2g4Ut(2Y3vIf|uZt8%(m_*X! z^9uuK@Vx5N)I;)J@^nzcKJzoYkJT9{ot?6LT2=rIZh-DL=SwrfLz)=>kWii7^ zV)!IG6CttXwVk2rU77f5W^6eQjWDME#)}$=6F1*zPNEgu6JQq4OHT7dkIvhX&f)FZR~bZOiFc&)#O`)G69) z6DsiTINxI54%ppLvAY5HF%+KNbaL$;oor|-dxJ0cyW}Hsx6EVT=p6b>7%Jlanuew# zM*H8zp?Rc68?6#1yNWo{nB~%0M2=e#`6Aq^`Cb?vWwxGRK0Kz>S?{r~sI!IY%uw)3 zwBuVU{%use9D@mBOAK0LqqDdp{GjA6f!bH-kl0Fmr-bh@+rKX&Jx{Dr1$K%_^At3EaEXKnpw2Z} z;mH+C=ZZKj7YcfgP+J9R4;S%EIq`S-e#!rSNz$mTh*zWpJ@8d2M1t+=w9^N9+IF`#H~+0ATgzc|6{jPmLusujYY{|~m(YNY@G literal 2923 zcmZ`*TXz#x6#gbjJ8c+lrL8TNT0kX9TO$`OHVRgxlG+PWtQM%6rb7v&nK+pgs^Se4 z1i|~IDk!*I_~ya|salnH{|796@*k+*K9e+4S|4)Go^$ru``h>Y@y{>61K5mjb@(*Y zXKgc=i;f>W8r_jjnHgvAA=^xh=?G}3E8p$5Ql%>m!JKJNn)WU$=V++uJ)D?KMAM1P zcy!RQQ^ycbfWGNISf~8i6wZ@vX3V0F)E~reHtnsPGwTgHVxZD3tlh882>*g;UNuy9oCo` zgdepAR-lgXL*b!nXt={b1uBJVG@zqOs5=c*BPi4w1502Cb(evqF16OcGA!4yyf>9G z`|}f{roA^Ynl{C8Rx*(uO4up+E*=J)L#doNs_c4iSm*|S+M>aAMH`jd2SyK@NhcN_ z(h;Uy6_4DD>FD0ngqd>^6WJhI(XOLS!wOHZrgDxsVcF{LUwk7&}(w9o71q6-m z2_l4z;)G4~N~kA1BnMjzJb(u^R5_L#aSgSh@IoI4u@#*<9-6OK<%oe89@bEu%a7*N z0W&cak1rymn%K7)*p5eu$jUQ0>Re4JE4rKM<`9CJn270kjPdc9r^G&%Po>99y9$pp zN%jZPg>JFtiQ7C_Ok6Rq3vmNIc#;W~$Y#yVn1*(*vrDWC%q^;lRiRIVZ=@xN0c_E+ zd!F@fs6@+_AO`WYj=dUIDb(}rF)$=3^{kkf&Jevdzt)ODXILD@jGM)h4B`Nu(=oz) zQ!>j1WZ-#8K;H4ZYVf@B-Y`nikN&)I@z(k8Zhdv` z=9x=3r@y~>>X*Mhp8osSFRJh|J>DsCIxgAps)i<7u)y?E%!91?*A3i@4MM$XU?1vq zoYc@Oq|dMPHt_r80oF1}{2aoS@X0(O<&$ZmcFq#DbCRf? zb42Z&BHROfxdJP>*6^#K-UC}BGguYTuA@HUzm5i>R?E^POS7D{L|WyuO<2|lOJjgM zSC!;-TsJ8#n<;+-r&*XYs}-xzjs`@r1{<-C9e)El(1wTj6(jWs*7MyK;-`MxjeEEY zCAc+3iDf=TiEU!XD!qle`~Suv`zVFTxrn|58-+=#&wcWeM>lOQ^ITh*L!VruAxlTEEsAh|J=^FoD(c z*D!-Ii7^q^j2Cc7@Ro??KmlnvDD4Ggiv~G;@`B&}?(TF3uAsfMf}-i}V{|vq>&4?Q zaUtDMz$^6l3|@;A@W#~$)2C$?Cx#=fjR9V-p21t46^#`IoSwzm;YfR%dw8z1vazy& z^H*t7HAm1W-Yfd)Iov^`GW27X8DP^$ha6LA!YjYz|w&5hY@fP}ViX-tf zWt_nn-sRVM_NDhpeS#1087|{^Y>N)J)q=gjQOxD(TqSwXH!%KeI~M5_tDe@Rs6&~#kT@wL0k*Lz{g KzeFA%F8>F(OvZ2k diff --git a/bin/press/gfw/Config.class b/bin/press/gfw/Config.class index 645f18a406b7b0312b3459103ac62f8e5b507457..cbf072ad8642cb1ec7be7a989b1b5b3abb445515 100644 GIT binary patch delta 1357 zcmZuwZERCj7=BLM+jD!V+Rw%7N*pYhebp@>7_U)8GUk@?nxq<)KyVIC-{|!O7NHAk3Y;}eeXI1qsh%V=Y5~|eeZML z=RM~t#{BZcUn6M%Hyx1+dBPG7wFMb0&5>}7ql}}6!S!&{=BCQnqv6Umq1Iq5-qhNz zz=z#-yn?L^&gMr9V8(!f z&@vagSR$9sP1!Mu_ZY0fj!-NfV=$ML-m5^vaXZ#yE6134PWH(eoG{3JAd+%HO9tb1 z)ZrrrUeb7HZEb0-j8Ev!7Y?V+cXj@f(tqt7`E6(S@1s2mvUr5!QwH~RLqd_t+LhHE z&B69~DAJ}NgOhfAjsga$IUI=vjr)CR{OFV@v-#LpqQ+Kaois{(BU)`$CRQtYZ9lUU zBB5+%Cx`w}vS!6(h6Ed_aav@ru1{11G@f2$H7}9|5mLEVny*<@i;h*Ur*u57$*Me# z6{?(;`cb3GX8Pt6*x2Ce)bVsT7N``FwzSM_c}&Mzhdco5AUu8};WGIAx@{8kN?vP! zuFJ1uN1u4+n(D*`^dXErMyGL*)EdQZjN<@Gh~@3D8eCD03fkx45O$J>VIk$bgff^= zk52e;BZ;*E_o0hW3sqZ%mkE_oNm+J^&qq~JRFpg&P@GdxIaW`>li=9Jawvez!N^4> z$CF@m-UZ~S$F?g0ikOCGP{;qLnR0N#a%CQHhf&sqjktjbxroLSMAeL2fSXh34je=8 zF#2@#n;mW)uPr}{!W8xeTnC2nW`&NoTt{dr*D*w!j<7fH=p<~lu-^EFFS-;1#Z>u7{q5F!P#WVfK5 zt{KG^JVtf`+eoV{cA%FOo)j0H{R_`v7O^*BKLpOwJ{vFKTYN`tDZ;b(9zRfvim@F( z5-QO&IOrvv6=_#_BEzQWCHx8NT^!jQHGofdTO-+i;>ggJHRQ~awDey8jTykX96f`) zvUiF^QA uVe_=IGh&Np$#ulk4JprNde+Wg;wesfs#JrmX=ZM;JPs_QkfB0v4f`7imP~E{ delta 1307 zcmZWodu&rx82_F2-k#e_g|%xJFBBaNb=_KrF3eb?poGmW0|rB2PNQ?HSm_?N1pzfR z1~UxN1P_9HFxY@i@Uf1`Ev|D=MW(ERPbR(+QHlQJ<4>3A{O$(9M{@7^&iDPk$M1aK zIVs--uX6gYfgu2eeab8zV?hR1${^J?h9Vq!9BmAaM{73L6hs~i6|4%@2O`m$`X&`_ z?6IK(n;Go28^Ym0L(~A521B7>L`5t1+2BGaWy&q{tTqh$Z8(5?7?fyZWi%XYSf^qI zx^3veD-71ihKC~2u;}F1u*2d6cRODrBGoDmVWF|~+7L&d_>JG@>Sr+BpRK}-{RTqI zTqMLI#WQ!%hPN@qUM2!lnvVQaZ}Q@<<{y&!kIe%=?`-*XuvJAG>p4DT$eip)u(6bx%LW*rrdXLUU3mo@nmmTB^k z+=&uRHq&Q-)s>EB9nZC(P$Q2asqT`P!gQ?8P`Y60fzxLMTmhe7vsGd)$vf0J(dN^! zqXXR61Bu0ngCq{lxHYzthW#M+p&eb=i*6c6I|gtVx#V%j6jv;Pm$d81V<%Y{7T`s^ zgglr~jwj&5jWo37SdU%U4T-W<;AKK(6i}3n{HMI;lUJB5xlrxn&^T6%!x`gfVSi!< z$J1;a<)n=v!!!o_BC=3{b-11qI4JBXN^K^2OA@VB$Iza@UL9TLj7%K|mma~aBo0+M zUQOV2uZ}kyM`+2{@g@l!M|J3Z6l%f^v`(K)a}-V_P$ax|ZQ3!sMMa#*!GNf+=M*Me za1{j~-&S>dD`XaT4=T%;UoscTNu;Xs6L{B8gPWsCK9}rv$#ptTiEjI~o(~cTXciqK znxx|l&DyW9xSwCqG=6+i5x>~87JnS~Tk;&AU5YtJGqDhZRaiq8vJOFnNaoP4i8zPx zIJS@;!&Wqt+<`Wl)2JwMbS^lLX~f<{Z$?o6O_+@r@Fl*YQ)Xj3zQ#AyxEyT5w}i?x z(+qkSyT$Cx{8)-wp2fysxtk+BK@H#>jKfd=cN{4aX+ux52`XUuH)a4ACSZl~A3K>Z z2bumCgc2hiFXI>m6T_J+*@&3w^vy|QAr_;U>RnB{GCFZN-J(j;*Wx}rfV6nTS|4Wg32FFpf$Jh%$+4!pvm~^OTuSgayoGp}acz?v*~RwM-YreQJfy z#$>DjIe0QwF5{A2c8h-r6In_P%ah;jS)D_|`oR>KdedOyCg#m6dF<3@)%Ysz5vokH zw#JvjiCHN=1$}uX7m@Wrxykyz3qESsZN#JH7Hwn9$ zQrajNzJd-(zKa;UCFGt?X}yodI%*XM1U*6v$5eitc2251sSEoQJwrF==;4CA%bZv4 z3fH(nird`euGWX#VTgX-%6rcMpLxI+9*OExe(;P@hKz?-#>;DC@y0lem;jycOuow9 zF}D+N2laQ%9y39N4r+P;WybFRm`jYzKO7BC@r)mHI delta 736 zcmY+CTS!!K5XOK1-96{*YKoUO+H5V$F6yp9)~9Lc;X!!RN^(2wt}gQ4$V9Kn4STAaBevgGWp~6Gq&!>S@A&82erI=zw(L2{482gO z)f{p3um{rb6O-P?SV_Q>qFp&9DLMwzfm-XIT7kh7Cx+CnkFUBqakE$r-`DV9hnnB1 zf$qYlMT~tK%mEGbAd5JpfgNEb?X2P`b#$#u;RSJA4%Si6Or5kV*DR-ebP;jPE?>2QT=^OQv~c zEM8|fx&6;B{%+D`JUX$Pn89OQ($cMNZ0)s2$Gb(H;*>Ct`k9bGTdQo5$TRY6>F$zm z<4D3B&WY!hZ1m~mr5hle_R%RQEG~VQxqE$ux(#Oo|C31%bWWjQE8n<D&QDfGY!}6jv-JB0-j@6DD zP$O%u+cf8_WldeBGtVq8;$lvFAXe%WHLc8<&BrCuQX|2A+RpjszVCD1uk*Xl{k?uq zEqG#qzrDA)6+rf@{_^;Q2hktDKpY;%AcT>OWw;TKARG1G-1y_6r*(A=;;|0H@f>c( z^B9X4kdHs25SuU_TW}lxjEQ&^6^Nh`J0jtPurK@;67i0(zat&*V>I^S792np4k8za zaVw5s96nV3iL!sM>@mU98in283C!Q%{JC9|-aIatR$Jj+77z#?pB zF}AP-5tgEfWq5;=(Ta=Mi7)YP7?-g}zySdt2>4jQrvgq3I47V}z?TBLSwgUseON|6 zCo=|LF^C=x#5E3KCX+daX$&!gSvtyLHuLl@kj;$a-{iD$ApgO^JS68s zImhLECg+@-PB~x5xgw{B#bzuqKTE?FWSI@%WV?QcR+K1FGSNo{i zMzz0DyNZ>?wpQ_TieFT`N%2dZVp|k$SNOWZ7KOVMzN4^R;a-Iu`q3lmK2dj4-6?fv zIn9BU&UklZ@(pjevIpSjY(#S|;y4dOS%VQ=j7%;;h_%S&L&)b+6tE5@Y`{c5h6*;K zk}EKsD{(KM!W^!`60VL+OPlY)8YS$0mH6%_w9GzQdiE z!d$qsnz!ZW;t^}K=&?AC-{)r9t9oB6QA{Ajjl{MBOd zmi0rs4Z!<02>ZeouPHr*gFLDU{YVqqg?|g_5^`Bc53kbL%Rc5~v>t7Li{|wf%OTc} z$$G-WZIGU3Ja6PN-oz6cjg!phn=IgIjm24w)_LB>E|&8Wr)o^5vzs$y-Y2tKW_Y&H zp9`%KS}Qaxbh*%ap^x!%O>8Gu2>7jl)dJQDcwWFp0e=#(ReeN#lloTmyVbv~{$2I& z*%0nk+oAS|+GA=@sy(CjyxNQAPva%UUt6rv`dO3>uz(HHS-kbPVU})5HqwSisx#(T zU=jKtplz$io0<9pFMrfV?^x=Ha4nJm%Yxr>5N)?2&I&Np#$$vPA=8QxvJ&K4De`R+ z3akPpHWd@?PE^?UQE7K!x>aGZJ%C1=jWzaDthIS~*%sh+tHEwtj1F6ZqgIOx_A7MR zQvAo3_33knMp#}!M#?bwVL($hIBH&UH z=hBhjMq-G|K#I#my1Us6j%`RNgx`%vv@1cpE7dp3aD%%YX|CLRW$eSj85rQI@GUnB zgI%?kn>8yiA3nDbv2KyKA?t^MM|4(?DEDhGD*K+m8uW8(Rjl{sWY-0@;(E6Y`EI*+ zC3|h+Yg$DUu5-=Ea4pDjttfCi@jbT-?dVYfSuHg^L1-ANpF|3arb%@lXmtI2yJ+I_Bdb!sJDUQB*t glIzy#RV}&~aXui!=R=+^3gdi!6!~JkNPg9S0sDTq(EtDd delta 1954 zcmXZce^giX9mnz4>;1XV7X(2?1mu?lhQJ7rkSQ9na_9gF<+#k0e#n|OD{ZZz^Gghg z!%UmkoLaigb@Ip3HL1oS4l_M7^0aEsIkcu8#~d@}Va8lz$oA^2??2zqz2EzM+|T{q z&-pyJcH7#(snO1E0MmaNsEmtmKomA$92yaeCZwPlnP@>FTKzR~m-1iI*}aIvKBVCl zdfIkWNvw(g9p9mNf@J|85tR`5)5H4nb zOF4!fBQ=`Ha3-*bDV)i4mT(&9@OGB6kY${~a-FH*Tvl^;s9&sp2_twfqZwSm z@m$Fmew(peFQ`$_CS`4co)`3jpq+yDDBmY&zo5f{j*59hPzU4K$wa;_r-!Nh9n*ML z&PQ@C$@z<%Pvi{B`Bctla&EH9jMWxkP0%8_*rK`ACNSM5GSd=q%~F_SQX zWci$FMJ%ydoMUrYYV%lT^I2|HtguDGzAkJzYwRIe^|HRn0$a^O`hdr#Xna3vf}-U4{@0tR(Mq5uM~DEJg)E^g{KsLpzw@tdQRO%b$#mo zs_rV6JFw0fA8ucm`j(sj6asu2;nbStMoeZCrm`8?Y(YL-QN%VBa|>p18}8EJ6J($5$n927roA0BP zr*RL@;6e5(KaVH)F`nclH1IMuu@75#1-^OMX#wo9aO|@P9I&xCY|(hlV)2G0pi?j5 z*OrXmSSn6g8h&e;_%LW$TBZH?0|&H1uc2Sa--TQk@-HDbZ7fZ1GQ?sTZV8OCM8;S$ z6D*Y}mc}&8WQJuiQ%fO>L(Jz57Hg@@;xK1(gkRyP{#=ihpDzmw=MszH{W2evxl(3u zmC(n8J}I<8Xi#XA&`m;H4Q$hz+AQFQ0(J;^QNT|HydvPBfFtVL)pw}xR)0eMN%ill ze^1No1GQ(=o>O~4ZJ*k|sU1-J4@*er4aNVlWTT~8sHIt$Wm<$~S(N2khUM99R@lCB z+G>kwKnTJBTJ}jqH@Gz8m3it9H8vBm?$U zMB02rStVj^AyRD-vaJ?*wgg3XFJ{?&m~C|^wTH35>aoxsL9MOAQhOB3Y#r9y25hyB zc*z>E*P8WeThJA>R`ggK&e>*Mv@IC2ZF+Uv@o(FK5!;FX+HRz40*_$ug1{OG)%sm{T3AqaJ2FwR9{vWr5J zn}7^A5p&%nl(~4!bCdniycTBpoAT?EX5toCf-qO6>+eFmn}-Bfjwx<|nhHNq&=S8K z0au4`SC2UNh^|Gy>l z)X~p1pI`VaTo(2=#<~+K-tp@To5Ri{#(j)pcftR(a97f0&7uzz+!ai7{kX$j#Vj{~ zyWBNYy218?cRa(phcuNNh;pClvSH-75k1T(>O5ejXISHTSm%Xevll>@7mgEN1bV!& zIPFE_kKT9;dNG{h#rluUcrM&afafJ5+DrCBi`$aDsXEL=gqMYJUJj;td6?l9pu{W0 LT(8(aQoQ1SH65E^ diff --git a/bin/press/gfw/EncryptForwardThread.class b/bin/press/gfw/EncryptForwardThread.class index 29ffb69d4bc31cfee61dac2fb137ac694e816749..046d79b57dd081215005b3c08197b038bb4c7942 100644 GIT binary patch delta 666 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 QB8g0skH?*2V`1Ze0eUM6qyPW_ diff --git a/bin/press/gfw/ServerThread.class b/bin/press/gfw/ServerThread.class index 322b8a4f715ec50cef3143216f0a60b9cc1f9e6c..57f3a67c8874aa99265ac131b9f5db89471624b5 100644 GIT binary patch literal 3637 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 UZmIYtyUN!kKjq&cj|+GI1wb9juK)l5 diff --git a/bin/press/gfw/Windows$ButtonListener.class b/bin/press/gfw/Windows$ButtonListener.class index 6523c02aed9abd1c571b33fd110dea1ae242d3d1..35f8ad9631bfece5b631392bfdeab332be4062fb 100644 GIT binary patch delta 17 ZcmcaCa#@7q)W2Q(7#J8#Hgb4#0RTh=23Y_A delta 17 ZcmcaCa#@7q)W2Q(7#J9gH*$D$0RTh*23P<9 diff --git a/bin/press/gfw/Windows$TrayListener.class b/bin/press/gfw/Windows$TrayListener.class index 2251b36948d887fc23fedcdc5825e97eb5dcebf1..7188db751b148fffb23b18d2ae289c4b2207fca9 100644 GIT binary patch delta 17 Zcmdnaww;aR)W2Q(7#J8#Hgf1Q0{}jv1>yhz delta 17 Zcmdnaww;aR)W2Q(7#J9gH*)AR0{}jq1>pby diff --git a/bin/press/gfw/Windows$WindowsListener.class b/bin/press/gfw/Windows$WindowsListener.class index 4c855bd1ad1c9d415bb54444618c327cbae67db6..9222f0aa3ceda5e484eab9a0fd01f853ffa1a3b8 100644 GIT binary patch delta 17 ZcmbQoHIIwq)W2Q(7#J8#Hgbru0suS81)%@{ delta 17 ZcmbQoHIIwq)W2Q(7#J9gH*$!v0suS31)u-` diff --git a/bin/press/gfw/Windows.class b/bin/press/gfw/Windows.class index 0cca6d69f0df59bafbb2ab5ba81b482c32843214..6346fecbc9cbabbc064883b503708c8b7f9d88c3 100644 GIT binary patch delta 44 zcmZp1ZgJ)~^>5cc1_lO`jT};PqPH0Y8SgSgGu~&2VSLPx%=nU_j`7WAb2(pT08`Em AW&i*H delta 44 zcmZp1ZgJ)~^>5cc1_lP>jT};PqPG|X8SgMeGu~r}VSL1p%=m(#j`7uIb2(pT08>Z~ AUH||9 diff --git a/src/press/gfw/Client.java b/src/press/gfw/Client.java index d015e43..b43d375 100644 --- a/src/press/gfw/Client.java +++ b/src/press/gfw/Client.java @@ -1,5 +1,5 @@ /** -* +* * GFW.Press * Copyright (C) 2016 chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -* +* **/ package press.gfw; @@ -26,11 +26,12 @@ import java.sql.Timestamp; import javax.crypto.SecretKey; +import javax.net.ServerSocketFactory; /** - * + * * GFW.Press客户端 - * + * * @author chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * */ @@ -164,7 +165,7 @@ public synchronized void kill() { /** * 打印信息 - * + * * @param o */ @SuppressWarnings("unused") @@ -178,9 +179,11 @@ private void log(Object o) { /** * 启动客户端 - * + * * @return */ + @Override + @SuppressWarnings("preview") public void run() { if (serverHost == null || (serverHost = serverHost.trim()).length() == 0 || serverPort == 0 || listenPort == 0 || key == null) { @@ -197,7 +200,7 @@ public void run() { try { - listenSocket = new ServerSocket(listenPort); + listenSocket = ServerSocketFactory.getDefault().createServerSocket(listenPort); } catch (IOException ex) { @@ -259,6 +262,7 @@ public void run() { ClientThread clientThread = new ClientThread(agentSocket, serverHost, serverPort, key); + // startVirtualThread(clientThread); clientThread.start(); } diff --git a/src/press/gfw/ClientThread.java b/src/press/gfw/ClientThread.java index 3fb2b08..dea363f 100644 --- a/src/press/gfw/ClientThread.java +++ b/src/press/gfw/ClientThread.java @@ -1,5 +1,5 @@ /** -* +* * GFW.Press * Copyright (C) 2016 chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * @@ -15,22 +15,25 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -* +* **/ package press.gfw; +import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.InetSocketAddress; import java.net.Socket; import java.sql.Timestamp; import javax.crypto.SecretKey; +import javax.net.SocketFactory; /** - * + * * GFW.Press客户端线程 - * + * * @author chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * */ @@ -46,7 +49,15 @@ public class ClientThread extends PointThread { private Socket serverSocket = null; - private boolean forwarding = false; + private int overN = 0; + + private InputStream agentIn = null; + + private OutputStream agentOut = null; + + private InputStream serverIn = null; + + OutputStream serverOut = null; public ClientThread(Socket agentSocket, String serverHost, int serverPort, SecretKey key) { @@ -61,68 +72,104 @@ public ClientThread(Socket agentSocket, String serverHost, int serverPort, Secre } /** - * 打印信息 - * - * @param o + * 暂停 + * + * @param m */ - private void log(Object o) { + private void _sleep(long m) { - String time = (new Timestamp(System.currentTimeMillis())).toString().substring(0, 19); + try { - System.out.println("[" + time + "] " + o.toString()); + sleep(m); + + } catch (InterruptedException ie) { + + } } - /** - * 关闭所有连接,此线程及转发子线程调用 - */ - public synchronized void over() { + private void close() { - try { + close(agentIn); - serverSocket.close(); + close(serverOut); - } catch (Exception e) { + close(serverIn); - } + close(agentOut); - try { + close(agentSocket); - agentSocket.close(); + close(serverSocket); + + } - } catch (Exception e) { + private void close(Closeable o) { + + if (o == null) { + + return; } - if (forwarding) { + try { + + o.close(); - forwarding = false; + } catch (IOException e) { } } /** - * 启动客户端与服务器之间的转发线程,并对数据进行加密及解密 + * 打印信息 + * + * @param o */ - public void run() { + private void log(Object o) { + + String time = (new Timestamp(System.currentTimeMillis())).toString().substring(0, 19); + + System.out.println("[" + time + "] " + o.toString()); + + } + + @Override + public synchronized void over() { + + overN++; + + if (overN < 2) { + + return; + + } - InputStream agentIn = null; + _sleep(OVER_TIMEOUT); - OutputStream agentOut = null; + close(); - InputStream serverIn = null; + } - OutputStream serverOut = null; + /** + * 启动客户端与服务器之间的转发线程,并对数据进行加密及解密 + */ + @Override + @SuppressWarnings("preview") + public void run() { try { // 连接服务器 - serverSocket = new Socket(serverHost, serverPort); + serverSocket = SocketFactory.getDefault().createSocket(); + serverSocket.connect(new InetSocketAddress(serverHost, serverPort), CONN_TIMEOUT); + + serverSocket.setSoTimeout(SOCK_TIMEOUT); + agentSocket.setSoTimeout(SOCK_TIMEOUT); - // 设置3分钟超时 - serverSocket.setSoTimeout(180000); - agentSocket.setSoTimeout(180000); + serverSocket.setTcpNoDelay(true); + agentSocket.setTcpNoDelay(true); // 打开 keep-alive serverSocket.setKeepAlive(true); @@ -139,19 +186,18 @@ public void run() { log("连接服务器出错:" + serverHost + ":" + serverPort); - over(); + close(); return; } - // 开始转发 - forwarding = true; - EncryptForwardThread forwardServer = new EncryptForwardThread(this, agentIn, serverOut, key); + // startVirtualThread(forwardServer); forwardServer.start(); DecryptForwardThread forwardAgent = new DecryptForwardThread(this, serverIn, agentOut, key); + // startVirtualThread(forwardAgent); forwardAgent.start(); } diff --git a/src/press/gfw/Config.java b/src/press/gfw/Config.java index 2b79074..6f349ff 100644 --- a/src/press/gfw/Config.java +++ b/src/press/gfw/Config.java @@ -1,5 +1,5 @@ /** -* +* * GFW.Press * Copyright (C) 2016 chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -* +* **/ package press.gfw; @@ -33,7 +33,7 @@ /** * GFW.Press配置文件管理 - * + * * @author chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * */ @@ -71,7 +71,7 @@ public Config() { /** * 获取客户端配置文件 - * + * * @return */ public JSONObject getClientConfig() { @@ -82,7 +82,7 @@ public JSONObject getClientConfig() { /** * 字符串转JSON对象 - * + * * @param data * @return */ @@ -114,7 +114,7 @@ public JSONObject getJSON(String data) { /** * 获取服务器配置 - * + * * @return */ public JSONObject getServerConfig() { @@ -151,11 +151,11 @@ public Hashtable getUser() { } - Hashtable users = new Hashtable(lines.length); + Hashtable users = new Hashtable<>(lines.length); - for (int i = 0; i < lines.length; i++) { + for (String line : lines) { - String[] cols = lines[i].trim().split(" "); + String[] cols = line.trim().split(" "); if (cols == null || cols.length < 2 || !(cols[0] = cols[0].trim()).matches("\\d+") || (cols[cols.length - 1] = cols[cols.length - 1].trim()).length() < 8) { @@ -173,7 +173,7 @@ public Hashtable getUser() { /** * 打印信息 - * + * * @param o */ private void log(Object o) { @@ -186,7 +186,7 @@ private void log(Object o) { /** * 读文件内容 - * + * * @param file * @return */ @@ -268,7 +268,7 @@ public String read(File file) { /** * 保存内容到文件 - * + * * @param file * @param text * @return @@ -317,7 +317,7 @@ public boolean save(File file, String text) { /** * 保存客户端配置文件 - * + * * @param json * @return */ @@ -348,7 +348,7 @@ public boolean saveClientConfig(JSONObject json) { /** * 保存服务器配置文件 - * + * * @param json * @return */ diff --git a/src/press/gfw/DecryptForwardThread.java b/src/press/gfw/DecryptForwardThread.java index 4fa5900..9fea3ad 100644 --- a/src/press/gfw/DecryptForwardThread.java +++ b/src/press/gfw/DecryptForwardThread.java @@ -1,5 +1,5 @@ /** -* +* * GFW.Press * Copyright (C) 2016 chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -* +* **/ package press.gfw; @@ -28,7 +28,7 @@ /** * GFW.Press解密及转发线程 - * + * * @author chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * */ @@ -36,26 +36,23 @@ public class DecryptForwardThread extends Thread { private static final int BUFFER_SIZE_MAX = 1024 * 768; // 缓冲区可接受的最大值,768K + private PointThread parent = null; + private InputStream inputStream = null; private OutputStream outputStream = null; - private PointThread parent = null; - private Encrypt aes = null; private SecretKey key = null; /** * 构造方法 - * - * @param parent - * 父线程 - * @param inputStream - * 输入流 - * @param outputStream - * 输出流 - * + * + * @param parent 父线程 + * @param inputStream 输入流 + * @param outputStream 输出流 + * */ public DecryptForwardThread(PointThread parent, InputStream inputStream, OutputStream outputStream, SecretKey key) { @@ -73,7 +70,7 @@ public DecryptForwardThread(PointThread parent, InputStream inputStream, OutputS /** * 打印信息 - * + * * @param o */ @SuppressWarnings("unused") @@ -88,6 +85,7 @@ private void log(Object o) { /** * 解密转发 */ + @Override public void run() { byte[] buffer = null; @@ -98,89 +96,109 @@ public void run() { byte[] decrypt_bytes = null; - try { + while (true) { - while (true) { + buffer = new byte[Encrypt.ENCRYPT_SIZE]; - buffer = new byte[Encrypt.ENCRYPT_SIZE]; + int read_num = 0; - int read_num = inputStream.read(buffer); + try { - if (read_num == -1 || read_num != Encrypt.ENCRYPT_SIZE) { + read_num = inputStream.read(buffer); - break; + } catch (IOException ex) { - } + break; - size_bytes = aes.decrypt(key, buffer); + } - if (size_bytes == null) { + if (read_num != Encrypt.ENCRYPT_SIZE) { - break; // 解密出错,退出 + break; - } + } - sizes = aes.getBlockSizes(size_bytes); + size_bytes = aes.decrypt(key, buffer); - if (sizes == null || sizes.length != 2 || sizes[0] > BUFFER_SIZE_MAX) { + if (size_bytes == null) { - break; + break; // 解密出错,退出 - } + } - int size_count = sizes[0] + sizes[1]; + sizes = aes.getBlockSizes(size_bytes); - buffer = new byte[size_count]; + if (sizes == null || sizes.length != 2 || sizes[0] > BUFFER_SIZE_MAX) { - int read_count = 0; + break; - while (read_count < size_count) { + } - read_num = inputStream.read(buffer, read_count, size_count - read_count); + int size_count = sizes[0] + sizes[1]; + + buffer = new byte[size_count]; + + int read_count = 0; - if (read_num == -1) { + while (read_count < size_count) { - break; + try { - } + read_num = inputStream.read(buffer, read_count, size_count - read_count); + + } catch (IOException ex) { - read_count += read_num; + break; } - if (read_count != size_count) { + if (read_num == -1) { break; } - if (sizes[1] > 0) { // 如果存在噪音数据 + read_count += read_num; + + } - byte[] _buffer = new byte[sizes[0]]; + if (read_count != size_count) { - System.arraycopy(buffer, 0, _buffer, 0, _buffer.length); + break; - decrypt_bytes = aes.decrypt(key, _buffer); + } - } else { + if (sizes[1] > 0) { // 如果存在噪音数据 - decrypt_bytes = aes.decrypt(key, buffer); + byte[] _buffer = new byte[sizes[0]]; - } + System.arraycopy(buffer, 0, _buffer, 0, _buffer.length); - if (decrypt_bytes == null) { + decrypt_bytes = aes.decrypt(key, _buffer); - break; + } else { - } + decrypt_bytes = aes.decrypt(key, buffer); + + } + + if (decrypt_bytes == null) { + + break; + + } + + try { outputStream.write(decrypt_bytes); outputStream.flush(); - } + } catch (IOException ex) { - } catch (IOException ex) { + break; + + } } diff --git a/src/press/gfw/Encrypt.java b/src/press/gfw/Encrypt.java index 13dfa2b..f077aed 100644 --- a/src/press/gfw/Encrypt.java +++ b/src/press/gfw/Encrypt.java @@ -1,5 +1,5 @@ /** -* +* * GFW.Press * Copyright (C) 2016 chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -* +* **/ package press.gfw; @@ -49,7 +49,7 @@ /** * GFW.Press加密及解密管理 - * + * * @author chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * */ @@ -107,15 +107,12 @@ public Encrypt() { /** * 解密 - * - * @param key - * SecretKey - * @param encrypt_bytes - * 头部包含16字节IV的加密数据 - * - * @return - * 解密数据 - * + * + * @param key SecretKey + * @param encrypt_bytes 头部包含16字节IV的加密数据 + * + * @return 解密数据 + * */ public byte[] decrypt(SecretKey key, byte[] encrypt_bytes) { @@ -139,17 +136,13 @@ public byte[] decrypt(SecretKey key, byte[] encrypt_bytes) { /** * 解密 - * - * @param key - * SecretKey - * @param cipher_data - * 加密数据 - * @param IV - * IV - * - * @return - * 解密数据 - * + * + * @param key SecretKey + * @param cipher_data 加密数据 + * @param IV IV + * + * @return 解密数据 + * */ public byte[] decrypt(SecretKey key, byte[] cipher_data, byte[] IV) { @@ -193,15 +186,11 @@ public byte[] decrypt(SecretKey key, byte[] cipher_data, byte[] IV) { /** * 解密文件 - * - * @param key - * SecretKey - * @param src - * 加密的文件 - * @param dest - * 解密后的文件 - * @return - * 解密是否成功 + * + * @param key SecretKey + * @param src 加密的文件 + * @param dest 解密后的文件 + * @return 解密是否成功 */ public boolean decryptFile(SecretKey key, File src, File dest) { @@ -359,15 +348,12 @@ public boolean decryptFile(SecretKey key, File src, File dest) { /** * 加密 - * - * @param key - * SecretKey - * @param data - * 数据 - * - * @return - * 加密数据 - * + * + * @param key SecretKey + * @param data 数据 + * + * @return 加密数据 + * */ public byte[] encrypt(SecretKey key, byte[] data) { @@ -423,17 +409,13 @@ public byte[] encrypt(SecretKey key, byte[] data) { /** * 加密文件 - * - * @param key - * SecretKey - * @param src - * 原文件 - * @param dest - * 加密文件 - * - * @return - * 加密是否成功 - * + * + * @param key SecretKey + * @param src 原文件 + * @param dest 加密文件 + * + * @return 加密是否成功 + * */ public boolean encryptFile(SecretKey key, File src, File dest) { @@ -567,20 +549,18 @@ public boolean encryptFile(SecretKey key, File src, File dest) { /** * 加密网络数据 - * - * @param key - * SecretKey - * - * @param bytes - * 原始数据 - * - * @return - * [加密数据+噪音数据]长度值的加密数据 + [加密数据 + 噪音数据] - * + * + * @param key SecretKey + * + * @param bytes 原始数据 + * + * @return [加密数据+噪音数据]长度值的加密数据 + [加密数据 + 噪音数据] + * */ public byte[] encryptNet(SecretKey key, byte[] bytes) { - if (key == null || bytes == null || bytes.length == 0) { + // if (key == null || bytes == null || bytes.length == 0) { + if (key == null || bytes == null) { return null; @@ -669,13 +649,11 @@ public byte[] encryptNet(SecretKey key, byte[] bytes) { /** * 还原块长度值 - * - * @param bytes - * 块长度字节数组 - * - * @return - * 块长度值 - * + * + * @param bytes 块长度字节数组 + * + * @return 块长度值 + * */ public int getBlockSize(byte[] bytes) { @@ -709,11 +687,9 @@ public int getBlockSize(byte[] bytes) { /** * 生成块长度值的字节数组 - * - * @param size - * 块长度 - * @return - * 块长度值字节数组 + * + * @param size 块长度 + * @return 块长度值字节数组 */ public byte[] getBlockSizeBytes(int size) { @@ -733,15 +709,12 @@ public byte[] getBlockSizeBytes(int size) { /** * 块长度值转换为字节数组 - * - * @param size - * 加密后的数据块总长度值 - * - * @param noise_size - * 加密前的噪音数据块长度值 - * - * @return - * 块长度值字节数组 + * + * @param size 加密后的数据块总长度值 + * + * @param noise_size 加密前的噪音数据块长度值 + * + * @return 块长度值字节数组 */ public byte[] getBlockSizeBytes(int data_size, int noise_size) { @@ -761,9 +734,8 @@ public byte[] getBlockSizeBytes(int data_size, int noise_size) { /** * 从字节数组还原块长度值 - * - * @param bytes - * 长度值字节数组,格式 %08d,%05d + * + * @param bytes 长度值字节数组,格式 %08d,%05d * @return int[2] */ public int[] getBlockSizes(byte[] bytes) { @@ -800,10 +772,9 @@ public int[] getBlockSizes(byte[] bytes) { /** * 生成256位SecretKey - * - * @return - * 256位SecretKey - * + * + * @return 256位SecretKey + * */ public SecretKey getKey() { @@ -813,13 +784,11 @@ public SecretKey getKey() { /** * 生成指定加密位数的AES SecretKey - * - * @param bits - * 加密位数 - * - * @return - * SecretKey - * + * + * @param bits 加密位数 + * + * @return SecretKey + * */ public SecretKey getKey(int bits) { @@ -849,13 +818,11 @@ public SecretKey getKey(int bits) { /** * 使用密码生成SecretKey - * - * @param password - * 密码,必须符合isPassword()要求的标准 - * - * @return - * SecretKey - * + * + * @param password 密码,必须符合isPassword()要求的标准 + * + * @return SecretKey + * */ public SecretKey getPasswordKey(String password) { @@ -883,13 +850,11 @@ public SecretKey getPasswordKey(String password) { /** * 使用SecretKey字符串还原SecretKey - * - * @param stringKey - * SecretKey字符串 - * - * @return - * SecretKey - * + * + * @param stringKey SecretKey字符串 + * + * @return SecretKey + * */ public SecretKey getSecretKey(String stringKey) { @@ -907,9 +872,8 @@ public SecretKey getSecretKey(String stringKey) { /** * 生成指定长度的SecureRandom - * - * @param size - * 指定长度 + * + * @param size 指定长度 * @return */ public byte[] getSecureRandom(int size) { @@ -924,13 +888,11 @@ public byte[] getSecureRandom(int size) { /** * 获取SecretKey的字符串 - * - * @param secretKey - * SecretKey - * - * @return - * SecretKey的字符串 - * + * + * @param secretKey SecretKey + * + * @return SecretKey的字符串 + * */ public String getStringKey(SecretKey secretKey) { @@ -946,13 +908,9 @@ public String getStringKey(SecretKey secretKey) { /** * 检查密码是否合格 - * - * 1、长度至少为八个字符 - * 2、至少包含一个数字 - * 3、至少包含一个大写字母 - * 4、至少包含一个小写字母 - * 5、不得包含空格 - * + * + * 1、长度至少为八个字符 2、至少包含一个数字 3、至少包含一个大写字母 4、至少包含一个小写字母 5、不得包含空格 + * * @param password * @return */ @@ -967,18 +925,16 @@ public boolean isPassword(String password) { return true; /* - * 2、至少包含一个数字 - * 3、至少包含一个大写字母 - * 4、至少包含一个小写字母 - * 5、不得包含空格 + * 2、至少包含一个数字 3、至少包含一个大写字母 4、至少包含一个小写字母 5、不得包含空格 */ - // return password.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}$"); + // return + // password.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}$"); } /** * 打印信息 - * + * * @param o */ private void log(Object o) { diff --git a/src/press/gfw/EncryptForwardThread.java b/src/press/gfw/EncryptForwardThread.java index a71149a..efdf3c5 100644 --- a/src/press/gfw/EncryptForwardThread.java +++ b/src/press/gfw/EncryptForwardThread.java @@ -1,5 +1,5 @@ /** -* +* * GFW.Press * Copyright (C) 2016 chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -* +* **/ package press.gfw; @@ -28,38 +28,35 @@ /** * GFW.Press加密及转发线程 - * + * * @author chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * */ public class EncryptForwardThread extends Thread { - private static final int BUFFER_SIZE_MIN = 1024 * 128; // 缓冲区最小值,128K + private static final int BUFFER_MIN = 1024 * 32; // 缓冲区最小值 - private static final int BUFFER_SIZE_MAX = 1024 * 512; // 缓冲区最大值,512K + private static final int BUFFER_MAX = 1024 * 96; // 缓冲区最大值 - private static final int BUFFER_SIZE_STEP = 1024 * 128; // 缓冲区自动调整的步长值,128K + private static final int BUFFER_STEP = 1024 * 32; // 缓冲区自动调整的步长值 + + private PointThread parent = null; private InputStream inputStream = null; private OutputStream outputStream = null; - private PointThread parent = null; - private Encrypt aes = null; private SecretKey key = null; /** * 构造方法 - * - * @param parent - * 父线程 - * @param inputStream - * 输入流 - * @param outputStream - * 输出流 - * + * + * @param parent 父线程 + * @param inputStream 输入流 + * @param outputStream 输出流 + * */ public EncryptForwardThread(PointThread parent, InputStream inputStream, OutputStream outputStream, SecretKey key) { @@ -77,7 +74,7 @@ public EncryptForwardThread(PointThread parent, InputStream inputStream, OutputS /** * 打印信息 - * + * * @param o */ @SuppressWarnings("unused") @@ -92,59 +89,68 @@ private void log(Object o) { /** * 加密转发 */ + @Override public void run() { - byte[] buffer = new byte[BUFFER_SIZE_MIN]; + byte[] buffer = new byte[BUFFER_MIN]; byte[] read_bytes = null; byte[] encrypt_bytes = null; - try { + while (true) { - while (true) { + int read_num = 0; - int read_num = inputStream.read(buffer); + try { - if (read_num == -1) { + read_num = inputStream.read(buffer); - break; + } catch (IOException ex) { - } + break; - read_bytes = new byte[read_num]; + } + + if (read_num == -1) { + + break; - System.arraycopy(buffer, 0, read_bytes, 0, read_num); + } - encrypt_bytes = aes.encryptNet(key, read_bytes); + if (read_bytes == null || read_bytes.length != read_num) { - if (encrypt_bytes == null) { + read_bytes = new byte[read_num]; - break; // 加密出错,退出 + } - } + System.arraycopy(buffer, 0, read_bytes, 0, read_num); - outputStream.write(encrypt_bytes); + encrypt_bytes = aes.encryptNet(key, read_bytes); - outputStream.flush(); + if (encrypt_bytes == null) { - if (read_num == buffer.length && read_num < BUFFER_SIZE_MAX) { // 自动调整缓冲区大小 + break; // 加密出错,退出 - buffer = new byte[read_num + BUFFER_SIZE_STEP]; + } - // log(this.getName() + " 缓冲区大小自动调整为:" + buffer.length); + try { - } else if (read_num < (buffer.length - BUFFER_SIZE_STEP) && (buffer.length - BUFFER_SIZE_STEP) >= BUFFER_SIZE_MIN) { + outputStream.write(encrypt_bytes); - buffer = new byte[buffer.length - BUFFER_SIZE_STEP]; + outputStream.flush(); - // log(this.getName() + " 缓冲区大小自动调整为:" + +buffer.length); + } catch (IOException ex) { - } + break; } - } catch (IOException ex) { + if (read_num == buffer.length && read_num < BUFFER_MAX) { + + buffer = new byte[read_num + BUFFER_STEP]; + + } } diff --git a/src/press/gfw/PointThread.java b/src/press/gfw/PointThread.java index 83cfd6d..8687377 100644 --- a/src/press/gfw/PointThread.java +++ b/src/press/gfw/PointThread.java @@ -1,5 +1,5 @@ /** -* +* * GFW.Press * Copyright (C) 2016 chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * @@ -15,19 +15,25 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -* +* **/ package press.gfw; /** - * + * * GFW.Press客户端/服务器线程父类 - * + * * @author chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * */ public class PointThread extends Thread { + public static final int CONN_TIMEOUT = 3000; + + public static final int SOCK_TIMEOUT = 3000; + + public final static int OVER_TIMEOUT = 300; + /** * 关闭所有连接,此线程及转发子线程调用 */ diff --git a/src/press/gfw/Server.java b/src/press/gfw/Server.java index 2c4afde..0c27a76 100644 --- a/src/press/gfw/Server.java +++ b/src/press/gfw/Server.java @@ -1,5 +1,5 @@ /** -* +* * GFW.Press * Copyright (C) 2016 chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -* +* **/ package press.gfw; @@ -28,13 +28,14 @@ import java.util.Hashtable; import javax.crypto.SecretKey; +import javax.net.ServerSocketFactory; import org.json.simple.JSONObject; /** - * + * * GFW.Press服务器 - * + * * @author chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * */ @@ -83,7 +84,7 @@ public Server() { /** * 构造方法,用户线程 - * + * * @param proxyHost * @param proxyPort * @param listenPort @@ -113,7 +114,7 @@ public Server(String proxyHost, int proxyPort, int listenPort, String password) /** * 构造方法,用户线程 - * + * * @param proxyHost * @param proxyPort * @param listenPort @@ -127,7 +128,7 @@ public Server(String proxyHost, int proxyPort, String listenPort, String passwor /** * 暂停 - * + * * @param m */ private void _sleep(long m) { @@ -144,7 +145,7 @@ private void _sleep(long m) { /** * 获取密码 - * + * * @return */ public synchronized String getPassword() { @@ -204,7 +205,7 @@ private void loadConfig() { /** * 打印信息 - * + * * @param o */ private void log(Object o) { @@ -218,6 +219,8 @@ private void log(Object o) { /** * 用户线程 */ + @Override + @SuppressWarnings("preview") public void run() { // log("监听端口:" + listenPort); @@ -234,7 +237,7 @@ public void run() { try { - serverSocket = new ServerSocket(listenPort); + serverSocket = ServerSocketFactory.getDefault().createServerSocket(listenPort); } catch (IOException ex) { @@ -282,6 +285,7 @@ public void run() { ServerThread serverThread = new ServerThread(clientSocket, proxyHost, proxyPort, key); + // startVirtualThread(serverThread); serverThread.start(); } @@ -307,6 +311,7 @@ public void run() { /** * 主线程 */ + @SuppressWarnings("preview") public void service() { if (System.currentTimeMillis() - lockFile.lastModified() < 30 * 1000L) { @@ -337,7 +342,7 @@ public void service() { Hashtable users = null; // 用户 - Hashtable threads = new Hashtable(); // 用户线程 + Hashtable threads = new Hashtable<>(); // 用户线程 while (true) { @@ -383,6 +388,7 @@ public void service() { threads.put(threadPort, thread); + // startVirtualThread(thread); thread.start(); } @@ -401,6 +407,7 @@ public void service() { threads.put(userPort, thread); + // startVirtualThread(thread); thread.start(); } diff --git a/src/press/gfw/ServerThread.java b/src/press/gfw/ServerThread.java index 76b7166..5956532 100644 --- a/src/press/gfw/ServerThread.java +++ b/src/press/gfw/ServerThread.java @@ -1,5 +1,5 @@ /** -* +* * GFW.Press * Copyright (C) 2016 chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * @@ -15,22 +15,25 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -* +* **/ package press.gfw; +import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.InetSocketAddress; import java.net.Socket; import java.sql.Timestamp; import javax.crypto.SecretKey; +import javax.net.SocketFactory; /** - * + * * GFW.Press服务器线程 - * + * * @author chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * */ @@ -46,7 +49,15 @@ public class ServerThread extends PointThread { private SecretKey key = null; - private boolean forwarding = false; + private int overN = 0; + + private InputStream clientIn = null; + + private OutputStream clientOut = null; + + private InputStream proxyIn = null; + + private OutputStream proxyOut = null; public ServerThread(Socket clientSocket, String proxyHost, int proxyPort, SecretKey key) { @@ -61,68 +72,105 @@ public ServerThread(Socket clientSocket, String proxyHost, int proxyPort, Secret } /** - * 打印信息 - * - * @param o + * 暂停 + * + * @param m */ - private void log(Object o) { + private void _sleep(long m) { - String time = (new Timestamp(System.currentTimeMillis())).toString().substring(0, 19); + try { - System.out.println("[" + time + "] " + o.toString()); + sleep(m); + + } catch (InterruptedException ie) { + + } } - /** - * 关闭所有连接,此线程及转发子线程调用 - */ - public synchronized void over() { + private void close() { - try { + close(clientIn); - proxySocket.close(); + close(proxyOut); - } catch (Exception e) { + close(proxyIn); - } + close(clientOut); - try { + close(clientSocket); + + close(proxySocket); + + } - clientSocket.close(); + private void close(Closeable o) { - } catch (Exception e) { + if (o == null) { + + return; } - if (forwarding) { + try { - forwarding = false; + o.close(); + + } catch (IOException e) { } } /** - * 启动服务器与客户端之间的转发线程,并对数据进行加密及解密 + * 打印信息 + * + * @param o */ - public void run() { + private void log(Object o) { + + String time = (new Timestamp(System.currentTimeMillis())).toString().substring(0, 19); + + System.out.println("[" + time + "] " + o.toString()); + + } + + @Override + public synchronized void over() { - InputStream clientIn = null; + overN++; - OutputStream clientOut = null; + if (overN < 2) { - InputStream proxyIn = null; + return; + + } + + _sleep(OVER_TIMEOUT); + + close(); + + } - OutputStream proxyOut = null; + /** + * 启动服务器与客户端之间的转发线程,并对数据进行加密及解密 + */ + @Override + @SuppressWarnings("preview") + public void run() { try { // 连接代理服务器 - proxySocket = new Socket(proxyHost, proxyPort); + proxySocket = SocketFactory.getDefault().createSocket(); - // 设置3分钟超时 - proxySocket.setSoTimeout(180000); - clientSocket.setSoTimeout(180000); + proxySocket.connect(new InetSocketAddress(proxyHost, proxyPort), CONN_TIMEOUT); + + proxySocket.setSoTimeout(SOCK_TIMEOUT); + clientSocket.setSoTimeout(SOCK_TIMEOUT); + + proxySocket.setTcpNoDelay(true); + clientSocket.setTcpNoDelay(true); // 打开 keep-alive proxySocket.setKeepAlive(true); @@ -139,19 +187,18 @@ public void run() { log("连接代理服务器出错:" + proxyHost + ":" + proxyPort); - over(); + close(); return; } - // 开始转发 - forwarding = true; - DecryptForwardThread forwardProxy = new DecryptForwardThread(this, clientIn, proxyOut, key); + // startVirtualThread(forwardProxy); forwardProxy.start(); EncryptForwardThread forwardClient = new EncryptForwardThread(this, proxyIn, clientOut, key); + // startVirtualThread(forwardClient); forwardClient.start(); } diff --git a/src/press/gfw/Windows.java b/src/press/gfw/Windows.java index 6a651a7..9adb0cc 100644 --- a/src/press/gfw/Windows.java +++ b/src/press/gfw/Windows.java @@ -1,5 +1,5 @@ /** -* +* * GFW.Press * Copyright (C) 2016 chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . -* +* **/ package press.gfw; @@ -44,9 +44,9 @@ import org.json.simple.JSONObject; /** - * + * * GFW.Press客户端图形界面 - * + * * @author chinashiyu ( chinashiyu@gfw.press ; http://gfw.press ) * */ @@ -70,91 +70,91 @@ public void actionPerformed(ActionEvent ae) { switch (command) { - case "退出": + case "退出": - setVisible(false); + setVisible(false); - if (tray != null && icon != null) { + if (tray != null && icon != null) { - tray.remove(icon); + tray.remove(icon); - } + } - System.exit(0); + System.exit(0); - break; + break; - case "确定": + case "确定": - setVisible(false); + setVisible(false); - boolean edit = false; + boolean edit = false; - if (!serverHost.equals(serverHostField.getText().trim())) { + if (!serverHost.equals(serverHostField.getText().trim())) { - serverHost = serverHostField.getText().trim(); + serverHost = serverHostField.getText().trim(); - edit = true; + edit = true; - } + } - if (!serverPort.equals(serverPortField.getText().trim())) { + if (!serverPort.equals(serverPortField.getText().trim())) { - serverPort = serverPortField.getText().trim(); + serverPort = serverPortField.getText().trim(); - edit = true; + edit = true; - } + } - String _password = new String(passwordField.getPassword()).trim(); + String _password = new String(passwordField.getPassword()).trim(); - if (!password.equals(_password)) { + if (!password.equals(_password)) { - password = _password; + password = _password; - edit = true; + edit = true; - } + } - // if (!AES256CFB.isPassword(password)) { + // if (!AES256CFB.isPassword(password)) { - // passwordField.setBackground(Color.ORANGE); + // passwordField.setBackground(Color.ORANGE); - // passwordField.setToolTipText("密码需包含大小写字母和数字,至少八个字符。"); + // passwordField.setToolTipText("密码需包含大小写字母和数字,至少八个字符。"); - // } + // } - if (!proxyPort.equals(proxyPortField.getText().trim())) { + if (!proxyPort.equals(proxyPortField.getText().trim())) { - proxyPort = proxyPortField.getText().trim(); + proxyPort = proxyPortField.getText().trim(); - edit = true; + edit = true; - } + } - if (edit) { + if (edit) { - saveConfig(); + saveConfig(); - } + } - start(); + start(); - break; + break; - case "取消": + case "取消": - setVisible(false); + setVisible(false); - serverHostField.setText(serverHost); + serverHostField.setText(serverHost); - serverPortField.setText(serverPort); + serverPortField.setText(serverPort); - passwordField.setText(password); + passwordField.setText(password); - proxyPortField.setText(proxyPort); + proxyPortField.setText(proxyPort); - break; + break; } @@ -441,7 +441,7 @@ private void loadConfig() { /** * 打印信息 - * + * * @param o */ private void log(Object o) { @@ -469,6 +469,7 @@ private void saveConfig() { } + @SuppressWarnings("preview") public void start() { if (client != null && !client.isKill()) { @@ -487,10 +488,9 @@ public void start() { client = new Client(serverHost, serverPort, password, proxyPort); + // Thread.startVirtualThread(client); client.start(); - // log(client.getName()); - } }