From c27adf8a3dde1e993ac17a9519abd1cacc981f53 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Wed, 4 Apr 2018 02:28:24 +0200 Subject: [PATCH] implemented server side RC4 decoding and re-encoding, injecting, .. --- .idea/artifacts/G_Earth2.xml | 20 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .idea/workspace.xml | 1248 +++++++++++++++++ G-Earth2.iml | 11 + out/artifacts/G_Earth/G_Earth.html | 43 + out/artifacts/G_Earth/G_Earth.jar | Bin 0 -> 63002 bytes out/artifacts/G_Earth/G_Earth.jnlp | 15 + out/production/G-Earth2/main/Main.class | Bin 0 -> 2569 bytes .../G-Earth2/main/OSValidator.class | Bin 0 -> 1672 bytes .../G-Earth2/main/irrelevant/Timer.class | Bin 0 -> 731 bytes .../main/protocol/HConnection$State.class | Bin 0 -> 1263 bytes .../G-Earth2/main/protocol/HConnection.class | Bin 0 -> 13417 bytes .../main/protocol/HMessage$Side.class | Bin 0 -> 1050 bytes .../G-Earth2/main/protocol/HMessage.class | Bin 0 -> 1160 bytes .../G-Earth2/main/protocol/HPacket.class | Bin 0 -> 12788 bytes .../main/protocol/StateChangeListener.class | Bin 0 -> 335 bytes .../main/protocol/TrafficListener.class | Bin 0 -> 175 bytes .../G-Earth2/main/protocol/crypto/RC4.class | Bin 0 -> 4236 bytes .../main/protocol/memory/FlashClient.class | Bin 0 -> 6832 bytes .../main/protocol/memory/MemorySnippet.class | Bin 0 -> 575 bytes .../main/protocol/memory/MemoryUtils.class | Bin 0 -> 1430 bytes .../main/protocol/memory/Rc4Obtainer.class | Bin 0 -> 7621 bytes .../packethandler/BufferListener.class | Bin 0 -> 158 bytes .../main/protocol/packethandler/Handler.class | Bin 0 -> 3172 bytes .../packethandler/IncomingHandler.class | Bin 0 -> 2041 bytes .../packethandler/OutgoingHandler.class | Bin 0 -> 4234 bytes .../packethandler/PayloadBuffer.class | Bin 0 -> 2009 bytes out/production/G-Earth2/main/ui/G-Earth.fxml | 39 + .../G-Earth2/main/ui/GEarthController.class | Bin 0 -> 1776 bytes out/production/G-Earth2/main/ui/SubForm.class | Bin 0 -> 941 bytes .../G-Earth2/main/ui/bootstrap3.css | 893 ++++++++++++ .../main/ui/connection/Connection.fxml | 209 +++ .../main/ui/connection/ConnectionForm.class | Bin 0 -> 5218 bytes .../G-Earth2/main/ui/injection/Injection.fxml | 76 + .../main/ui/injection/InjectionForm.class | Bin 0 -> 4590 bytes .../G-Earth2/main/ui/logger/Logger.fxml | 120 ++ .../G-Earth2/main/ui/logger/LoggerForm.class | Bin 0 -> 9446 bytes .../G-Earth2/main/ui/tools/Tools.fxml | 165 +++ .../G-Earth2/main/ui/tools/ToolsForm.class | Bin 0 -> 5367 bytes src/main/protocol/HConnection.java | 5 + src/main/protocol/HPacket.java | 6 +- src/main/protocol/crypto/RC4.java | 111 +- src/main/protocol/memory/FlashClient.java | 303 +--- src/main/protocol/memory/MemorySnippet.java | 19 + src/main/protocol/memory/Rc4Obtainer.java | 226 ++- .../packethandler/BufferListener.java | 2 +- src/main/protocol/packethandler/Handler.java | 15 +- .../packethandler/IncomingHandler.java | 35 +- .../packethandler/OutgoingHandler.java | 99 +- 51 files changed, 3296 insertions(+), 384 deletions(-) create mode 100644 .idea/artifacts/G_Earth2.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 G-Earth2.iml create mode 100644 out/artifacts/G_Earth/G_Earth.html create mode 100644 out/artifacts/G_Earth/G_Earth.jar create mode 100644 out/artifacts/G_Earth/G_Earth.jnlp create mode 100644 out/production/G-Earth2/main/Main.class create mode 100644 out/production/G-Earth2/main/OSValidator.class create mode 100644 out/production/G-Earth2/main/irrelevant/Timer.class create mode 100644 out/production/G-Earth2/main/protocol/HConnection$State.class create mode 100644 out/production/G-Earth2/main/protocol/HConnection.class create mode 100644 out/production/G-Earth2/main/protocol/HMessage$Side.class create mode 100644 out/production/G-Earth2/main/protocol/HMessage.class create mode 100644 out/production/G-Earth2/main/protocol/HPacket.class create mode 100644 out/production/G-Earth2/main/protocol/StateChangeListener.class create mode 100644 out/production/G-Earth2/main/protocol/TrafficListener.class create mode 100644 out/production/G-Earth2/main/protocol/crypto/RC4.class create mode 100644 out/production/G-Earth2/main/protocol/memory/FlashClient.class create mode 100644 out/production/G-Earth2/main/protocol/memory/MemorySnippet.class create mode 100644 out/production/G-Earth2/main/protocol/memory/MemoryUtils.class create mode 100644 out/production/G-Earth2/main/protocol/memory/Rc4Obtainer.class create mode 100644 out/production/G-Earth2/main/protocol/packethandler/BufferListener.class create mode 100644 out/production/G-Earth2/main/protocol/packethandler/Handler.class create mode 100644 out/production/G-Earth2/main/protocol/packethandler/IncomingHandler.class create mode 100644 out/production/G-Earth2/main/protocol/packethandler/OutgoingHandler.class create mode 100644 out/production/G-Earth2/main/protocol/packethandler/PayloadBuffer.class create mode 100644 out/production/G-Earth2/main/ui/G-Earth.fxml create mode 100644 out/production/G-Earth2/main/ui/GEarthController.class create mode 100644 out/production/G-Earth2/main/ui/SubForm.class create mode 100644 out/production/G-Earth2/main/ui/bootstrap3.css create mode 100644 out/production/G-Earth2/main/ui/connection/Connection.fxml create mode 100644 out/production/G-Earth2/main/ui/connection/ConnectionForm.class create mode 100644 out/production/G-Earth2/main/ui/injection/Injection.fxml create mode 100644 out/production/G-Earth2/main/ui/injection/InjectionForm.class create mode 100644 out/production/G-Earth2/main/ui/logger/Logger.fxml create mode 100644 out/production/G-Earth2/main/ui/logger/LoggerForm.class create mode 100644 out/production/G-Earth2/main/ui/tools/Tools.fxml create mode 100644 out/production/G-Earth2/main/ui/tools/ToolsForm.class create mode 100644 src/main/protocol/memory/MemorySnippet.java diff --git a/.idea/artifacts/G_Earth2.xml b/.idea/artifacts/G_Earth2.xml new file mode 100644 index 0000000..9d4fe51 --- /dev/null +++ b/.idea/artifacts/G_Earth2.xml @@ -0,0 +1,20 @@ + + + $PROJECT_DIR$/out/artifacts/G_Earth + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0548357 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..1ebdf36 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..712c2b5 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,1248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Memor + 256 + memory maps + print + send + sendtostream + + + + + + + + + + + + + + true + DEFINITION_ORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + project + + + true + + + + DIRECTORY + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1522695209780 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + file://$PROJECT_DIR$/src/main/protocol/memory/Rc4Obtainer.java + 28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + G-Earth2 + + + + + + + + No facets are configured + + + + + + + + + + + + + + + 1.8 + + + + + + + + G-Earth2 + + + + + + + + 1.8 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/G-Earth2.iml b/G-Earth2.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/G-Earth2.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/out/artifacts/G_Earth/G_Earth.html b/out/artifacts/G_Earth/G_Earth.html new file mode 100644 index 0000000..83d886b --- /dev/null +++ b/out/artifacts/G_Earth/G_Earth.html @@ -0,0 +1,43 @@ + + + + + + + +

Test page for G-Earth2

+ Webstart: click to launch this app as webstart


+ + +
+ diff --git a/out/artifacts/G_Earth/G_Earth.jar b/out/artifacts/G_Earth/G_Earth.jar new file mode 100644 index 0000000000000000000000000000000000000000..7416dac9ea64e1cd5e9f6fc9b2129e123b46981e GIT binary patch literal 63002 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%0D9x~&Kz)WulnqhXg>SOBn8~h+_^c{15 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 literal 0 HcmV?d00001 diff --git a/out/artifacts/G_Earth/G_Earth.jnlp b/out/artifacts/G_Earth/G_Earth.jnlp new file mode 100644 index 0000000..92bd616 --- /dev/null +++ b/out/artifacts/G_Earth/G_Earth.jnlp @@ -0,0 +1,15 @@ + + + + G-Earth + Unknown + G-Earth2 + + + + + + + + + diff --git a/out/production/G-Earth2/main/Main.class b/out/production/G-Earth2/main/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..5aaa3d0a19ffa5427702fbb44c58a631d7f482e8 GIT binary patch literal 2569 zcma)8YgZFj6x~BY28K}(d5Bi56x#sG*s8S^wQ2;^2C#td)_OC!kip4JoS7ilhi&cq z{rn;Q5?fuX%g^_Az0Wy!<w%O@HYFtp+cz0DM%f)94k1kAdw!qs34hf^HM=) z)^g-*xtNpQqR82_)17rqVP6!U#ozH}GALNSf{tuaSdKA6!-RrXKM-D^pg)~m5vyWp z&7h5CX)N$K!I$VI&ngOUJ={^y(+o$E*{;Y-Pr&A#Zo0*ia4gqRussU0Y#Gy&6kj3ZI)Uffw)6<7O|F@;6cEr?VUk}a zq@XW-E%a>I!dWH)p5-iu43ffICgNM094pvti()P>hC>~O_bWJ@e)8QLk%t;xvYfno zdvcY-XQf&tFFE)IDeGYr{DNEdOgUw7p4vGJnMT*RAWavT$HGY8q5~hn7!W8;lbAt zU`R(9t2%CDjdaXWa{a&)r32%pPl;LAaR=|Hcvr`Jcwa%+sVZPb1_d|occyT+3m?$* zVHZBqaStEs_ynKo_zZ`1e9n5bhqPHG1%q)sqExaiQ*i!`leKlsGs^x(g-~~}S+tw6 zh0h(ZEQ5LJhj~yi6jgp>)kKBl$iTQTpQV!95`(HcVfS&#Q$wUj>dI~|w<1lh=1p`- zt!fpt`7(%GXhYaqr%@K^oPx6ML>-(=U*$X4YS9X~R(hMoNs#Te&aKPu#Oc#j`!I72 z9UkJs?WjNef_t0pqKIQ`U(AW0gE}x}nK8k-E&YO&0cp9XhBUc9&9E(vxtuS(Ri=`) ze3nBGvk=Qiegb!LEs&lg>?zkPKCWWiyb5;5Ie)TmdJ9FK($FAJoQ09A8ot1n_1wc2 zHL5+!FYH$ecGe_p+SsXraPpjkr@akP6_8?eSDXp$_|4iviJWsXw(HAzd8;gadM5@q zu5Dt%*-P1??3e|5SwznD0u^8D_y#}dcm=Og;noVs0H- z+Lwx-$Y<7dZ89-Y)tPz<)_lMPi7?=jh9z zS)sXg^gfhdY0-jV8dKqB7xvIvj{tZcFVL5QG)4%;#($#?tu(JZM9Y=#M0c`+*851! z?5#k3gtl3l+aDouBsq{At3Vq|RM0Wjtyi#V>>)N^+1G>49&EXftrheTpqKvpD(ELq z+sIP|1HWT?3oeZfBp+Z0P{A{`2*=SuH}|3wedxzFA~!%0?!Xv!;zbN1LxiV^=yi(J zqR5%a!6@383B`?3!qe-DYuJl@#Ht?)7$;E@ju=uAG$Z3)s){FNt4g*~p7k%vD7|o1r9j##SaR2Q%t(L^bPT8Opv3SuoRq`zBr;?VPVmo*qGp6|u08uZFSLqldQ*l{%s z*F4|7-Dz*T;ilYf5wUAQQ??p1^pu{0nfRd>sk659{A%54$dbU&2?aVmQkEY5N^FydsN)BUvLI3i9pB>`1ud>_ z7-}$sXvvpt*FqCJ7F=8*3IFXSp?~M5zWvB;#-||XNff(n6{N$1v17u$pt`{ci#cbm zY;zn&5+A2wCa|ZBTAY)y%Gpk-G3kkYJhN$7Ym#2y|wmGhK~DP$Mu`;vYHW- zBjX;_AN-H^n`{&ZWg`ss+%SHkVXoI(`a=2+P$3R#!M+==$;jo1%=m^8VP|bbI6oqd&nUR~cQ!?&ZIn(}@nqMl>FJjVLuae?Nq<4S7&n7jJSC;c((p~IvvhCNP!{V?noD6kKPJ#lDH9-ibe zM>k-<4f2>v_`XD*7cs$1rpZg0#m+L2;@3bXCxqaDT|F7E*)*_aPjxYUg!8{bSAFee MI7{t~B;uR@0G~8RS^xk5 literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/irrelevant/Timer.class b/out/production/G-Earth2/main/irrelevant/Timer.class new file mode 100644 index 0000000000000000000000000000000000000000..7864cd1d41ee7db4ecad94154bca95298ccb8c49 GIT binary patch literal 731 zcmZvYO-~b16o%j1PG@8~1rk?ws?y=bRtE&o2NxL+HcDw2v7)9KZl(t(miC z-lth`*H15heeV4{_OR&TkwC%dwt6BUHnR9By^33^#kY3??sFY$vo4TdTHXkb(%8Tk%_i>_UM>B-4&RqwWW@$I!RQdj$~}A+Z0XKsMIww zF@#f*SxZGmrcy5jN_8Wf2e0M(4CdE6he=bt(pJt-2`l^ZNCp^2*~8-iOIQw2L=d24 z%^-#X+(TJl{8oK|VcTDgWV~B_+t^o4PIB$3{-JABTi{MCa*59#yRdE~4b zqns5?JvHea5QH-A2(wLA3i`?L8$|dWxgPRic!qorPDoSulD3Z04zkpO9e$%IV2oMN zZ^k(8GUGL`z^fU!^cQ*)=BADAHAv|S!n5$No$fz~6FN60>O;I+A(NaMwOW^B{xWDMW4oK7xv4k>!oZJG9#=~;~Nm{xSmF0t!>Qwoss zmSg#k1Wf&-VkNaDK=j{O)LYoFI*#f0JYotaSwhLT?BmO;L)2xb*Ug_P^$|UfYPdbG z)n2z)@8d%cxXgOjaFOlOtcE-u${>kX&UkSR^LVV`Iufm5rXe25->+r;<+f{=Q)nyvk350 zRTtBr5ITa$@PSkKt8}6bP)Oh!&(lB&#TZr)q%R<+mu3$kecNhVMmaLgb+5dB!DIXBp4DT0UAK)kW64;G81PeKwPS} z(#2}6U9`}}t&q~92tvZ5)T*Vm#eHd|wVPFI7wx96rE1>)JNM3=JCgz5d%wQ-d;0U< zbI&>7dcO5!{L%ZzP7u*7{;S4Abn@`fTw*TLc$mh+b;>cn{W3Wsm#*TGG8!e1(efB0 zkFoL?=i~9R;XEB56J%zh#^>uan1{;DBpH3k$HnrVEHfoKm+};OlnLBajmvc!&C}## zx@?%C@l2h@^DIGjfsAI$<3f!;Tu8+8behET<#Cb57i(OlQz=i=xLT(&u93$Ac`Vd; zkxtWjXd$pHE+iK($$`M~&kO;+R5k%|8Q1Al!qbFAoyJRrXuVEzxk2M)I$gwe%@0A?9~G>@7& zkjERiMINmh2lHqZw`sglR#wVmQz5x|v(8&MtaCd@3UNxC3xRI4Xz2=h#59iU)WQjo zv{N*=Rp)KIT^?PsaHTx1lE>9LUjy1$0KXs8_*$K!Cfs#0x>_FC&3wH)KCbg8_y!;E z(D{@6DIb5@$Dh&oMy8y`L?97lGHN4{V5}w_h{uC*ra_yc@kD%4C>*SdwgeKPXoRV- zZgXI3pgbIiY%Fg~#6ppcl}!1vQT8ot4JCrDOuU+@AQ20+wS`*hLh(cpXn}C>8V7X4 zhRwm21fYk+g?h~8lgx>XJUP8R8TVw2(%unKsgH*R z&RFd-oG<{gn2pvE3w8wLFpG-&uh)toTA;Nx7L0?tqLgN9q24NU9*i;I$EFrnM7Bht z+ail$kqfuC1UuwFvCC^8B7|t!vNX`4gh!k*O+pUR+Y$~1BNz-yp|j6#sDr~4Vl!Cb zr0glMT7ct;C6UtQ6tr}oy=uE(1;gK@9o43_EBKwnt-K<;zohDv^m0#x**u@n~2@MI)BCLHP4gn|(`p~o`l!_5mu~?wX3KXuk>A+~77}O%63F>gQf#o4- zv&(Th!I-RVz}j$ot-77+Up*nD0+`ZMELf0IheL>nfO-45C8?ATb)dQg!Tqk za69}o5!|j0FwHBwI+C7gxlOu!a~+mwh2Z&6^E%{sq&g%xV9<`pvUX4F@4m}{2{U7R~zr_8NuX4FVwWc1 zF`6d$wFuG9qn|hpab_-3mRZT@ji?@4f)cxtQXOGws*s1e(!+scgF&~^?FL;(*8?zB zcbEkyVxpQ#kEsTIoIYXD4Yb4HTj()FY|2% z-!AK4q0calRyahr*$NqhcS17WC3JsCkHe?z?ap!&3gE9A^f|i4;IHx54gLn-k*11d zSyE6PjV9uWSfFDm>d$Cve4v-_ETG#5YJ8W$ck?}h>6-?9n{H3)4aVT8Rg$x+AFwMJ zRGulmRJ9{Va<{>|d5^)}{4J(&>8ID6j=~LtNcrYf5pE>_p&zLg+{Y|=8Uziu@E}1_}XBi zW$h*@C{eeSWTQYj>9E9x|AA#WfNMYUoE8Kng{ zTXdV*ehsK^Xj)&>P+z~WrfJ~<1e0aU7cQ$>UR#g8&Kv0HK>9}l$yWH9xyR9VTd@VD zmM;-Ctt-j5L=Q)gWY!qfUG;%>MADM8W6yvC>U^tAvAQkLG8q=$2X>(QmzJ<)3+kyB zpe|fhRoetv)-P&UzP_fec42)JO59@A$oWF?ns78OEd(kc)GyvZi*#quRI)jABov*0 z!>`Dd#c#1a)`enm#C1z*4xx6zH5$!{qVNTiYdCB1eA!zzp4^Og{nf*+y zq*=f)$6m)mrAY89(^DVJdnS>L8lr!A>@TyagmmMqbksLa#_YXLnfs$eUU%4?tuPVm zwf`?-Wsx952mP$$EMmz;KsXre5Sv}1I*%5ySd_u3B2;yfvNkw1XZ46O>x-eEluH-b zckl|_6-kfkG&<|jOB}$Bh9eD+)fy_w+oX>KBk|Ccc)4Mnf~eMc9QOTLPFuJ$z6r#w z-V`)PI%%Rei#39qV5B9eS_hx>sAiZdN?LAO_=2mTo{iV5=F}5WukarlW~d6{5yHPfhsj+Cux={r(B3OJfk0AnwBYRI^~T0 zN?EzijDp%Y6gIPsN30Q6Elky-W(vg@;93c}LR~8j1of)488_}XaS4L$S?+0*3_}WM z9shw0XY5xD7bx8}G~xy`gqtqOm${)hGJ0!t8&1Gcvp1@o4sU`71S4BjH=e35%(PeO z^a^WAND6S52ij`4Wy8TB3q+dg5`Cpy+t`3XoEU% zn}s{C_SBcge+D;o(dd>=1d3BmKeG^+m9%Lg@rmY6E3`V&w{s>9unD(6|FcDt(yv&SCgBu9ryE3w9h$yaiaau1VU!iOoZ z#C4bq84Zv}{sBdEC!Uii7f<{(ht9)j0+rK5s-W|!3M-3fGF?hjXc?8!F6=T)j_9lO zHGDCBoxWjlTaLGIn^SU#^!qVzksvoknBf4T#{ zVOI@i7T~#v7SknwsRL9kHPRAV1!b2$9-7?U_gr0f z-&5V>tAlc<8~`h8sgt%-36yX(gebMtR!s$9vVn9cWe~(3PEAnaD(qSfh_%!T1;r=` z*e!tGL|u4aO;KQIhZjb0&kw{7^@*zT$vY=Ms?mLJ z+~e=}kXV-oyGpH^&_QxA^A4eGam#u0Ec4uSC~9Rr3* z2%X0<=LJ94(1V!Mz}0qo2(Uiz7NryPT?8OGwsP|JVM*8MVU510(Ie{ls78-zWIi$T zeWHQ7j&r@wtIic}0s9!O&K6xaR3uS!KW4=(YH^+j2OsDKelhlwG)i8|=EV>&s3$Af4F68*{ygwc^gGD&1{KpEVa{)2{jb>Z7UIBPVA_9Ix-0@C3zVTgpbWLvVW?of zcr`>36r-v5Fu1k*7V!=`?PP(Mo@9U*YD{_ZwyC@e<+Cz2j+4@j@N)Ii)n>#X{F-C{6>~m*7c!8hqO6<4g;dRhX(11x1|CLDJRGVVfnP<8qzI3uIFF$& z9#1>?Jlc)-cldm|pC{2_{tzAGDfAFerW0IBkFc4QuSER18cy>gqzF(&T>CMdg0T%o z`gnq#gb|HKrhbZ^27kr43x0;4g+rFYNuNUi@X}Nym*-K5Xw-s8`~tlQ91*0gpU_X? zkS7535@M@((WAEeKT4+o%LpH4RbW#6Id+KySCg*~Xno3oU)Jas8vRnEUupDfjb4Vj zigMqh$r}AeqgUR=Phrl`)IP*=m${u-#cG#aG=qX9w|5|egr9@|4RcA^N|Caa#$A1H z*@p6J7DLgLp=e?#KKJb0p}9%x@J$(tQ#UQ5&YbqN-a)$GC-zczL$0z8pI8ST%T=wG zZXJ6O7L(Soj)p;^8L*C-u#Q=sEzhHRo==T@F7rO|GTATu=M>Qo5Iy(gAL;!}b=-B64w>ci9$kn{5#{*%ooV zZ4n={EaGyUzSx0=3|yt`zy}LR*}*~E4i5IS1EH0)gZZTOL2xar9T1IvpT?V3z{O`M zCz}o6Zxp5tAYZ#-wM6qu5e@a-bfLVKO3kKYJCz zrAO%_ZtCuPMao_?V~&Av#Em$HCK|visE}9EG+qVg{0M$+wMMD21R_s^3%ri#?x6ut z=o`pq;t2C>1;x3D%{2)Km+q+SC8 z^6km^&T)LF7?36azfu4Ln`sc z9S)3!jnPm#7L0#CD@Kte#jB~T7%-Xzp=4JHMP_RvBRMs}_%^*`@#t()jD6VdXi|8q zV$AGtl1&OD3Er6nxG+iM6 z3eqFen1-D%R>Rj)E?-9@_35g@pbtuuH6V6XQpQ@+TIH+#2g7i$E@4k&^*( z=H)%K&Yel<1`ygoL->;pLPa*AqW*;5NAX}w4AX2?QzvBjA<;Q;HzQo2;lIIJSYn$umBMSwM2HksJm z9k2~Fxg0)DEzPC9)LNlWk^UoS_9yE=1f6EvZd@s-5qiZXl2`GshfJNcBz~8nIokCe*@a}Hrf>x#=ixlUNOKw z0DYa``0fE@>lj+1BPhrTqetv_1b-wpP(iAB_G9%C%;3!e6e`FkaHI7kelYM9YObfz_C15X z>RIse0=Rh&Se^&;i-7tepdQD+r!e~jy$qPw0rM7M&d@U`-kwFx`vN$9jt9~6TtqK| zs~@AbJ%u{<2`;B6QRO^^s^)2~!~SOMUx)nx>~F#TO&D)M%^_BLH#olt4dWZ^MZ2J* z4$|1CBuciVkD(@z&R+*DYYte<(EzdCr1N1UEh$0-M$&3Zt_@oatBj;2mGl=@?QD)3 znGLJVNfRptLs+%FX!tOa*41oS7txq^sX*i05%1D;jrB7$;0$?lb8|J_xCG5lEh^dq z#~0_lFYS-UdG@6DALN4f;l9`OK96R3-|6EN74Pe?yzdIr>O+>#+1}T-hgMkLx2V7O zC4DR=4!EoDC2_#`&c0{x>1o16QJY*8^-@ClWPW$w5z`TGOS+nE=j~Y>GVJ%Aq=GaT zEIUd0PWLoDGI@caq5!)8_@ZMaM9C_YnrX_ifiCEJ8*U($OiHqAmqp*1!@bA$c_PQdO5>>g+<9ZU`)k@({@}qt*)gcE}XXG z!fEB@Qb(Ouo-c9Xv>g{tt61Sxa}rY|E}T}8MB>6}M_j0(aVjnh9Puw&f{36YBn--z zh~UL-&;ESpr^E!@#H*N)+%(J#3iwNqmEgM&wxlV@FF{1;Of{KO9_FaF-Fzo+bBZua z^ie!pu^Iq@7W6SerNnW-l#7rj;ZxxAlPbZ;yjGR+P$So3)sOpd%E?D9YOj9{k@W`2T5e z8!#BADSwb~;r^28>WlsSM}CX{M1G_V!Y#WO4YHdnc`p7lN0->6T6+|-M^Ss!!Il3B D_f066 literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/protocol/HMessage$Side.class b/out/production/G-Earth2/main/protocol/HMessage$Side.class new file mode 100644 index 0000000000000000000000000000000000000000..a449dccec80f8ed2ba61f795e6b155169e0cecb6 GIT binary patch literal 1050 zcmah{?{Csj6g>|LEnQ)Z%{kaFrl`Os6~#}G1w$~BAS5f2EPg7rVwcjIQucQ#OPtYY z_SrwmcwdK(#bvxEy}9q6d+xdS-Cw`I{RB`!B?bWxWjsP&#Hxs*3q(Q|#*aBcO~YjZr- zhh~nWs{uiy-D-Av3}UYTqWz|+G3>lukQF`E?FpyP<_n9kLc`^{mfMzNb|#~N>Gkx1 zO*djd(tXcR&bLqWQ(d)nXQ*nvXF0=aVS$8H+ck8%uX`3}n^6jmJ|gDS|8xw|n&nvj zA;bC&)mnu&Wu@Jzurb`->sRIq|1L*i<3Tn|IUuw92rt>p`I zTDyZ2)9^{o`pp#>p3jdZ*q`cL{=ZkbUand%(=IBsz~OqDs{+W9Fd&)X-BCn93~RUp zs!iTKvi!(XurCN*ApD6uhP(8S2C)d?H;|s;D+mR*a!M$EMdShk$A_-rGjyX|qOggr zAWmZ<6t7rDm_9%(?r)tV`Z);Cm%B)xr+&8gr z!Zq=LK|2wB&S1BLfJZIgi(?)$nCEZ3-g}-fY;-O?5xB!BOu}C1yGN6Qr=*NiWi6j@ z%;VS_@NH>KX}Spd{38QvGZaPq!Vk%~PwO)V($ck$1_i$#2h?x0|Pg(F$b& z%N-H$*Q3iWkKTD*pLSL|VbAkVy-3J)wy7oOg6b>($Cr4GVOF^n^JGe^HO}N^dRO8z zsEsD!7Y97~+owvSnfIJ_YKih*@;DKJmxwT6sQ;ThQy9a7h+AP4jfRQrm30!1q8@)G zWL=9#S?>OY_rbGq9S?0RVcCX_MH?%)W@8m=CJt6p58af=VNCQ8d7adY#4+twxlmQLH%M z!JNG@6lZq~)v1l4IqDetmsGkz;|-F6tTZaHNLEW^vqnZ`GAh%FGciJiGUcy=DuJ+c zCQ+1hCSg?Cy@^_ea7ZWe%y6nR_gR@jCqL<5nq*D=4cwyp=`9maJ@azYHK03Rp?@Ng z0*Nkb23;v_>~yYYHVm88yGbvuiq+3K@#b9d9c;}JD|zwOTrs_mOng955*7$s{RSgX azH>!i$jBAkO%d;5fucov`4?k7ulxbE_{?ko literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/protocol/HPacket.class b/out/production/G-Earth2/main/protocol/HPacket.class new file mode 100644 index 0000000000000000000000000000000000000000..8b6fa9f42b39e265f12403a03aaa5220a9b03a07 GIT binary patch literal 12788 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 literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/protocol/crypto/RC4.class b/out/production/G-Earth2/main/protocol/crypto/RC4.class new file mode 100644 index 0000000000000000000000000000000000000000..f9e4168f51bb306510fb48a3d107ecc1ffaf27c0 GIT binary patch literal 4236 zcmb7HYj9L&8Gg?0**%-h21vpNLN|1wR6{mtD8Zm%3!i?IfI%6HFQheU;Y_f@B7zy}R{D1?1sl;IwEd^m)U$a=4Q+;3nsj7kiI@KLdGpM2rV z$3nPYwtGW(AdJO$uow^F;Sdgl@JI-c%G<}~anQhH^8Im9J`}yjcGwwf?a)Av zmFqHl(mW~aaFS+vlbN&SJ%6aXefFS+c^w0$ovF{}9M?%Y>H1`DBco`2R+hOD@w;aXlmiH$7##CLK#$@*Wy?a_tfg_cd}}-OOAs?Ui5WvxcIYr z%1zQq!`%PHNCSr>_za#ByQ?B-M~8tU5quV(V^d65TD_h`v)l+ikD~^TMeqf%#B&O+ zy}rrUiN#c1*Ay4i%Odz9o+gKDWpi9~pJ92FuEKdmE@zGi*es8evwQ7~nQn?;BbrH_ z;ifnnqBcGv>#{xq@5EEK8>hIF?2GTQ(s9<)O53~okXJ@EoyEC-GbaU%@F2GYY5)2O@YLrz2P|*%o_> z(nC$;VnJ|S&n_!Td_3Jrc21M=N^AOou7)z)>>1W< zo(1{kP|X?mYf3d-2)zj1-yGxiC`xO-3OyD(*fr|Yj$eJX#{VJ$@(B8y{Vj=?5lW0d ziQ@Axww^)gqQ5Z^4Jf_UiC9A^uI>}{Xh3auRPB(Hmi$qp?rr2*)zGDusNNORcO=HM z&7%Rj8doX__$*4t5n&CGEN=5t+yZrR7d@;(r#cG=Dw8N4B8v4yZV9cgP#R0o zgI4bR^ad6*c$Mb-2JSGhQUhMc>?^3yG~)`bYnNG^=>=FtV^Y}>e%85GO)Ef6OpvZ3 z(lrUzqfqU6s#?4ANbKR?LBp6sBQfk%S=D&PCgZMB^kO`yQUnvORLM=jxHY^RtMg&p zfdF^Fyz?m9D%D^e&mzoSfWP1w6rbW(pQ=VsN$ykrBA!;>pT=9`J$Z|}DD9_CdE(m$ zXs3j?oi(*%h-|JEQ(j>!=oWZ@K|jdE4xkv1q7(;}>A0spnMyfHE<`RS)o*7pd}W$6YK!djWyiMMiOT4sniP)G?LL^ujx3(xSvJ@&ye5G zlG`W9!;`GgbGVaNMT!^0C{E)Eem~6GNUyh0W0dvpRE%8BJ5o68ClMc>MR^T*u;K?47oKiUjO(eEs>9eUIjP*6CwBRD z3PQ0iLAU^>fRd7jFk6)M{99nufA#p)6NQ#v$dG`G9A95&^M3<3#={z}OkJjpr;51Y=TY-?Hh8O-je>8u@Z@i*#G zz3M2cYNL8Xqp)KP(anjniZRUDJgSo(zhek&m$?Nn=CdeZ3Bvdx=iZM9#*b0U{Zjmt zQ~qa@?J}SLv+5!c(o{{HmvXU$+4q}NvXcHB_^xtj1XyGPTcp%X`k%OwIBzA*)J*an zBo;(p+dAup3!#qlsN{H`*C~@B!K-I2!z;UisML`FXAx6?l~JUsY(8_~sbo}kqqh%o zKZdx7mo4B7-~hRQt6X|bL4TtWHN4lOh*bvp5;e}D+J~=U@fd2lMh*J=Rb3@B zN=)_2nf7L(kjm<6mgYFQfuFNtzu+ABB|HDutnhDG;oq{We@{C9fp^*^!uvMKU64}?oHrAiR(@zNk=wFcM$S$}#NH{_X6y<|gqN>_yEWeK MCR*sDB_Hhn07{IN%m4rY literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/protocol/memory/FlashClient.class b/out/production/G-Earth2/main/protocol/memory/FlashClient.class new file mode 100644 index 0000000000000000000000000000000000000000..00d3474edb273276f69fc03de62ab0282b513824 GIT binary patch literal 6832 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 literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/protocol/memory/MemorySnippet.class b/out/production/G-Earth2/main/protocol/memory/MemorySnippet.class new file mode 100644 index 0000000000000000000000000000000000000000..46d3eafc9928f78666b95f707b9d4bbe8b076724 GIT binary patch literal 575 zcmah_%Syvg6r7u;jj7SLzMuHOMO)Bp+$k=qxR7cWm4djst+zF$NlF?8KT1%r2rm2p zKT4dN)`cQS$a%~;Gjq5fpKtE~_OYHt8jCheEa|XpVa39#KqhRr2Pzg2X9DJpjHQ5a zUE$!+3%vMS zz*{iM=&-wDZ!+h~uMp*pA&m0w5UFQE2BsKilCj08={BZGo+iFYB5C~c%(~JxBB}JI zwkeQ3vT>R9EM0y<>WRfjJd=P^iJ&uD7z+x_VvdNu(dG6x*?9a#F8oQJPqr4m06VH) AA^-pY literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/protocol/memory/MemoryUtils.class b/out/production/G-Earth2/main/protocol/memory/MemoryUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..fe37b46760a1563165ec527069c6841897e3b838 GIT binary patch literal 1430 zcmah}OK;Oy7(F+3>fo5Rls2WL?Eu3gNegC%@@xr|@R&kUkP1k^$~A@>Tst@}qI<-D zU3-1fUt<+?zB!ibN#)-ur#$p6`4Q=k4d0uK|qVyopYXnlQ23 zz#bDCZ28)2;xGK2#XgK>u^$KI>!5){5_s6a5d-4}CImVr{LoLz0$QPXSwOEu*FAx* zsvmmO3-hyHe9@T=Xz8g&t`l5#VqczHMm?GH8v@&^^Nt_d^*Bl*Hwx@|Z$63_?V4IH zC4SHtCuJjv{qW{ggS1}ky8?ZM>MiH4V+T%n)1Fb@@#0khL7%8l5pT%AYd`|)XA;M~ zU32P6h=HTT-S7ji5`_t+G@5JzyM7U3EuRdk2h3O?Ef=QL-9#-=yj}Gh2@}xkPBJHu zaa%D2azEB&vA$ZD?LXa~SR1p<@|O)9V=DyAnP?$)z0=Hqp}(u!9+|s^E_7Qsj!6Ma z6~m8giIt8M7AiPt;FN{aI73bg|6q#57S7_Fg(_;K{JDe{wqsgg<2U=Md#+bc{3sOI z^1E*SKzM%kmggn{scURmry^`uja~U>m`c3ZNg}p1n?#j4C!UOBXOVR+6y?=lP6H>h zBZ)4k!siObW*I}KFPm*kI~&u?qHUFxVF#_)bFNPYft+L>ceW;>4O5p}jBUYW%lK`b z?TE_1s-GBR&S^}0_n0-m8aX_nI`pn8R1@7S4AJ@ThfpRyCLf7N8V++>v`;|Y9 z4;u}E4cysW1=n=x8N^d=Qt08kLm9K!$i3ABpcj2SWspNZE%NdMqSIVQODjlKM_wP* z%0q*XF+4Ifc0ljbyZ1hV$>s19q_ySynppbsUSB3&Q!#p=bKgncE{;hjO5~LBa%AnL zz)cuXh*4}tp7udLz0g0yG%zH@f9MyVAU;q*2E+KHrRg2nrKa*LXjhn&zJl~~bks&) zzz~?;{Q?<*hZy8$oxmHINAv-GWChuWNbAc>U;bT!UelJTLH_HFGyDBGq*h(29)>|r zKQ(Wn;sJU$(?3K+9uw3dGbmAa30W3B&s`Ua*otk6v5Y@eF4V`I^VGb9cv;~lY9~?6 aJk$RpXJD6s!th6=P8cL1szh`OBVPg4mO)wo literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/protocol/memory/Rc4Obtainer.class b/out/production/G-Earth2/main/protocol/memory/Rc4Obtainer.class new file mode 100644 index 0000000000000000000000000000000000000000..12b2f390bbf1786d9ae2f1d55ac916f5e70ac203 GIT binary patch literal 7621 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 dLS3o0vFkpd?*MuibRYl# literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/protocol/packethandler/BufferListener.class b/out/production/G-Earth2/main/protocol/packethandler/BufferListener.class new file mode 100644 index 0000000000000000000000000000000000000000..9a3d35d9e08b320c0ecc52f4cfd311e17d8e2ca2 GIT binary patch literal 158 zcmY+8F%H5o5Cr!^h=B@;PXGmOcmV|x5)uUx{b4R4!Pt>;cpL=};86&tq#129+WCB6 zZvbnI6_mn=Fkll2`FyuH5hh391tZ(q3SqYC%2L9MtKmY&$ literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/protocol/packethandler/Handler.class b/out/production/G-Earth2/main/protocol/packethandler/Handler.class new file mode 100644 index 0000000000000000000000000000000000000000..d1627277edfcaf80c683bacb581b1efddc65e151 GIT binary patch literal 3172 zcmb7FYf}?f7=BK&$%e2PK*S3mg4KqA29&l|EFyS;7C{BPp>3CBfz_~^ZZ-<^YSq@> zKK6s{5AaLBI3qf=GmfA8L;52+PVI9xn-DUTvBPlA$=UZj=Xsy^a{m11_vZk5@lzCg za81SaC<3@vg;snhhmYj&u^e8ATm3Di*4- z6;?HDWaaRQ3a1*|k(1l59P)CwC5PK87OT;MB^ApmJ{73R>Ps10PY>p2XAMW7b96yB ztz_1*T{~rGl36`<({Sf?E1fZ%}~fWjHy3t($7gOBDVG*CW^U40$PQ*~UXvCOR|PaPcT#ut0t$bo@{VIz z?ueB(7HKge5S#JXj;^8C7QpkanMulRdHIAnXX$RGlikjBo60$3+2U$WHUJ*r;h4WBG*{!$j}vUJh#m87+0 z4N(R|!ySCh7;3nSBO31EzCg=*<`rq7;TxRM@GTx__)ZSrv1mYWi0YFH%45;(OsMERLOej*5G}sXpqdt+m7inSh1{QT5OvvLb{gX zPK5hDL}R?8ta}xqWhu<-xiMprg|1lM)KIi6<3+nF+Zxidg+>@;A~ECqCRT1I+ex^P zpajgB%VZH`rb+7&pFz33(#Dr)51%y^12S8<8ju;_%}g9`X6|@1)5n{cL7W3JT_AAK zTPIP&bvJrA9^%de1ZlzNGVu%|@dpA|o*}pbB_UQ2N^ljHgDQszKUeW{bOqIk&J}2n zJ;cKt_wxY-wm~6!jDHQN#ZEq#yHQV;-{3RdicjyNzk7<9z zXO;ARgAATP{f$Ne9tXnQ27x7v=B-0MjKI4%>L2cA%sf^ zeK5SmJHeD$d&OW>lmbdkPno)ab!`==bRN$c8{7$7!V?5SNjcE4EYq zpV-*laHYFRGU(pW-N6!q&0C~2zBiFkx>E1O{;|hIVb<08e(hoqKo1p0PbF@I%r!=^ zjB1d4aSy|u-@VkiogNNjgi4K-R?DRoT`WcUKHkR%6hNxdg78bkRE++O=9kz~u}~-l z;lP<4o<|0Fq?iQfaK4}-Nfkn zIEkC8`BcX(e5RVL#H@}eZmZ=v9e41##C$h$_(H9Gslz~C=V(EV7FDyP<1W6E_*!CF zK&!aLErI_0ruoFoR7__hv$VEp75y23uIsjA`!@v=$;P(rW|r!HweBzbo@H*&jNNB| zS+`^f#PYUdE!MZ!EU#d$Rk+fhcZ+7_zUkR&-dxoDvRxCH$Zwmrlc{>H?-t!krfL?q zEWd0zrHbWca!%3Rww;an#+*nD_t3Ed1OE?)b~Vc>72F0qfk<*St1t?}iNE#9EzLbE zT2#419|b0~44OI1!jL<%je#u%bL3U{&Hf1K;Bz zlhK~a7ITRo46LDOpae^uv~FMnWdk-g4Q!!8G6uHc2&CI199awk=Z>;&mP`wMP|t<3 z=RR%JWW3#XzL5atll4XMT8s}DIg|d>vwdnCt9rJ>(r3~No>}BdPu1M1xMnHaETMEq z>e`vyJ#5URkF|q2!k9(mSw+i!!ZS}N$KF*T0%zJowsLWP*;aQ{Yjj4=aV&4PV%BOF z>nB=Rn$73t7Fpgy9r)Y)iP$LCJC`XKRu=wX7fJ7;OZB^u&kJFeBUnIVr0c`3#Unf_zkamKG_(Qvin< z=`=KYo)6%s-$G4e6c-5bBCUp?9ndi>k(3yd^cE6n?Y6}DU+AI{p9iv_P$Eq(-E?^z zu*oYn`Yw(wj4w{SxvYgRN8*vV_A}-u;*m?!U9VxRB)VRrhi1Kdh)v5>LhhnZHOGHK zztTXB`*(3dNwPvS?a?dr{umL@5BAc5CeieMB1%m{WV_DC1pMC)`i2&hI2JIK6g@_! zqvU#p?G199LlOn@dC2t=#!)2^rAvyMT;YBOA2RAFuHhqGBGnk~;bVS=RV_SjYNZsK zLgaw*b_EKhBtGF!2;gt^t-dUA<$$iC#xBqj?kYVs$`@t4YaE9#4U@gjwH!apk8UOY E1)w3^9{>OV literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/protocol/packethandler/OutgoingHandler.class b/out/production/G-Earth2/main/protocol/packethandler/OutgoingHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..444e33137e660058080155a1083c52535e394fe8 GIT binary patch literal 4234 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 literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/protocol/packethandler/PayloadBuffer.class b/out/production/G-Earth2/main/protocol/packethandler/PayloadBuffer.class new file mode 100644 index 0000000000000000000000000000000000000000..a564b77d71918b7872f9561bce71a50a6d42a0e5 GIT binary patch literal 2009 zcmaJ>ZBrXn7(F+eWW#m|uc0lp+Sa#_1Y%!A1VjmKEj0lol}hnLH^~BNmu$LOIuplV z;m3Xw$C-YV&IojDW&G?<(vJ1q-GzWchvB|F_uTV5_nasD=Rd#g0l0>5HS}Pt4c!>m zI84alQ#nkk_)J3-pUYuN4mlOm8Z?Y)xQ-igbyE&s$l;cX84b7brHZ_Yf zF6Rc9|HE->-XkGib<6eZhHJ1mc~c-F@vODI=n_*f>RvV8^AdzR`@H?hH?S&(WeFtm z4~)k~cEhb&*(t{{n)zzOWzL9ey9UospIBAjQ9YXVeNBdsqntQ_XL6ig(ma8#vb|oS z=((nAdX-Su7#}L7p-o}KaW4DQ6&?iOiqyn39&+Ma3DZ_=r)*AJra^zh(rCtt_6CDD ztDcQV+!&Ux*U^X5I(m`NaRC=~yodL7Wbq;8IqGZRiM&AAEar5~V@{yw7!g%`rDFj_ z9e41xjztN+i*E$ZoaD5MB^~#$EHHR9?Hk%jpwr838MW2yTj1e$YWwh3NJPruDLGIMw5-EEJYx7Ov;)6bF<7vT;xZghu;kTq@|5qsa(@l zj%T0LyEDwRW3 zc5&T(h`;}Uzdzu=M82~K6;!BT%{QV8GnvUf&*LQMG`(XAJV zF3Hd?)I1*=Q!5djC0e zvhSe%uK!vu=#{|}zIz`oOL+SFmrP~{ac12?#~v`L-MoXtBXf$g)pJ#(|eh{`!8d&X=O-B?>$FXMj4VZ zu7+Cu)9r!Nv@C-z46%-3ufmj164XUHT=x1%uC8zu;*A8Z@?T-%YxpQgpXDrjJ|b0Z zrHOjMs~)xA=#hY0VC3NPZPH3P;_`Anusz*kiF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/out/production/G-Earth2/main/ui/GEarthController.class b/out/production/G-Earth2/main/ui/GEarthController.class new file mode 100644 index 0000000000000000000000000000000000000000..a22f2d0ec1ea31ee81f67adc2e530e06477ea63b GIT binary patch literal 1776 zcmaJ>Yj4z65IuJj#~Wiv$cuz$mS?g7%&Qa#1WK9^U?GuMkPx4o#Vkf%U*tHH_E&*a zf&@~3Kz~%#GuK{w*(UwsxsN$#X3os@-~W933&1t3J2;4+hcSv9Hf}l?$Tqj+WYNKG z+>zCigS*-4o`YYq)qMxcxFg$N1-4>i)y4w_Yb*8Jfx<-No&Ujq^U*VV@0pw~D(ri^ ztm8OnrJ;@$jx;)c7<=y%o$8j3ytVR@z7ws&mFH=qqbNuePGz9&&@1n~61b|94#DGL z{4NXAi>(#d;@W%Ibx7E=f zq>RIbK&>DSyvYAuZ>QddAB#*wx5GG0mlOu(=3gibF6-CSbfgi+!PD)|W{@=f&4?#s z4c+pi7k(1TK0h2x--cTfz=+GFAFTLED#GU)GJqrep&x~Rkfpj6q^3a%hvtg3q+@yC zB!_CdaGIK%-_1+m0DXFTsBny)|JP#YwUK!g+@}9Giva^v+7EL^g6t|gD z62|RC$;sl-=>KZj3#52y@G%vsWFUW_Ac4QB6J9#c^mft;RzneWvR|)@f^;#9nu{@v zE6nU!lZy#Vx|qTt8*45e;*pDK%-DGB;xLZbXt+3vV>X_+cnZ(u8>}fz@6{=V(K74x zO_^wgTGzW(ypO*5=lHXw8-5bRY1wvZ$KEp`dYV>GnSGWOUaBqjuW&tJ=qL?PjdH|zaK?AS^o-E zS6@)6f5*VfuNeFS>oYGZIK}T62Khb8?>L4@H-Y0g%@a2R;|$Jnr*N(yenq4Z*Xn;_ zsJ;W6wn{rp>(K6_b!qpPL8f2{099r-%COT6G0XbOK(!*!9Og+c6)Z7Og?6aE!0byl z$DFQ^bJZ|RWnMW0{f&N#EOjj8Tpq0?Z85pZCoZz;hs@zxPa;-9a~>CV0bBjx#;)Lt zkcd)6gMApFbwr+p^E)`uU&%U!-!Lq*nP-uLgG;zzE`>p)G;*!81(|mJqujHW7hE1W2j6cg&Eway*eUfqoW95F{3S z03U@oW4nn(#KPAzbMHOp+%xn0&(B`~o}+D{jH7LoaBMN0Sh$D#COjzPVHuAE>N7Wz zq3)|tM=A(pB+wjAT|aadzVrH(8|jO6t|w4>;fKC{DUffUo(mNE>Vp)h4gFBQT};O^ zI&;SXPZ~qzxxu*``DULU7W9Qb7uZ=5j27d8il)TfolE_GLrSZ?D&5dx=q)d!yQ0Db zVI;Lcbt3f}N)M%{eH99{+NTNFEK*u|DsVDsDzH9BzLsZds3rnVdwA)7az9=3Ut7Qv4U zj76?V$Y^ut@NaU(&JT#MT;y@L#eKT{XnBACzJZq>#%zj1;ZHdJcj8SRhGydZ#JKvC7 zqVR=4*|u;@oK$88xs7JbZs88@vYHPv H=0E%ksmrq` literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/ui/bootstrap3.css b/out/production/G-Earth2/main/ui/bootstrap3.css new file mode 100644 index 0000000..a79da42 --- /dev/null +++ b/out/production/G-Earth2/main/ui/bootstrap3.css @@ -0,0 +1,893 @@ +.root { + -fx-body-color : #F5F5F5; + -fx-outer-border : #cecece; +} +.button,.menu-button,.toggle-button,.split-menu-button { + -fx-font-size: 14; + -fx-background-radius: 4; + -fx-border-radius: 4; + -fx-pref-height: 30; + -fx-min-width: 30; +} +.button,.menu-button,.split-menu-button,.toggle-button,.number-button { + -fx-background-insets: 0, 0, -1, 0; +} + +.split-menu-button > .label { + -fx-border-radius: 4 0 0 4; + -fx-background-radius: 3 0 0 3; +} + +.split-menu-button > .arrow-button { + -fx-border-radius: 0 4 4 0; + -fx-background-radius: 0 3 3 0; +} + +.lg { + -fx-min-height: 46; + -fx-max-height: 46; + -fx-font-size: 18; +} + +.sm { + -fx-min-height: 30; + -fx-max-height: 30; +} + +.xs { + -fx-min-height: 22; + -fx-max-height: 22; + -fx-font-size: 10; +} + +.primary .arrow, +.success .arrow, +.info .arrow, +.warning .arrow, +.danger .arrow { + -fx-background-color: transparent, white; +} + +.primary > .label, +.success > .label, +.info > .label, +.warning > .label, +.danger > .label { + -fx-text-fill: white; +} + +.action-btn { + -fx-min-width: 80; +} + +/*positions*/ +/*first*/ +.button.first, .menu-button.first, .toggle-button.first, .text-field.first, .text-area.first { + -fx-border-radius: 4 0 0 4; + -fx-background-radius: 4 0 0 4; +} + +.split-menu-button.first > .arrow-button, .split-menu-button.middle > .arrow-button { + -fx-border-radius: 0; + -fx-background-radius: 0; +} + +VBox > .button.first, +VBox > .menu-button.first, +VBox > .toggle-button.first, +VBox > .split-menu-button.first, +VBox > .text-field.first, +VBox > .text-area.first { + -fx-border-radius: 4 4 0 0; + -fx-background-radius: 4 4 0 0; +} + +VBox > .split-menu-button.first > .label { + -fx-border-radius: 4 0 0 0; + -fx-background-radius: 3 0 0 0; +} +VBox > .split-menu-button.first > .arrow-button { + -fx-border-radius: 0 4 0 0; + -fx-background-radius: 0 3 0 0; +} +/*middle*/ +.middle { + -fx-border-radius: 0; + -fx-background-radius: 0; +} + +/*last*/ +.split-menu-button.middle > .label, .split-menu-button.last > .label { + -fx-border-radius: 0; + -fx-background-radius: 0; +} + +.split-menu-button.last { + -fx-border-radius: 0 4 4 0; + -fx-background-radius: 0 4 4 0; +} + +.button.middle, .text-field.middle, .text-area.middle, .split-menu-button.middle, .toggle-button.middle { + -fx-border-radius: 0; + -fx-background-radius: 0; +} + +.button.last, .text-field.last, .text-area.last, .split-menu-button.last, .toggle-button.last, .menu-button.last { + -fx-border-radius: 0 4 4 0; + -fx-background-radius: 0 4 4 0; +} +VBox > .button.last, +VBox > .menu-button.last, +VBox > .toggle-button.last, +VBox > .split-menu-button.last, +VBox > .text-field.last, +VBox > .text-area.last { + -fx-border-radius: 0 0 4 4; + -fx-background-radius: 0 0 4 4; +} + +VBox > .split-menu-button.last > .label { + -fx-border-radius: 0 0 0 4; + -fx-background-radius: 0 0 0 3; +} +VBox > .split-menu-button.last > .arrow-button { + -fx-border-radius: 0 0 4 0; + -fx-background-radius: 0 0 3 0; +} + +/*button styles*/ + +/*default button settings*/ + +/*bgcolor setting*/ +.color-picker,.date-picker > .arrow-button, +.number-button,.left-arrow-button,.right-arrow-button, +.button,.split-menu-button,.toggle-button,.menu-button, +.font-menu-button, .split-menu-button > .label, .split-menu-button > .arrow-button { + -fx-background-color: white; +} + +.color-picker,.date-picker > .arrow-button, +.button,.menu-button,.toggle-button,.number-button,.left-arrow-button,.right-arrow-button, +.font-menu-button, +.split-menu-button > .label,.split-menu-button > .arrow-button { + -fx-border-color: #cccccc; + -fx-text-fill: #333333; +} +/*just for the special split menu button*/ +.split-menu-button > .label { + -fx-border-width: 1 0 1 1; +} +/*for date picker arrow button*/ +.date-picker > .arrow-button { + -fx-border-radius: 0 4 4 0; +} +.combo-box > .arrow-button, .choice-box > .arrow-button { + -fx-border-width: 0; +} +/*hover state*/ +.color-picker:hover, +.date-picker:hover > .arrow-button, +.combo-box:hover,.choice-box:hover, +.number-button:hover,.left-arrow-button:hover,.right-arrow-button:hover, +.button:hover,.menu-button:hover,.toggle-button:hover, +.font-menu-button:hover, +.split-menu-button > .label:hover, .split-menu-button > .arrow-button:hover { + -fx-background-color: #e6e6e6; + -fx-border-color: #acacac; +} +/*pressed selected*/ +.color-picker:pressed,.color-picker:selected, +.number-button:pressed,.number-button:selected, +.date-picker:pressed > .arrow-button, +.combo-box:pressed > .arrow-button,.combo-box:selected > .arrow-button, +.choice-box:pressed > .arrow-button,.choice-box:selected > .arrow-button, +.font-menu-button:pressed,.font-menu-button:selected, +.left-arrow-button:pressed,.left-arrow-button:selected, +.right-arrow-button:pressed,.right-arrow-button:selected, +.button:pressed, .button:selected,.menu-button:pressed,.menu-button:selected +,.toggle-button:pressed,.toggle-button:selected, +.split-menu-button:pressed > .label, .split-menu-button > .arrow-button:pressed { + -fx-background-color: #e6e6e6; + -fx-border-color: #acacac; + -fx-effect: innershadow(gaussian, #adadad, 10, 0, 0, 3); +} + +/*primary*/ + +.button.primary,.split-menu-button.primary,.toggle-button.primary,.menu-button.primary, +.split-menu-button.primary > .label, .split-menu-button.primary > .arrow-button { + -fx-background-color: #337ab7; +} + +.button.primary,.menu-button.primary,.toggle-button.primary, +.split-menu-button.primary > .label,.split-menu-button.primary > .arrow-button { + -fx-border-color: #2e6da4; + -fx-text-fill: white; +} +/*hover state*/ +.button.primary:hover,.menu-button.primary:hover,.toggle-button.primary:hover, +.split-menu-button.primary > .label:hover, .split-menu-button.primary > .arrow-button:hover { + -fx-border-color: #204d74; + -fx-background-color: #286090; +} +/*pressed selected*/ +.button.primary:pressed, .button.primary:selected, +.menu-button.primary:pressed,.menu-button.primary:selected +,.toggle-button.primary:pressed,.toggle-button.primary:selected, +.split-menu-button.primary:pressed > .label, .split-menu-button.primary > .arrow-button:pressed { + -fx-background-color: #286090; + -fx-border-color: #204d74; + -fx-effect: innershadow(gaussian, #204d74, 10, 0, 0, 3); +} + +/*success*/ + +.button.success,.split-menu-button.success,.toggle-button.success,.menu-button.success, +.split-menu-button.success > .label, .split-menu-button.success > .arrow-button { + -fx-background-color: #5cb85c; +} + +.button.success,.menu-button.success,.toggle-button.success, +.split-menu-button.success > .label,.split-menu-button.success > .arrow-button { + -fx-border-color: #4cae4c; + -fx-text-fill: white; +} +/*hover state*/ +.button.success:hover,.menu-button.success:hover,.toggle-button.success:hover, +.split-menu-button.success > .label:hover, .split-menu-button.success > .arrow-button:hover { + -fx-border-color: #398439; + -fx-background-color: #449d44; +} +/*pressed selected*/ +.button.success:pressed, .button.success:selected, +.menu-button.success:pressed,.menu-button.success:selected +,.toggle-button.success:pressed,.toggle-button.success:selected, +.split-menu-button.success:pressed > .label, .split-menu-button.success > .arrow-button:pressed { + -fx-background-color: #449d44; + -fx-border-color: #398439; + -fx-effect: innershadow(gaussian, #398439, 10, 0, 0, 3); +} + +/*info*/ + +.button.info,.split-menu-button.info,.toggle-button.info,.menu-button.info, +.split-menu-button.info > .label, .split-menu-button.info > .arrow-button { + -fx-background-color: #5bc0de; +} + +.button.info,.menu-button.info,.toggle-button.info, +.split-menu-button.info > .label,.split-menu-button.info > .arrow-button { + -fx-border-color: #46b8da; + -fx-text-fill: white; +} +/*hover state*/ +.button.info:hover,.menu-button.info:hover,.toggle-button.info:hover, +.split-menu-button.info > .label:hover, .split-menu-button.info > .arrow-button:hover { + -fx-border-color: #269abc; + -fx-background-color: #31b0d5; +} +/*pressed selected*/ +.button.info:pressed, .button.info:selected, +.menu-button.info:pressed,.menu-button.info:selected +,.toggle-button.info:pressed,.toggle-button.info:selected, +.split-menu-button.info:pressed > .label, .split-menu-button.info > .arrow-button:pressed { + -fx-background-color: #31b0d5; + -fx-border-color: #269abc; + -fx-effect: innershadow(gaussian, #269abc, 10, 0, 0, 3); +} + +/*warning*/ + +.button.warning,.split-menu-button.warning,.toggle-button.warning,.menu-button.warning, +.split-menu-button.warning > .label, .split-menu-button.warning > .arrow-button { + -fx-background-color: #f0ad4e; +} + +.button.warning,.menu-button.warning,.toggle-button.warning, +.split-menu-button.warning > .label,.split-menu-button.warning > .arrow-button { + -fx-border-color: #eea236; + -fx-text-fill: white; +} +/*hover state*/ +.button.warning:hover,.menu-button.warning:hover,.toggle-button.warning:hover, +.split-menu-button.warning > .label:hover, .split-menu-button.warning > .arrow-button:hover { + -fx-border-color: #d58512; + -fx-background-color: #ec971f; +} +/*pressed selected*/ +.button.warning:pressed, .button.warning:selected, +.menu-button.warning:pressed,.menu-button.warning:selected +,.toggle-button.warning:pressed,.toggle-button.warning:selected, +.split-menu-button.warning:pressed > .label, .split-menu-button.warning > .arrow-button:pressed { + -fx-background-color: #ec971f; + -fx-border-color: #d58512; + -fx-effect: innershadow(gaussian, #d58512, 10, 0, 0, 3); +} + +/*danger*/ + +.button.danger,.split-menu-button.danger,.toggle-button.danger,.menu-button.danger, +.split-menu-button.danger > .label, .split-menu-button.danger > .arrow-button { + -fx-background-color: #d9534f; +} + +.button.danger,.menu-button.danger,.toggle-button.danger, +.split-menu-button.danger > .label,.split-menu-button.danger > .arrow-button { + -fx-border-color: #d43f3a; + -fx-text-fill: white; +} +/*hover state*/ +.button.danger:hover,.menu-button.danger:hover,.toggle-button.danger:hover, +.split-menu-button.danger > .label:hover, .split-menu-button.danger > .arrow-button:hover { + -fx-border-color: #ac2925; + -fx-background-color: #c9302c; +} +/*pressed selected*/ +.button.danger:pressed, .button.danger:selected, +.menu-button.danger:pressed,.menu-button.danger:selected +,.toggle-button.danger:pressed,.toggle-button.danger:selected, +.split-menu-button.danger:pressed > .label, .split-menu-button.danger > .arrow-button:pressed { + -fx-border-color: #ac2925; + -fx-background-color: #c9302c; + -fx-effect: innershadow(gaussian, #ac2925, 10, 0, 0, 3); +} + +.menu-item { + -fx-min-width: 200; +} + +.menu-item:focused { + -fx-background-color: #f5f5f5; +} + +.menu-item:focused > * { + -fx-text-fill: #262626; +} +.menu-item:focused .arrow { + -fx-background-color: #333333; +} + +.check-menu-item:checked:hover > .left-container > .check, +.check-menu-item:checked:focused > .left-container > .check, +.radio-menu-item:checked:hover > .left-container > .radio, +.radio-menu-item:checked:focused > .left-container > .radio { + -fx-background-color: #333333; +} + +.context-menu { + -fx-border-radius: 4; + -fx-background-radius: 4; + -fx-border-color: #bebec0; +} + +.context-menu > * { + -fx-padding: 5 0 5 0; +} + +.separator { + -fx-padding: 5 0 5 0; +} + +.text-field { + -fx-pref-height: 30; +} + +.combo-box, .choice-box { + -fx-background-insets: 0; + -fx-border-color: #cecece; + -fx-padding: -1; + -fx-border-width: 1; +} +.combo-box, .choice-box, .color-picker, .date-picker { + -fx-border-radius: 4; + -fx-background-radius: 4; + -fx-pref-height: 30; +} + +.combo-box:editable > .arrow-button { + -fx-background-color: white; +} + +.combo-box:editable > .arrow-button:hover { + -fx-background-color: #e6e6e6; +} + +.combo-box:editable > .arrow-button:pressed { + -fx-effect: innershadow(gaussian, #adadad, 10, 0, 0, 3); +} + +.combo-box > .text-input, .date-picker > .text-input { + -fx-background-radius: 4 0 0 4; + -fx-border-width: 0; +} + +.text-field, .text-area { + -fx-border-color: #cccccc; + -fx-background-color: white; + -fx-border-radius: 4; + -fx-background-radius: 4; + -fx-effect: innershadow(gaussian, transparent, 0, 0, 0, 0); +} + +.text-field:focused, .text-area:focused { + -fx-border-color: #66afe9; + -fx-effect: dropshadow(gaussian, #66afe9, 10, 0, 0, 0); +} + +.text-area .scroll-pane, .text-area .scroll-pane .content { + -fx-background-color: white; + -fx-background-radius: 4; +} + +.tab-pane .tab-header-background { + -fx-background-color: #f4f4f4; +} +.tab-pane.plain .tab-header-background { + -fx-background-color: transparent; +} + +.tab-pane .tab-header-area .tab { + -fx-border-radius: 4 4 0 0; + -fx-background-radius: 5 5 0 0; + -fx-background-color: transparent; + -fx-border-color: transparent; + -fx-padding: 3 10 5 10; + -fx-background-insets: 0; +} + +.tab-pane .tab-header-area .tab .tab-label { + -fx-text-fill: #337ab7; +} + +.tab-pane .tab-header-area .tab:hover { + -fx-background-color: #eeeeee; +} + +.tab-pane .tab-header-area .tab:selected { + -fx-focus-color: transparent; + -fx-border-color: #dddddd #dddddd white #dddddd; + -fx-background-color: white; +} +.tab-pane .tab-header-area .tab:selected .tab-label { + -fx-text-fill: #333333; +} +.tab-pane > .tab-content-area { + -fx-background-color: white; +} + +.tab-pane .tab-header-area .tab .tab-label { + -fx-focus-color: transparent; +} + +.tab-pane:focused > .tab-header-area > .headers-region > .tab:selected .focus-indicator { + -fx-border-color: transparent; +} + +.tab-pane > .tab-header-area > .headers-region > .tab > .tab-container > .tab-close-button { + -fx-background-color: #337ab7; +} +.tab-pane > .tab-header-area > .headers-region > .tab:selected > .tab-container > .tab-close-button { + -fx-background-color: #333333; +} +.tab-pane > .tab-header-area > .headers-region > .tab > .tab-container > .tab-close-button:hover { + -fx-background-color: red; + -fx-cursor: hand; +} + +.scroll-bar { + -fx-background-color: transparent; + -fx-background-radius: 0; + -fx-block-increment: 50; +} + +.corner { + -fx-background-color: transparent; +} + +.scroll-bar .decrement-button, .scroll-bar .decrement-arrow { + visibility: hidden; + -fx-pref-height: 1; + -fx-pref-width: 1; +} + +.scroll-bar .increment-button, .scroll-bar .increment-arrow { + visibility: hidden; + -fx-pref-height: 1; + -fx-pref-width: 1; +} + +.scroll-bar:vertical { + -fx-pref-width: 10; +} + +.scroll-bar:horizontal { + -fx-pref-height: 10; +} + +.scroll-bar:horizontal .track, +.scroll-bar:vertical .track { + -fx-background-color: transparent; + -fx-border-color: transparent; + -fx-background-radius: 5; +} + +.scroll-bar:vertical .track-background, +.scroll-bar:horizontal .track-background { + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-background-radius: 5; +} + +.scroll-bar:horizontal .thumb { + -fx-background-color: #c9c9c9; + -fx-background-insets: 2 0 2 0; + -fx-background-radius: 5; +} + +.scroll-bar:vertical .thumb { + -fx-background-color: #c9c9c9; + -fx-background-insets: 0 2 0 2; + -fx-background-radius: 5; +} + +.scroll-bar:horizontal .thumb:hover, +.scroll-bar:vertical .thumb:hover { + -fx-background-color: #b5b5b5; +} + +.scroll-bar:horizontal .thumb:pressed, +.scroll-bar:vertical .thumb:pressed { + -fx-background-color: #a0a0a0; +} + +.scroll-bar:vertical .increment-button, .scroll-bar:vertical .decrement-button { + -fx-background-color: transparent; + -fx-background-radius: 5; + -fx-padding: 5; +} + +.scroll-bar:horizontal .increment-button, .scroll-bar:horizontal .decrement-button { + -fx-background-color: transparent; + -fx-background-radius: 5; + -fx-padding: 5; +} + +.scroll-bar:vertical:focused, +.scroll-bar:horizontal:focused { + -fx-background-color: transparent, rgb(96, 96, 96), rgb(96, 96, 96); +} + +.menu-bar { + -fx-background-color: white; +} +.menu-bar > .container > .menu-button { + -fx-background-radius: 0; + -fx-background-insets: 0; + -fx-border-width: 0; + -fx-border-radius: 0; +} +.menu-bar > .container > .menu-button:hover, +.menu-bar > .container > .menu-button:showing { + -fx-background-color: #56c0e0; +} + +.color-palette { + -fx-background-color: white; +} + +.pagination > .pagination-control > .control-box { + -fx-spacing: -1; +} +.pagination > .pagination-control > .control-box > .left-arrow-button { + -fx-border-radius: 3 0 0 3; + -fx-border-insets: 0 0 0 7; + -fx-background-insets: 0 0 0 7, 0 0 0 5, 1 1 1 6, 2 2 2 7; +} +.pagination > .pagination-control > .control-box > .right-arrow-button { + -fx-border-radius: 0 3 3 0; + -fx-border-insets: 0 7 0 0; + -fx-background-insets: 0 7 -1 0, 0 5 0 0, 1 6 1 1, 2 7 2 2; +} +.pagination > .pagination-control > .control-box > .number-button { + -fx-background-radius: 0; + -fx-border-radius: 0; +} + +.progress-bar > .track { + -fx-pref-height: 10; + -fx-background-radius: 3; + -fx-effect: innershadow(gaussian, #e4e4e4, 4, 0, 0, 1); + -fx-background-color: #f5f5f5; +} + +.progress-bar > .bar { + -fx-background-insets: 0; + -fx-background-color: #337ab7; +} + +.progress-bar.success > .bar { + -fx-background-insets: 0; + -fx-background-color: #5cb85c; +} + +.progress-bar.info > .bar { + -fx-background-insets: 0; + -fx-background-color: #5bc0de; +} + +.progress-bar.warning > .bar { + -fx-background-insets: 0; + -fx-background-color: #f0ad4e +} + +.progress-bar.danger > .bar { + -fx-background-insets: 0; + -fx-background-color: #d9534f; +} + +.tooltip { + -fx-background: white; + -fx-text-fill: #333333; + -fx-background-color: white; + -fx-background-radius: 4px; + -fx-border-radius: 4px; + -fx-border-color: #C0C0C0; + -fx-background-insets: 0; + -fx-padding: 0.667em 0.75em 0.667em 0.75em; /* 10px */ + -fx-effect: dropshadow(three-pass-box, rgba(0, 0, 0, 0.5), 10, 0.0, 0, 3); + -fx-font-size: 0.85em; +} + +.tooltip.success { + -fx-background: #dff0d8; + -fx-background-color: #dff0d8; + -fx-text-fill: #99bb96; + -fx-border-color: #d6e9c6; +} + +.tooltip.info { + -fx-background: #d8ecf6; + -fx-background-color: #d8ecf6; + -fx-text-fill: #31708f; + -fx-border-color: #bce8f1; +} + +.tooltip.warning { + -fx-background: #fcf8e3; + -fx-background-color: #fcf8e3; + -fx-text-fill: #8a6e3c; + -fx-border-color: #faebcc; +} + +.tooltip.danger { + -fx-background: #f2dede; + -fx-background-color: #f2dede; + -fx-text-fill: #a94442; + -fx-border-color: #ebccd1; +} + +.titled-pane > .title { + -fx-background-color: #f5f5f5; + -fx-border-color: #dddddd; + /*-fx-background-insets: 5, 1, 5;*/ + -fx-background-radius: 3 3 0 0, 2 2 0 0, 1 1 0 0; + -fx-border-radius: 3 3 0 0, 2 2 0 0, 1 1 0 0; + -fx-padding: 11 +} + +.titled-pane > .content { + -fx-background-color: white; + -fx-background-radius: 0 0 4 4; + -fx-border-radius: 0 0 4 4; + -fx-border-color: #dddddd; + /*-fx-padding: -11;*/ +} + +.titled-pane.primary { + -fx-text-fill: white; +} + +.titled-pane.primary > .title { + -fx-background-color: #337ab7; + -fx-border-color: #337ab7; +} + +.titled-pane.primary > .content { + -fx-border-color: #337ab7; +} + +.titled-pane.success .arrow, +.titled-pane.info .arrow, +.titled-pane.warning .arrow, +.titled-pane.danger .arrow { + -fx-background-color: -fx-mark-highlight-color, -fx-mark-color; +} + +.titled-pane.success { + -fx-text-fill: #3c763d; +} + +.titled-pane.success > .title { + -fx-background-color: #dff0d8; + -fx-border-color: #d6e9c6; +} + +.titled-pane.success > .content { + -fx-border-color: #d6e9c6; +} + +.titled-pane.info { + -fx-text-fill: #31708f; +} + +.titled-pane.info > .title { + -fx-background-color: #d9edf7; + -fx-border-color: #bce8f1; +} + +.titled-pane.info > .content { + -fx-border-color: #bce8f1; +} + +.titled-pane.warning { + -fx-text-fill: #8a6d3b; +} + +.titled-pane.warning > .title { + -fx-background-color: #fcf8e3; + -fx-border-color: #faebcc; +} + +.titled-pane.warning > .content { + -fx-border-color: #faebcc; +} + +.titled-pane.danger { + -fx-text-fill: #a94442; +} + +.titled-pane.danger > .title { + -fx-background-color: #f2dede; + -fx-border-color: #eacbd0; +} + +.titled-pane.danger > .content { + -fx-border-color: #eacbd0; +} + +.accordion > .titled-pane > .title, +.accordion > .titled-pane > .content { + -fx-background-radius: 0; + -fx-border-radius: 0; +} + +.tool-bar:vertical { /* left */ + -fx-border-color: transparent #dddddd transparent transparent; +} + +.tool-bar { /* top */ + -fx-background-color: white; + -fx-border-color: transparent transparent #dddddd transparent; +} + +.tool-bar:vertical { + -fx-background-insets: 0, 0 1 0 0; +} + +/*table view columns*/ +.filler,.column-header,.show-hide-columns-button { + -fx-background-color: #dddddd, white, white; +} +.show-hide-columns-button { + -fx-border-width: 0; + -fx-background-insets: 0 0 1 1; +} +.column-header:hover,.show-hide-columns-button:hover { + -fx-background-color: #dddddd, white, #f8f8f8; +} +.column-header-background > .filler { + -fx-border-color: transparent #dddddd transparent transparent; + -fx-border-insets: 0 1 0 0; +} +.column-drag-header { + -fx-background-color: #2fb254; +} + +/*split pane*/ +.split-pane > .split-pane-divider { + -fx-background-color: white; + -fx-border-color: #eeeeee; + -fx-pref-width: 8; +} +.split-pane:horizontal > .split-pane-divider { + -fx-background-insets: 0, 0 1 0 1; + -fx-border-width: 0 1 0 1; +} +/* vertical the two nodes are placed on top of each other. */ +.split-pane:vertical > .split-pane-divider { + -fx-background-insets: 0, 1 0 1 0; + -fx-border-width: 1 0 1 0; +} +.split-pane > .split-pane-divider:hover { + -fx-background-color: #E0E0E0; +} + +/******************************************************************************* + * * + * CheckBox * + * * + ******************************************************************************/ +.check-box > .box { + -fx-background-radius: 3; + /*-fx-padding: 0.166667em 0.166667em 0.25em 0.25em; !* 2 2 3 3 *!*/ + -fx-padding:0; + -fx-border-color: #56c0e0; + -fx-border-radius: 3; + -fx-background-color: white; +} +.check-box > .box > .mark { + -fx-background-color: null; + -fx-padding: 0.416667em 0.416667em 0.5em 0.5em; /* 5 5 6 6 */ + -fx-shape: "M927.936 272.992l-68.288-68.288c-12.608-12.576-32.96-12.576-45.536 0l-409.44 409.44-194.752-196.16c-12.576-12.576-32.928-12.576-45.536 0l-68.288 68.288c-12.576 12.608-12.576 32.96 0 45.536l285.568 287.488c12.576 12.576 32.96 12.576 45.536 0l500.736-500.768c12.576-12.544 12.576-32.96 0-45.536z"; + -fx-background-insets: -3 -3 1 0; +} +.check-box { + -fx-label-padding: 0.2em 0.0em 0.3em 0.416667em; /* 0 0 0 5 */ + -fx-text-fill: -fx-text-background-color; + -fx-padding: 0 0 2 0; +} +.check-box:indeterminate > .box { + -fx-padding: 0; +} +.check-box:selected > .box > .mark { + -fx-background-color: linear-gradient(to bottom, #56c0e0, #40b8dc); +} + +/******************************************************************************* + * * + * RadioButton * + * * + ******************************************************************************/ + +.radio-button { + -fx-label-padding: 0.0em 0.0em 0.1em 0.416667em; /* 0 0 0 5 */ + -fx-text-fill: -fx-text-background-color; + -fx-padding: 0 0 .5 0; +} +.radio-button > .radio, +.radio-button:focused > .radio { + -fx-border-color: #56c0e0; + -fx-border-radius: 1em; + -fx-background-radius: 1.0em; /* large value to make sure this remains circular */ + -fx-padding: 1 2 3 2; + -fx-background-color: white; +} +.radio-button > .radio > .dot { + -fx-background-color: transparent; + -fx-background-radius: 1.0em; /* large value to make sure this remains circular */ + -fx-padding: 0.333333em; /* 4 -- radius of the inner black dot when selected */ + -fx-background-insets: 3 2 1 2; +} +.radio-button:selected > .radio,.radio-button:hover > .radio { + -fx-fill-color: #56c0e0; +} +.radio-button:pressed > .radio { + -fx-background-color: #50c0e2; +} +.radio-button:selected > .radio > .dot { + -fx-background-color: #56c0e0; +} + +/*common things*/ +.check-box:hover > .box, +.check-box:selected > .box, +.radio-button:hover > .radio, +.radio-button:selected > .radio { + -fx-background-color: linear-gradient(to bottom, white, #efefef); +} + +.check-box:pressed > .box, +.radio-button:pressed > .radio { + -fx-background-color: #50c0e2; +} \ No newline at end of file diff --git a/out/production/G-Earth2/main/ui/connection/Connection.fxml b/out/production/G-Earth2/main/ui/connection/Connection.fxml new file mode 100644 index 0000000..d4590b8 --- /dev/null +++ b/out/production/G-Earth2/main/ui/connection/Connection.fxml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/out/production/G-Earth2/main/ui/connection/ConnectionForm.class b/out/production/G-Earth2/main/ui/connection/ConnectionForm.class new file mode 100644 index 0000000000000000000000000000000000000000..588bd51a9cc9c3d7fdb1eb97df02370e538807e3 GIT binary patch literal 5218 zcmb7I2YlS*75~di=d(O=0n-FSmIG&JIF1=1=L8(bCYL&Piru6Mg;aN^*h*ySs?&u8 zXzAX2m(WrQ#k3`Dp>PSI(7h<#rF*7(@7*fkj~{&) zz(q=%ihWUBj_Vq+9{c5SAd2g8LligSSuv74FN){m1+w-+6)%e5#Sy%u2`|OVg!bhT zydr{E%I>S8cr{)V<>G5&Q1FH*A8!;cZ;Im0c#BNms^aDtYVfuw=Hcz~xK)t5b96!e{%y5HaKv2=T~XWVm5 zdor<}97NhCCr4?~lxGh*wr!+2Ij=gi4SCOVY#xhPDQn!*J<9E((~iHDw+y)_GHAPQj9qY2CDY@}}S@Mw*UID2u~k$DO7EQ4wV7mU%td zH97WH-8F1)+#n>eGCsS~mYLpbWQbF|Xq2&!ggpa3-ys<%MAas}yr5wI$%z#-6VLSC zEqXT8`&>((PG$7Y6UBD+5f-oI!Yo;sHKc*YTV*qijAice_xBtE6$ z(;7a5&njr!;5c5+bM@>N!<%w4xz+|e(uO^)Dn6&-QG8y-7c_hkU()bpe1-HPvGN|% zr+usVC+{`At9n&@Rm0ctn1+oQP%vjwpEg$5*2*b8m2y_5o$2CQK387T@O6Ac#Wyv4 zOVs@~zSD*bRrs!k@8SCzet;ip_z{k&__2nc;HMgXhM&(;W@5@U^h_JZcA%+S8)5icj1fCu_1W>N;dlO#-^-CdsQ9CXKgp>-W4DIC;IA64#3tU3QO8>t-drQ2 z;%^%Mj(=zv!Z348=o30jLlT>rRW&?W-t_}1rcw?6#BOHGkj%(v_!o{TIOmB_ZpfQf z#&9+K8~@SpUpy|4;~M!L(-cK`v~Sm$AneJ7yB)Wv4{u%3w%GxvV9{xl4)a)%W;~yg zkYeILX*2~_G1Q!u;fax};9Rlkgqjf~Zsx11yTyt^h$anhC}Vn#t6*`wt9U_X7of_F zeSTGjB?<+a$Naw4b+U%*F`dWDOat9{XZ)?OC>1FaQKd$yWm#A1m_DV|br!4pzYRo;FsB$!Fhm}Yui zS~i=>)e6c_W%d&GRA^DC(8-Bd4XMq5Wib}xR|gfqkGiqc9_uwm1cMxuq%E2@VS$*z-^f`s_Eo^g_sc4Baf z{mK8~SHEks2?m((mLH9ebU z=cW6-+g3~Wn1q=wBZOy!!9&oSN5>|14UUbD4h>EWZDi@r8Qw-S7qo|U@ttDv{Hl@d z_p5XX4+O5R>NFm2tY9yJ5j3|l3OZNzsB~=uRW)p8tB!aw$VHXj59_<;Td41d%Be0DNvQg*Eq}v(G$aMyki3%Tv z7FDdwIyiA4YgCe-`DP&U)MqPk3^@<#mNjmAMnY9unUzlfq?$bn{2~|lZ2s`7h|JszJMIIF=RN9@67&DpSUPm!+1f3scj-)vX>Gi((3j*xMZ0A->0mZFW*=j3qkzuYhO@G!*OoNhR?@UTw6~?ZfVtH1EYb1oGUveNUNjT4GN+ajr|oze zEfwVM;8(rivzZFk-i*t->j<9D)whZmvNsVwbO7d!Rw69d#kiPU?3xPuHPlT~k|) zT+&culW)aqm{e`5s}$M?$_X2 z|6E%rU1X}L*{ot$9mO(1gkm?7X)QOk?&ZslGN5q;i_3sF_)L0z)(Zo=k~ta-?DqFH zOmb91zDzd(UnLRpJ+$mzEV&bFB~WS$=oHk$_tMw}1zgC5c&w{{ZVr~kmKU&sgO&bZ z21}Ovr#raR!ie)vhwpf-hlj|0Rlt2|tT*7cEC6tI$mv1!?Kq5!g2jsqxI|cATEH6a z^YmqR()9bVG`5zf#qa>*&4_Wlnwa$w+lz1xF2+J!!ic_ldtRC6G+x0g!ks z1hSV}()2K1*Kro_IEcoMSmHLQbu&Jy{WH+E$PNkngTU#;g;XyvD!7=7(83Vz#0A{x zL>x=8iX&07n}O595ZViiVH9VWUxR5sD0@qa_tHd%s!2etMg4JRpIQ}J70=`cxC(cW z|HrvkTCCxMa-1Q{fshGRE<%kwQq>@jG~eZ*|Y+x@dG0X`h4V W@?S=;!|VAkqk{zbU^u!R2mc37!gCk^ literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/ui/injection/Injection.fxml b/out/production/G-Earth2/main/ui/injection/Injection.fxml new file mode 100644 index 0000000..fda9bd9 --- /dev/null +++ b/out/production/G-Earth2/main/ui/injection/Injection.fxml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/out/production/G-Earth2/main/ui/injection/InjectionForm.class b/out/production/G-Earth2/main/ui/injection/InjectionForm.class new file mode 100644 index 0000000000000000000000000000000000000000..5279aefeeb424c6c77f19bb4bc68e00733fedf74 GIT binary patch literal 4590 zcma)A_kR=T9e!S~ljQ?DF4&kUz);%^v68eHC|KCBsW1*UPEFd9lXSKZpYN2@$v~4f zT}gMknGA(v zdGsb>&}es2&^g>E*k8~ zyRL0fLr5fH8oEUv>-HFy;qDWt?&us9s7crvoqi<^OCQWnr*vmTOPQoJC+)Omj%tn} zp95lzJ89$u)+VPl!;0sPxM7{t(=w3wKylY+JJU4XU|U0)LzBZ2nMgjH(Omu503FB% zXtnxUvX1TAX~NX+!${dh!!CIaYgx~%hxP3WJ|eIr9R7*4X%P1eVdyC0pwG}^{D9|D zuiSUbARDw2L16innP)BdXq7B1F}3MbMr#iR)xJ|;<*eb9u35SGkyMT+BLVa5)_U#; zv=uGR<6^9VW-D)+?K|i|1xwo%JS0#{R9v2nI$&A4lQ6YhPUm6tcFe^wVUxj&xZM-! zz9xeNDPo(Mz(R1orIVSbk?fX!Dqt@QVVgj7*v>m?z0dISs4OwI$^ucb2YXd~6b~~) zdu-dyxsH}Sth22f^EJIeIp4lDi)6AT%;F5|j z;{uVs$u6tMA~lfap~5UFlXgNctWgSMhz^${bhm1fEp!eC!su zuFS^~C(pyLU$5)ic5U00VyY|)nH)TpOooj7K$`v`o>K556+gyL1X_lNV_Wvc{Njt9 zGTg}+J&mdODV|pG44zW)GmkG(k*^7RiTKY|`~tsJ@GBL+#&1*{^r*jO=etHjV23Gk z4Chm_MF^~@*ew0tRn%BI%(*Ejuy{gu`%7fm20E{t>D^KM4!@Tj{0}UloGhipB+pUy zkG`OUuF}xvYW7m!SCBMvF5A7s#?>|_1H<06Xc@o0%B2K0&Mn|dx@Co~st8zdx-cp^ zJcb-Qt2^!)feykENceq+V0y2D)GcxnnH~6}H_K);(~y07p_r7ZAFu*(j)M>;?PW|? z@Im(IOr|L1VNxbmQMbfIVG>9L*f@i5!_~4lN<27KVIe_IILtv=d&P*&8R z2(**u4e!Q6 zFw>x0!M_DI%mbuSJOZn)&WE+cekXtV)bf`OuP)pPdG+vC-X*-1W8PbN3*cH$4&IFT zy^l|Eu7YcA*LjFXxT(Sm_+94_7h^y7s?UG}=;2ch60^cXiDe4=SWHGV#$FPEJ7PrVP#1B>Ogyy9QM>n*TkLVt|I?4mry_ED~+BI1lglts;p3uyEo=h1{>?zJOJ}r0048 zYtA9|FqE3JsHrYsE!C`(G0l5%7Kc1@>x*{V=iA-j+uAtaR!yK zh!LB$+^xeVtj8EOz`;h`i%#5!E<8l)Wo*Hd*ovpI-9xX%M<_tAk=MRn^bxEG6?)vhRI4mLBT)=a?&Y`1- zdMBeNO``6B+*LaMW~z}t+8ddtt<2J0%+LL##C+vJ5Hy3s7^LY&1~0>rNp@tR&TOJH zn~TnDxt24#X{4LZ?4dJz7v@Y;m27SSGCf>njz*d7TY(FRm%@#DZ`xRJD?(=#oeeXJ zqZo#uKK98#U$`8%l~noVxZG1yR*n>AyA6cHtNdSMlz(*GvcC;~!$0wN)_#igE+#{oycy{H$eoF4 Qe&p_cJiw2?`ylTBKcIxXLjV8( literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/ui/logger/Logger.fxml b/out/production/G-Earth2/main/ui/logger/Logger.fxml new file mode 100644 index 0000000..d96cbcc --- /dev/null +++ b/out/production/G-Earth2/main/ui/logger/Logger.fxml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/out/production/G-Earth2/main/ui/logger/LoggerForm.class b/out/production/G-Earth2/main/ui/logger/LoggerForm.class new file mode 100644 index 0000000000000000000000000000000000000000..d13b757895271f7f780138f1028d6e6f22ae3255 GIT binary patch literal 9446 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 literal 0 HcmV?d00001 diff --git a/out/production/G-Earth2/main/ui/tools/Tools.fxml b/out/production/G-Earth2/main/ui/tools/Tools.fxml new file mode 100644 index 0000000..362b480 --- /dev/null +++ b/out/production/G-Earth2/main/ui/tools/Tools.fxml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/out/production/G-Earth2/main/ui/tools/ToolsForm.class b/out/production/G-Earth2/main/ui/tools/ToolsForm.class new file mode 100644 index 0000000000000000000000000000000000000000..c2c80ed3475b36be7633e4aebe4b96159d1a0232 GIT binary patch literal 5367 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 { try { OutgoingHandler handler = new OutgoingHandler(habbo_server_out); + rc4Obtainer.setOutgoingHandler(handler); while (!client.isClosed() && (state == State.WAITING_FOR_CLIENT || state == State.CONNECTED)) { byte[] buffer; @@ -179,6 +183,7 @@ public class HConnection { new Thread(() -> { try { IncomingHandler handler = new IncomingHandler(client_out); + rc4Obtainer.setIncomingHandler(handler); while (!habbo_server.isClosed() && (state == State.CONNECTED || state == State.WAITING_FOR_CLIENT)) { byte[] buffer; diff --git a/src/main/protocol/HPacket.java b/src/main/protocol/HPacket.java index a47dcdd..ade4ca2 100644 --- a/src/main/protocol/HPacket.java +++ b/src/main/protocol/HPacket.java @@ -21,12 +21,14 @@ public class HPacket { packetInBytes = fromStringToBytes(fromExpressionToString(packet)); } public HPacket(int header) { - packetInBytes = new byte[]{0,0,0,4,0,0}; + packetInBytes = new byte[]{0,0,0,2,0,0}; replaceUShort(4, header); + isEdited = false; } public HPacket(int header, byte[] bytes) { - packetInBytes = new byte[4]; + this(header); appendBytes(bytes); + isEdited = false; } public String toString() { diff --git a/src/main/protocol/crypto/RC4.java b/src/main/protocol/crypto/RC4.java index 1c67547..e062291 100644 --- a/src/main/protocol/crypto/RC4.java +++ b/src/main/protocol/crypto/RC4.java @@ -35,6 +35,10 @@ package main.protocol.crypto; import main.protocol.HPacket; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** * This is a simple implementation of the RC4 (tm) encryption algorithm. The * author implemented this class for some simple applications @@ -111,6 +115,17 @@ public class RC4 { } + public RC4(byte[] state, int x, int y) { + this.x = x; + this.y = y; + this.state = state; + } + + //copyconstructor + public RC4 deepCopy() { + return new RC4(Arrays.copyOf(state, 256), x, y); + } + /** * RC4 encryption/decryption. * @@ -169,36 +184,100 @@ public class RC4 { return result; } + public void undoRc4(byte[] buf) { + + byte tmp; + + for (int i = buf.length - 1; i >= 0; i--) { + + tmp = state[x]; + state[x] = state[y]; + state[y] = tmp; + + y = (y - (state[x] & 0xff)) & 0xff; + x = (x - 1) & 0xff; + } + + } + public void printKey() { System.out.println(new HPacket(state).toString()); } + + private static void printState(byte[] booleans) { + StringBuilder builder = new StringBuilder("state: "); + for (byte bool : booleans) { + builder.append(bool); + builder.append(","); + } + System.out.println(builder); + } + public static void main(String[] args) { + byte[] sharedKey = new byte[27]; - + List allbytesEncrypted = new ArrayList<>(); RC4 p1 = new RC4(sharedKey); - RC4 p2 = new RC4(sharedKey); - p1.printKey(); - p2.printKey(); - byte[] enc = p1.rc4("hallo".getBytes()); - System.out.println(new String(p2.rc4(enc))); + System.out.println("original:"); + printState(p1.state); + System.out.println("x: " + p1.x + ", y: " + p1.y); - p1.printKey(); - p2.printKey(); + byte[] enc1 = p1.rc4("hallo dit istoch wel redelijk veel tekst ofzo denk k".getBytes()); + for (int i = 0; i < enc1.length; i++) { + allbytesEncrypted.add(enc1[i]); + } - enc = p1.rc4("hallo".getBytes()); - System.out.println(new String(p2.rc4(enc))); + byte[] enc2 = p1.rc4("dit is ook redelijk wa tekst maar mag nog veel meer zijn eigelijk in principe hoor".getBytes()); + for (int i = 0; i < enc2.length; i++) { + allbytesEncrypted.add(enc2[i]); + } - p1.printKey(); - p2.printKey(); + System.out.println("-----------"); + System.out.println("after being sent:"); + printState(p1.state); + System.out.println("x: " + p1.x + ", y: " + p1.y); - enc = p1.rc4("meneeeer dit zijn echt veel meer dan 27 characters dus latne we dit even proberen".getBytes()); - System.out.println(new String(p2.rc4(enc))); - p1.printKey(); - p2.printKey(); + byte[] allencrypted = new byte[allbytesEncrypted.size()]; + for (int i = 0; i < allbytesEncrypted.size(); i++) { + allencrypted[i] = allbytesEncrypted.get(i); + } + + p1.undoRc4(allencrypted); + + System.out.println("-----------"); + System.out.println("after undo:"); + printState(p1.state); + System.out.println("x: " + p1.x + ", y: " + p1.y); + + +// byte[] sharedKey = new byte[27]; +// +// RC4 p1 = new RC4(sharedKey); +// RC4 p2 = new RC4(sharedKey); +// +// p1.printKey(); +// p2.printKey(); +// byte[] enc = p1.rc4("hallo".getBytes()); +// System.out.println(new String(p2.rc4(enc))); +// +// p1.printKey(); +// p2.printKey(); +// +// enc = p1.rc4("hallo".getBytes()); +// System.out.println(new String(p2.rc4(enc))); +// +// p1.printKey(); +// p2.printKey(); +// +// enc = p1.rc4("meneeeer dit zijn echt veel meer dan 27 characters dus latne we dit even proberen".getBytes()); +// System.out.println(new String(p2.rc4(enc))); +// +// p1.printKey(); +// p2.printKey(); } // public static void main(String[] args) { diff --git a/src/main/protocol/memory/FlashClient.java b/src/main/protocol/memory/FlashClient.java index fb06315..0276472 100644 --- a/src/main/protocol/memory/FlashClient.java +++ b/src/main/protocol/memory/FlashClient.java @@ -4,34 +4,15 @@ import main.irrelevant.Timer; import java.io.*; import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; public class FlashClient { - - public class MemorySnippet { - long offset; - byte[] data; - - public MemorySnippet(long offset, byte[] data) { - this.offset = offset; - this.data = data; - } - - public byte[] getData() { - return data; - } - - public long getOffset() { - return offset; - } - } - private int PID; private List maps; + private static final boolean DEBUG = false; + public static FlashClient create() { File folder = new File("/proc"); FlashClient client = null; @@ -52,7 +33,7 @@ public class FlashClient { } while (client == null); - System.out.println("* Found flashclient process: " + client.PID); + if (DEBUG) System.out.println("* Found flashclient process: " + client.PID); return client; } public void refreshMemoryMaps() { @@ -85,7 +66,7 @@ public class FlashClient { e.printStackTrace(); } - System.out.println("* Found memory maps (amount: " + maps.size() + ")"); + if (DEBUG) System.out.println("* Found memory maps (amount: " + maps.size() + ")"); } public List createMemorySnippetList () { @@ -102,254 +83,74 @@ public class FlashClient { return result; } public void fetchMemory(List snippets) { - String memoryPath = "/proc/" + PID + "/mem"; for (MemorySnippet snippet : snippets) { - long begin = snippet.offset; - try { - RandomAccessFile raf = new RandomAccessFile(memoryPath, "r"); - raf.seek(begin); - raf.read(snippet.getData()); - raf.close(); - } - catch (Exception e) { - e.printStackTrace(); - } + fetchMemory(snippet); } } - - /** - * can remove & add & edit maps of memorysnipperlist - */ - public void updateMapLocationsSnippetList(List snippets) { - refreshMemoryMaps(); - - List list2 = new ArrayList<>(); - List not_added = new ArrayList<>(); - - // readd all maps that stayed the same - for (long[] map : maps) { - //if was in snippetlist: - boolean found = false; - for (MemorySnippet snippet : snippets) { - if (snippet.offset == map[0] && snippet.offset + snippet.getData().length == map[1]) { - list2.add(snippet); - snippets.remove(snippet); - found = true; - break; - } - } - if (!found) { - not_added.add(map); - } - + public void fetchMemory(MemorySnippet snippet) { + String memoryPath = "/proc/" + PID + "/mem"; + long begin = snippet.offset; + try { + RandomAccessFile raf = new RandomAccessFile(memoryPath, "r"); + raf.seek(begin); + raf.read(snippet.getData()); + raf.close(); } - - for (int i = 0; i < not_added.size(); i++) { - long[] map = not_added.get(i); - //find potential overlap snippet - MemorySnippet snippet = new MemorySnippet(map[0], new byte[(int)(map[1] - map[0])]); - byte[] data = snippet.getData(); - - for (MemorySnippet potential : snippets) { - //if there is overlap - if ((potential.offset >= map[0] && potential.offset < map[1]) || - (potential.offset + potential.getData().length >= map[0] && potential.offset + potential.getData().length< map[1]) || - (potential.offset < map[0] && potential.offset + potential.getData().length >= map[1]) ) { - - int start = Math.max((int)(potential.offset - map[0]), 0); - int offset2 = -(int)(potential.offset - map[0]); - - for (int j = start; j < Math.min(map[1] - map[0], potential.getData().length - offset2); j++) { - data[j] = potential.getData()[j+offset2]; - } - } - } - list2.add(snippet); + catch (Exception e) { + e.printStackTrace(); } - - snippets.clear(); - for (MemorySnippet snippet : list2) { - snippets.add(snippet); - } - } - /** - * creates a new memorysnippet list of data that changed (or not) from the original list with a given left&right buffer - */ - public List differentiate(List original, boolean isChanged, int leftRightbytebuffer) { - //fill a new memorysnippet list with live data + public List differentiate2(List original, int minChangedBytes, int maxChangedBytes, int range) { List upToDate = new ArrayList<>(); for (MemorySnippet memorySnippet : original) { upToDate.add(new MemorySnippet(memorySnippet.getOffset(), new byte[memorySnippet.getData().length])); } fetchMemory(upToDate); - List result = new ArrayList<>(); - - long totalBytes = 0; - + Queue wachter = new LinkedList<>(); for (int i = 0; i < original.size(); i++) { - long offset = original.get(i).getOffset(); - byte[] old = original.get(i).getData(); - byte[] curr = upToDate.get(i).getData(); + wachter.clear(); + int wachtersize = 0; - if (!isChanged) { - // find all non-changed stuff and put in result - long pre = offset; - for (int j = 0; j < old.length; j++) { - if (old[j] != curr[j]) { - //calculate previous block length - int len = j - ((int)(pre - offset)); - if (len >= leftRightbytebuffer && len > 0) { - result.add(new MemorySnippet(pre, new byte[len])); - totalBytes += len; - } - pre = offset + j + 1; - } + MemorySnippet org = original.get(i); + byte[] orgdata = org.getData(); + MemorySnippet upd = upToDate.get(i); + byte[] upddata = upd.getData(); + + int curstartoffset = -1; + int lastendbuffer = -1; + + for (int p = 0; p < org.getData().length; p++) { + if (wachtersize > 0 && p == wachter.peek()) { + wachter.poll(); + wachtersize--; } - int len = old.length - ((int)(pre - offset)); - if (len >= leftRightbytebuffer && len > 0) { - result.add(new MemorySnippet(pre, new byte[len])); - totalBytes += len; + if (orgdata[p] != upddata[p]) { + wachter.add(p + range); + wachtersize++; + } + + if (p >= range - 1 && wachtersize >= minChangedBytes && wachtersize <= maxChangedBytes) { + if (curstartoffset == -1) { + curstartoffset = p - range + 1; + } + else if (lastendbuffer < p - range) { + MemorySnippet snippet = new MemorySnippet(curstartoffset + org.getOffset(), new byte[lastendbuffer - curstartoffset + 1]); + result.add(snippet); + curstartoffset = p - range + 1; + } + lastendbuffer = p; } } - else { - //find all changed stuff and put result - long pre = offset; - int downCount = -1; //if downCount reaches zero, buffer should be written out - for (int j = 0; j < old.length; j++) { - if (old[j] != curr[j]) { - if (downCount <= 0) { - pre = Math.max(offset, offset + j - leftRightbytebuffer); - } - downCount = leftRightbytebuffer; - } - else { downCount -= 1; } - if (downCount == 0) { - int len = j - ((int)(pre - offset)); - result.add(new MemorySnippet(pre, new byte[len])); - totalBytes += len; - } - } - int len = old.length - ((int)(pre - offset)); - if (downCount > 0 && len >= leftRightbytebuffer) { - result.add(new MemorySnippet(pre, new byte[len])); - totalBytes += len; - } + if (curstartoffset != -1) { + MemorySnippet snippet = new MemorySnippet(curstartoffset + org.getOffset(), new byte[lastendbuffer - curstartoffset + 1]); + result.add(snippet); } } fetchMemory(result); - - System.out.println("totalbytes after diff: " + totalBytes); - return result; } - //currently not being used functions: - List searchOffsetForByteArray(byte[] toFind) { - if (toFind.length == 0) return null; - - System.out.println("*** Start searching for: " + new String(toFind)); - String memoryPath = "/proc/" + PID + "/mem"; - List results = new ArrayList<>(); - - Timer t = new Timer(); - t.start(); - - for (long[] map : maps) { - long begin = map[0]; - long end = map[1]; - try { - RandomAccessFile raf = new RandomAccessFile(memoryPath, "r"); - byte[] wholeBuffer = new byte[(int)(end - begin)]; - raf.seek(begin); - raf.read(wholeBuffer); - raf.close(); - - for (int i = 0; i < wholeBuffer.length; i++) { - - int subIndex = 0; - while (subIndex < toFind.length && wholeBuffer[i + subIndex] == toFind[subIndex]) subIndex++; - - if (subIndex == toFind.length) { - long result = (long)i + begin; - results.add(result); - System.out.println("* Found match for " + new String(toFind) + " at address: " + result); - } - } - - } catch (Exception e) { - e.printStackTrace(); - } - } - - System.out.println("*** End searching for: " + new String(toFind) + " in " + t.delta() + "ms"); - return results; - } - List searchOffsetForString(String keyString) { - return searchOffsetForByteArray(keyString.getBytes()); - } - - public List findSharedKey (List snippets){ - - byte[] bounds = "09afAF".getBytes(); - - List results = new ArrayList<>(); - - int size = 54; - - for (MemorySnippet snippet : snippets) { - int count = 0; - byte[] data = snippet.getData(); - if (data.length >= size) { - for (int i = 0; i < data.length; i++) { - byte b = data[i]; - if ((b >= bounds[0] && b <= bounds[1]) || - (b >= bounds[2] && b <= bounds[3]) || - (b >= bounds[4] && b <= bounds[5])) { - count++; - } - else { - count = 0; - } - if (count == size && (i + 1 == data.length || !((data[i+1] >= bounds[0] && data[i+1] <= bounds[1]) || - (data[i+1] >= bounds[2] && data[i+1] <= bounds[3]) || - (data[i+1] >= bounds[4] && data[i+1] <= bounds[5]))) ) { - results.add(new String(Arrays.copyOfRange(data, i - size + 1, i + 1)) + " on location: " + (snippet.getOffset() + i)); - } - } - } - - } - return results; - } - - public List findSharedKey2() { - List memorySnippets = new ArrayList<>(); - - int buff = 15000000; - - long verystart = maps.get(0)[0]; - long veryend = maps.get(0)[1]; - - for (int i = 1; i < maps.size(); i++) { - long[] map = maps.get(i); - if (map[1] - veryend <= buff) { - veryend = map[1]; - } - else { - memorySnippets.add(new MemorySnippet(verystart, new byte[(int)(veryend - verystart + buff)])); - verystart = maps.get(i)[0]; - veryend = maps.get(i)[1]; - } - } - memorySnippets.add(new MemorySnippet(verystart, new byte[(int)(veryend - verystart + buff)])); - - fetchMemory(memorySnippets); - return findSharedKey(memorySnippets); - } - - @SuppressWarnings("Duplicates") public void pauseProcess() { String[] args = new String[] {"kill", "-STOP", PID+""}; @@ -401,10 +202,8 @@ public class FlashClient { // client.updateMapLocationsSnippetList(l); - List res = client.findSharedKey2(); - System.out.println(res); - System.out.println("test"); } + } diff --git a/src/main/protocol/memory/MemorySnippet.java b/src/main/protocol/memory/MemorySnippet.java new file mode 100644 index 0000000..aca539a --- /dev/null +++ b/src/main/protocol/memory/MemorySnippet.java @@ -0,0 +1,19 @@ +package main.protocol.memory; + +public class MemorySnippet { + long offset; + byte[] data; + + public MemorySnippet(long offset, byte[] data) { + this.offset = offset; + this.data = data; + } + + public byte[] getData() { + return data; + } + + public long getOffset() { + return offset; + } +} diff --git a/src/main/protocol/memory/Rc4Obtainer.java b/src/main/protocol/memory/Rc4Obtainer.java index 6e734e3..5358119 100644 --- a/src/main/protocol/memory/Rc4Obtainer.java +++ b/src/main/protocol/memory/Rc4Obtainer.java @@ -2,33 +2,34 @@ package main.protocol.memory; import javafx.application.Platform; import main.protocol.HPacket; +import main.protocol.crypto.RC4; import main.protocol.packethandler.BufferListener; import main.protocol.packethandler.IncomingHandler; import main.protocol.packethandler.OutgoingHandler; import main.protocol.memory.FlashClient; +import java.util.Arrays; import java.util.List; +import java.util.Random; public class Rc4Obtainer { - public static Rc4Obtainer rc4Obtainer = null; - public static void initialize() { - rc4Obtainer = new Rc4Obtainer(); - rc4Obtainer.client = FlashClient.create(); - } + public static final boolean DEBUG = false; FlashClient client = null; OutgoingHandler outgoingHandler = null; IncomingHandler incomingHandler = null; - private Rc4Obtainer() { - + public Rc4Obtainer() { + client = FlashClient.create(); } + + private boolean hashappened1 = false; public void setOutgoingHandler(OutgoingHandler handler) { outgoingHandler = handler; - handler.addBufferListener(() -> { - if (handler.getCurrentIndex() >= 3) hasChangedFromLastCheck = true; + handler.addBufferListener((int addedbytes) -> { + if (handler.getCurrentIndex() >= 3) this.addedBytes += addedbytes; if (!hashappened1 && handler.getCurrentIndex() == 3) { hashappened1 = true; onSendFirstEncryptedMessage(); @@ -38,91 +39,182 @@ public class Rc4Obtainer { public void setIncomingHandler(IncomingHandler handler) { incomingHandler = handler; - handler.addBufferListener(() -> { - if (!hashappened2 && handler.getCurrentIndex() == 1) { - hashappened2 = true; - onReceivePubKey(); - } - }); } - private List fullmemorybeforekey = null; - private boolean hasChangedFromLastCheck = false; - - private boolean hashappened2 = false; - private void onReceivePubKey() { - incomingHandler.block(); - new Thread(() -> { - - System.out.println("[+] receive pubkey"); - client.pauseProcess(); - - fullmemorybeforekey = client.createMemorySnippetList(); - client.fetchMemory(fullmemorybeforekey); - - System.out.println("[-] receive pubkey"); - - client.resumeProcess(); - incomingHandler.unblock(); - }).start(); - } - - - private boolean hashappened1 = false; + private volatile int addedBytes = 0; private void onSendFirstEncryptedMessage() { incomingHandler.block(); outgoingHandler.block(); new Thread(() -> { - System.out.println("[+] send encrypted"); - client.pauseProcess(); - client.updateMapLocationsSnippetList(fullmemorybeforekey); - client.resumeProcess(); + if (DEBUG) System.out.println("[+] send encrypted"); + sleep(20); - List diff = searchForPossibleRC4Tables(fullmemorybeforekey); - System.out.println("size: " + getTotalBytesLengthOfDiff(diff)); - for (int i = 0; i < 20; i++) { -// if (i % 2 == 1) { -// incomingHandler.sendToStream(new HPacket(3631).toBytes()); -// } - sleep(200); - boolean rem = hasChangedFromLastCheck; - diff = searchForPossibleRC4Tables(diff); - System.out.println("size: " + getTotalBytesLengthOfDiff(diff) + " and was changed: " + rem); + List diff = null; + + + // STEP ONE: filtering to obtain one area containing the rc4 data field + int foundbuffersize = 0; + while (foundbuffersize == 0) { + client.pauseProcess(); + diff = client.createMemorySnippetList(); + client.fetchMemory(diff); + client.resumeProcess(); + this.addedBytes = 0; + + Random rand = new Random(); + + if (DEBUG) System.out.println("size: " + getTotalBytesLengthOfDiff(diff)); + int i = 0; + while (getTotalBytesLengthOfDiff(diff) > 2000) { + int am = 0; + if (i % 2 == 1) { + am = rand.nextInt(30) + 1; + for (int j = 0; j < am; j++) { + incomingHandler.sendToStream(new HPacket(3794).toBytes()); + outgoingHandler.fakePongAlert(); + sleep(20); + } + } + sleep(50); + int rem = addedBytes; + diff = searchForPossibleRC4Tables(diff); + if (DEBUG) System.out.println("size: " + getTotalBytesLengthOfDiff(diff) + " with changed bytes: " + rem + " should be: " + am * 6); + i++; + } + + foundbuffersize = (int)getTotalBytesLengthOfDiff(diff); } - System.out.println("[-] send encrypted"); + + + + //diff should only have one element now + // STEP TWO: obtain the exactly the 256 needed bytes + //research shows that this equals the first occurence of a number followed by 3 zeros is the start + //if that number accidentally is zero it won't work so fuck that - cry - + MemorySnippet snippet = diff.get(0); + byte[] wannabeRC4data = snippet.getData(); + int result_start_index = -1; + for (int i = 0; i < snippet.getData().length - 3; i++) { + if (wannabeRC4data[i] != 0 && wannabeRC4data[i+1] == 0 && wannabeRC4data[i+2] == 0 && wannabeRC4data[i+3] == 0) { + result_start_index = i; + if (DEBUG) System.out.println(result_start_index); + break; + } + } + + byte[] data = new byte[256]; // dis is the friggin key + for (int i = 0; i < 256; i++) data[i] = wannabeRC4data[i*4 + result_start_index]; + + if (DEBUG) printByteArray(data); + + + + + + // STEP 3: find the i & j values (in our RC4 class called x & y) + // this goes together with the verification of this actually being the right RC4 table + + MemorySnippet snippet1 = new MemorySnippet(snippet.getOffset(), new byte[snippet.getData().length]); + client.fetchMemory(snippet1); + incomingHandler.sendToStream(new HPacket(3794).toBytes()); + outgoingHandler.fakePongAlert(); + sleep(70); + + byte[] data1 = new byte[256]; + for (int i = 0; i < 256; i++) data1[i] = snippet1.getData()[i*4 + result_start_index]; + + byte[] lastPongPacket = new byte[6]; + List encodedbytelistraw = outgoingHandler.getEncryptedBuffer(); + for (int i = 0; i < 6; i++) { + lastPongPacket[i] = encodedbytelistraw.get(encodedbytelistraw.size() - 6 + i); + } + + RC4 result = null; + + //dont panic this runs extremely fast xo + outerloop: + for (int x = 0; x < 256; x++) { + for (int y = 0; y < 256; y++) { + byte[] copy = new byte[256]; + for (int i = 0; i < 256; i++) { + copy[i] = data1[i]; + } + RC4 rc4Tryout = new RC4(copy, x, y); + + HPacket tryout = new HPacket(rc4Tryout.rc4(lastPongPacket)); + if (!tryout.isCorrupted()) { + result = rc4Tryout; + break outerloop; + } + } + } + + + + // STEP FOUR: undo all sent packets in the rc4 stream + List enbuf = outgoingHandler.getEncryptedBuffer(); + byte[] encrbuffer = new byte[enbuf.size()]; + for (int i = 0; i < enbuf.size(); i++) { + encrbuffer[i] = enbuf.get(i); + } + + result.undoRc4(encrbuffer); + + + // STEP FIVE: set the rc4 stream + + if (result != null) { + outgoingHandler.setRc4(result); + } + else { + System.err.println("Did not find RC4 stream"); + } + + if (DEBUG) System.out.println("[-] send encrypted"); outgoingHandler.unblock(); incomingHandler.unblock(); }).start(); - - } - private List searchForPossibleRC4Tables(List snippets) { - List result; + + + + + private List searchForPossibleRC4Tables(List snippets) { + List result; client.pauseProcess(); - if (hasChangedFromLastCheck) { - result = client.differentiate(snippets, true, 255); - hasChangedFromLastCheck = false; - } - else { - result = client.differentiate(snippets, false, 4); - } + result = client.differentiate2(snippets, ((addedBytes * 2) / 3), addedBytes * 2, 1028); + addedBytes = 0; client.resumeProcess(); return result; } - private long getTotalBytesLengthOfDiff(List snippets) { + private void printBooleanArray(boolean[] booleans) { + StringBuilder builder = new StringBuilder(); + for (boolean bool : booleans) { + builder.append(bool ? "1" : "0"); + } + System.out.println(builder); + } + private void printByteArray(byte[] booleans) { + StringBuilder builder = new StringBuilder(); + for (byte bool : booleans) { + builder.append(bool); + builder.append(","); + } + System.out.println(builder); + } + private long getTotalBytesLengthOfDiff(List snippets) { long tot = 0; - for (FlashClient.MemorySnippet snippet : snippets) { + for (MemorySnippet snippet : snippets) { tot += (snippet.getData().length); } return tot; } - private void sleep(int ms) { try { Thread.sleep(ms); diff --git a/src/main/protocol/packethandler/BufferListener.java b/src/main/protocol/packethandler/BufferListener.java index 1a459fb..8e346f6 100644 --- a/src/main/protocol/packethandler/BufferListener.java +++ b/src/main/protocol/packethandler/BufferListener.java @@ -3,6 +3,6 @@ package main.protocol.packethandler; public interface BufferListener { - void act(); + void act(int addedbytes); } diff --git a/src/main/protocol/packethandler/Handler.java b/src/main/protocol/packethandler/Handler.java index 054368e..638eb21 100644 --- a/src/main/protocol/packethandler/Handler.java +++ b/src/main/protocol/packethandler/Handler.java @@ -12,8 +12,8 @@ public abstract class Handler { volatile PayloadBuffer payloadBuffer = new PayloadBuffer(); volatile OutputStream out; - private volatile Object[] listeners = null; //get notified on packet send - private volatile boolean isTempBlocked = false; + volatile Object[] listeners = null; //get notified on packet send + volatile boolean isTempBlocked = false; volatile boolean isDataStream = false; volatile int currentIndex = 0; @@ -32,16 +32,11 @@ public abstract class Handler { if (isDataStream) { payloadBuffer.push(buffer); - notifyBufferListeners(); + notifyBufferListeners(buffer.length); if (!isTempBlocked) { flush(); } - else { - if (this instanceof OutgoingHandler) { - System.out.println("blocked outgoing bytes with size: "+ buffer.length); - } - } } else { out.write(buffer); @@ -88,9 +83,9 @@ public abstract class Handler { public void removeBufferListener(BufferListener listener) { bufferListeners.remove(listener); } - private void notifyBufferListeners() { + void notifyBufferListeners(int addedbytes) { for (int i = bufferListeners.size() - 1; i >= 0; i -= 1) { - bufferListeners.get(i).act(); + bufferListeners.get(i).act(addedbytes); } } diff --git a/src/main/protocol/packethandler/IncomingHandler.java b/src/main/protocol/packethandler/IncomingHandler.java index b830469..ae17a1c 100644 --- a/src/main/protocol/packethandler/IncomingHandler.java +++ b/src/main/protocol/packethandler/IncomingHandler.java @@ -13,34 +13,35 @@ public class IncomingHandler extends Handler { super(outputStream); } - @Override - public void setAsDataStream() { - super.setAsDataStream(); - Rc4Obtainer.rc4Obtainer.setIncomingHandler(this); - } + private final Object lock = new Object(); @Override public void sendToStream(byte[] buffer) { - try { - out.write(buffer); - out.flush(); - } catch (IOException e) { - e.printStackTrace(); + synchronized (lock) { + try { + out.write(buffer); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } } } @Override public void flush() throws IOException { - HPacket[] hpackets = payloadBuffer.receive(); + synchronized (lock) { + HPacket[] hpackets = payloadBuffer.receive(); - for (HPacket hpacket : hpackets){ - HMessage hMessage = new HMessage(hpacket, HMessage.Side.TOCLIENT, currentIndex); - notifyListeners(hMessage); + for (HPacket hpacket : hpackets){ + HMessage hMessage = new HMessage(hpacket, HMessage.Side.TOCLIENT, currentIndex); + notifyListeners(hMessage); - if (!hMessage.isBlocked()) { - out.write(hMessage.getPacket().toBytes()); + if (!hMessage.isBlocked()) { + out.write(hMessage.getPacket().toBytes()); + } + currentIndex++; } - currentIndex++; } + } } diff --git a/src/main/protocol/packethandler/OutgoingHandler.java b/src/main/protocol/packethandler/OutgoingHandler.java index ba83af8..a5938d0 100644 --- a/src/main/protocol/packethandler/OutgoingHandler.java +++ b/src/main/protocol/packethandler/OutgoingHandler.java @@ -2,14 +2,23 @@ package main.protocol.packethandler; import main.protocol.HMessage; import main.protocol.HPacket; +import main.protocol.crypto.RC4; import main.protocol.memory.Rc4Obtainer; import java.io.IOException; import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; public class OutgoingHandler extends Handler { + private final Object lock = new Object(); + + private final static int encryptOffset = 3; //all packets with index < 3 aren't encrypted + private RC4 clientcipher = null; + private RC4 servercipher = null; + private List tempEncryptedBuffer = new ArrayList<>(); public OutgoingHandler(OutputStream outputStream) { super(outputStream); @@ -19,49 +28,101 @@ public class OutgoingHandler extends Handler { if (!isDataStream) { HPacket hpacket = new HPacket(buffer); isDataStream = (hpacket.getBytesLength() > 6 && hpacket.headerId() == 4000 && hpacket.headerId() == 4000); - if (isDataStream) { - Rc4Obtainer.initialize(); - Rc4Obtainer.rc4Obtainer.setOutgoingHandler(this); - } } } @Override public void act(byte[] buffer, Object[] listeners) throws IOException { dataStreamCheck(buffer); - super.act(buffer, listeners); + this.listeners = listeners; + + if (isDataStream) { + + if (currentIndex < encryptOffset) { + payloadBuffer.push(buffer); + } + else if (clientcipher == null) { + for (int i = 0; i < buffer.length; i++) { + tempEncryptedBuffer.add(buffer[i]); + } + } + else { + payloadBuffer.push(clientcipher.rc4(buffer)); + } + + notifyBufferListeners(buffer.length); + + if (!isTempBlocked) { + flush(); + } + } + else { + out.write(buffer); + } } @Override public void sendToStream(byte[] buffer) { + synchronized (lock) { + try { + out.write(servercipher.rc4(buffer)); + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } } + public void setRc4(RC4 rc4) { + this.clientcipher = rc4; + this.servercipher = rc4.deepCopy(); + + byte[] encrbuffer = new byte[tempEncryptedBuffer.size()]; + for (int i = 0; i < tempEncryptedBuffer.size(); i++) { + encrbuffer[i] = tempEncryptedBuffer.get(i); + } + + try { + act(encrbuffer, this.listeners); + } catch (IOException e) { + e.printStackTrace(); + } + tempEncryptedBuffer = null; + } + public List getEncryptedBuffer() { + return tempEncryptedBuffer; + } + + + //as pings & pongs are used in order to find the RC4 table, we really don't want it to be displayed + //or even be sent to the server, we can fix that by calling this method everytime we fakesend a ping + private int skipPongAmount = 0; + public void fakePongAlert() { + skipPongAmount ++; + } + @Override public void flush() throws IOException { - - if (currentIndex < encryptOffset) { + synchronized (lock) { HPacket[] hpackets = payloadBuffer.receive(); for (HPacket hpacket : hpackets){ + if (skipPongAmount > 0 && hpacket.length() == 2) { + skipPongAmount --; + continue; + } + HMessage hMessage = new HMessage(hpacket, HMessage.Side.TOSERVER, currentIndex); notifyListeners(hMessage); if (!hMessage.isBlocked()) { - out.write(hMessage.getPacket().toBytes()); + out.write( + currentIndex < encryptOffset ? hMessage.getPacket().toBytes() : + servercipher.rc4(hMessage.getPacket().toBytes()) + ); } currentIndex ++; } } - if (currentIndex >= encryptOffset) { - if (payloadBuffer.peak().length > 0) { - HPacket packet = new HPacket(payloadBuffer.forceClear()); - HMessage hMessage = new HMessage(packet, HMessage.Side.TOSERVER, currentIndex); - - notifyListeners(hMessage); - out.write(packet.toBytes()); - currentIndex++; - } - - } } }