Advertisement
horato

decode

Dec 17th, 2012
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.88 KB | None | 0 0
  1. unit uencdec;
  2.  
  3. interface
  4.  
  5. uses
  6. uResourceStrings,
  7. usharedstructs,
  8. Classes,
  9. windows,
  10. forms,
  11. sysutils;
  12.  
  13. const
  14. KeyConst2: array[0..63] of Char = 'nKO/WctQ0AVLbpzfBkS6NevDYT8ourG5CRlmdjyJ72aswx4EPq1UgZhFMXH?3iI9';
  15.  
  16. type
  17.  
  18.  
  19. L2Xor = class(TCodingClass)
  20. private
  21. keyLen: Byte;
  22. public
  23. isAion: Boolean;
  24. constructor Create;
  25. procedure InitKey(const XorKey; Interlude: Byte = 0); override;
  26. procedure DecryptGP(var Data; var Size: Word); override;
  27. procedure EncryptGP(var Data; var Size: Word); override;
  28. procedure PreDecrypt(var Data; var Size: Word); override;
  29. procedure PostEncrypt(var Data; var Size: Word); override;
  30. end;
  31.  
  32.  
  33. TencDec = class (TObject)
  34. fonNewPacket : TNewPacket;
  35. fonNewAction : TNewAction;
  36. xorC, xorS: TCodingClass; //ęńîđ
  37. LastPacket:Tpacket;
  38. private
  39. isInterlude : boolean;
  40. SetInitXORAfterEncode : boolean; //Óńňŕíîâčňü SetInitXOR â True ďîńëĺ âűçîâŕ EncodePacket
  41.  
  42. pckCount: Integer; //ń÷ĺň÷čę ďŕęĺňîâ
  43. MaxLinesInPktLog : integer;
  44. //////////////////////////////////////////////////////////////////////////////////////////////
  45. CorrectXorData : TPacket;
  46. CorrectorData: PCorrectorData;
  47.  
  48. //ęîđđĺęňîđ äë˙ ńňŕđîăî đóîôŕ
  49. Procedure Corrector(var data; const enc: Boolean = False; const FromServer: Boolean = False);
  50.  
  51. //Äĺňĺęň íîâîăî ęëţ÷ŕ
  52. Procedure CorrectXor(Packet:Tpacket);
  53. //////////////////////////////////////////////////////////////////////////////////////////////
  54.  
  55. //îď˙ňü ńňŕíäŕđňíîĺ
  56. procedure sendAction(act : integer);
  57. Procedure ProcessRecivedPacket(var packet:tpacket); //îáđŕáŕňűâŕĺě ďŕęĺň (âűň˙ăčâŕĺě čě˙ ńîĺäčíĺíč˙, etc)
  58. public
  59. ParentTtunel, ParentLSP : Tobject;
  60. Ident : cardinal;
  61. // Packet: TPacket; //Ńîäĺđćčň ďŕęĺň íŕä ęîňîđűě â äŕííűé ěîěĺíň ďđîčçâîä˙ňń˙ äĺéńňâč˙
  62.  
  63. CharName: String; //čě˙ ďîëüçîâŕňĺë˙
  64. sLastPacket : string;
  65. sLastMessage : string;
  66.  
  67. //íŕńňđîéęč
  68. InitXOR : boolean;
  69.  
  70. Settings : TEncDecSettings;
  71. innerXor:boolean;
  72.  
  73. procedure DecodePacket(var Packet:Tpacket;Dirrection: byte); //Ńňŕđűé PacketProcesor
  74. Procedure EncodePacket(var Packet:Tpacket;Dirrection: byte); //ńňŕđűé ńĺíäďŕęĺň
  75.  
  76. constructor create;
  77. Procedure INIT; //číčöčŕëčçŕöč˙, âűçűâŕňü ďîńëĺ ęđĺĺéňŕ
  78. destructor Destroy; override;
  79.  
  80. published
  81. //Đŕçíîîáđŕçíűĺ đĺŕęöčč
  82. property onNewPacket: TNewPacket read fonNewPacket write fonNewPacket;
  83. property onNewAction: TNewAction read fonNewAction write fonNewAction;
  84. end;
  85.  
  86. implementation
  87.  
  88. uses Math, uData, uSocketEngine, uglobalfuncs;
  89.  
  90. { TencDec }
  91.  
  92.  
  93. constructor TencDec.create;
  94. begin
  95. MaxLinesInPktLog := 10000;
  96. innerXor := false;
  97. pckCount := 0;
  98. SetInitXORAfterEncode := false;
  99. isInterlude := false;
  100. InitXOR:=False;
  101. New(CorrectorData);
  102. CorrectorData._id_mix:=False;
  103. end;
  104.  
  105. procedure TencDec.DecodePacket;
  106. var
  107. InitXOR_copy : boolean;
  108. temp : word;
  109. begin
  110. InitXOR_copy := InitXOR; //íŕäî ňŕę.
  111. if (Packet.Size>2) then
  112. begin
  113. Inc(pckCount);
  114.  
  115. //ęîđđĺęňîđ.
  116. if Settings.isChangeXor then
  117. CorrectXor(Packet);
  118.  
  119. case Dirrection of
  120. PCK_GS_ToClient, PCK_LS_ToClient:
  121. begin //îň ĂŃ
  122.  
  123. //çŕďîěčíŕíčĺ 3ăî ďŕęĺňŕ (íŕ ńĺđâĺđ)
  124. //Îáőîä ńěĺíű XOR ęëţ÷ŕ. â 4ě ďŕęĺňĺ (íŕ ęëčĺíň)
  125. //ěîćĺň čçěĺíčňü ôëŕă InitXOR ďîýňîěó ó íŕń ĺńňü InitXOR_copy.
  126. if Settings.isChangeXor then CorrectXor(packet);
  127.  
  128. //ńîáńňâĺííî äĺęđčďň, ĺńëč ĺńňü ęëţ÷ č íĺ ńňîčň ăŕëî÷ęŕ "íĺ äĺęđčďňîâŕňü".
  129. if InitXOR_copy and (not Settings.isNoDecrypt) then
  130. begin
  131. temp := Packet.Size - 2;
  132. xorS.DecryptGP(packet.data, temp);
  133. Packet.Size := temp + 2
  134. end;
  135.  
  136. if Packet.Size <= 2 then
  137. FillChar(Packet.PacketAsCharArray, $FFFF, #0) //ŕâäđóă!
  138. else
  139. //âűň˙ăčâŕĺě čě˙ ńîĺäčíĺíč˙ č ďđî÷ĺĺ
  140. if (not Settings.isNoDecrypt) then begin
  141. if Settings.isAION and not InitXOR then packet.Data[0]:=(packet.Data[0] xor $ee) - $ae;
  142.  
  143. ProcessRecivedPacket(packet);
  144. end;
  145.  
  146. LastPacket := Packet;
  147. if Assigned(onNewPacket) then
  148. if Packet.Size > 2 then //íĺ îňďđŕâë˙ĺě ńęđčďňŕě ďŕęĺňű äëčííîé 2 áŕéňŕ (ôčçč÷ĺńęč)
  149. onNewPacket(Packet, true, self);
  150.  
  151. if Packet.Size <= 2 then
  152. FillChar(Packet.PacketAsCharArray, $FFFF, #0); //ŕâäđóă!
  153.  
  154. end;
  155.  
  156. PCK_GS_ToServer, PCK_LS_ToServer:
  157. begin
  158. if Packet.Size=29754 then Packet.Size:=267;
  159. //Äĺęîäčđîâŕíčĺ
  160. if InitXOR and (not Settings.isNoDecrypt) then
  161. begin
  162. temp := Packet.Size - 2;
  163. xorC.DecryptGP(Packet.Data, temp);
  164. Packet.Size := temp + 2;
  165. end;
  166.  
  167.  
  168. //ęîđđĺęňîđ äë˙ ăđŕöčč
  169. if Settings.isGraciaOff and (not Settings.isNoDecrypt) then
  170. Corrector(Packet.Size);
  171.  
  172.  
  173. //îňďđŕâęŕ ńęđčďňŕě
  174. if Assigned(onNewPacket) then
  175. onNewPacket(packet, false, self);
  176.  
  177.  
  178. if Packet.Size = 0 then
  179. FillChar(Packet.PacketAsCharArray, $FFFF, #0);
  180.  
  181. end;
  182. end;
  183. end;
  184. end;
  185.  
  186. destructor TencDec.destroy;
  187. begin
  188. try
  189. if not innerxor then
  190. begin
  191. xorS.Destroy;
  192. xorC.Destroy;
  193. end;
  194. except
  195. //ě.á. îřčáęŕ. íč÷ĺăî ńňđŕříîăî - čăíîđ.
  196. end;
  197.  
  198. Dispose(CorrectorData);
  199. inherited destroy;
  200. end;
  201.  
  202.  
  203. procedure TencDec.Corrector(var data; const enc, FromServer: Boolean);
  204. var
  205. buff: array[1..400] of Char absolute data;
  206.  
  207. procedure _pseudo_srand(seed : integer);
  208. begin
  209. CorrectorData._seed := seed;
  210. end;
  211.  
  212. function _pseudo_rand: integer;
  213. var
  214. a : integer;
  215. begin
  216. with CorrectorData^ do begin
  217. a := (Int64(_seed) * $343fd + $269EC3) and $FFFFFFFF;
  218. _seed := a;
  219. result := (_seed shr $10) and $7FFF;
  220. end;
  221. end;
  222.  
  223. procedure _init_tables(seed: integer; _2_byte_size: integer);
  224. var
  225. i : integer;
  226. x : Char;
  227. x2: Word;
  228. rand_pos : integer;
  229. cur_pos : integer;
  230. begin
  231. with CorrectorData^ do begin
  232. _1_byte_table := '';
  233. _2_byte_table := '';
  234.  
  235. _2_byte_table_size := _2_byte_size;
  236.  
  237. for i := 0 to $D0 do begin
  238. _1_byte_table := _1_byte_table + chr(i);
  239. end;
  240. for i := 0 to _2_byte_size do begin
  241. _2_byte_table := _2_byte_table + chr(i) + #$0;
  242. end;
  243. _pseudo_srand(seed);
  244. for i := 2 to $D1 do begin
  245. rand_pos := (_pseudo_rand mod i) + 1;
  246. x := _1_byte_table[rand_pos];
  247. _1_byte_table[rand_pos] := _1_byte_table[i];
  248. _1_byte_table[i] := x;
  249. end;
  250.  
  251. cur_pos := 3;
  252. for i := 2 to _2_byte_size+1 do begin
  253. rand_pos := _pseudo_rand mod i;
  254. x2 := PWord(@_2_byte_table[rand_pos * 2 + 1])^;
  255. PWord(@_2_byte_table[rand_pos * 2 + 1])^:=PWord(@_2_byte_table[cur_pos])^;
  256. PWord(@_2_byte_table[cur_pos])^:=x2;
  257. cur_pos := cur_pos + 2;
  258. end;
  259.  
  260. cur_pos := Pos(#$12, _1_byte_table);
  261. x := _1_byte_table[$13];
  262. _1_byte_table[$13] := #$12;
  263. _1_byte_table[cur_pos]:=x;
  264.  
  265. cur_pos := Pos(#$B1, _1_byte_table);
  266. x := _1_byte_table[$B2];
  267. _1_byte_table[$B2] := #$B1;
  268. _1_byte_table[cur_pos]:=x;
  269.  
  270. _id_mix := true;
  271. end;
  272. end;
  273.  
  274. procedure _decode_ID;
  275. begin
  276. with CorrectorData^ do begin
  277. buff[3]:=_1_byte_table[Byte(buff[3])+1];
  278. if buff[3] = #$D0 then begin
  279. if Byte(buff[4]) > _2_byte_table_size then begin
  280. // error!
  281. end;
  282. buff[4]:=_2_byte_table[Byte(buff[4])*2+1];
  283. end;
  284. end;
  285. end;
  286.  
  287. procedure _encode_ID;
  288. var
  289. p: integer;
  290. begin
  291. with CorrectorData^ do begin
  292. if buff[3] = #$D0 then begin
  293. p:= pos(buff[4], _2_byte_table);
  294. buff[4]:=Char(((p + 1) shr 1) - 1);
  295. end;
  296. p := pos(buff[3], _1_byte_table);
  297. buff[3]:=Char(p-1);
  298. end;
  299. end;
  300.  
  301. begin
  302. with CorrectorData^ do if FromServer then begin
  303. if _id_mix and(buff[3]=#$0b)then begin
  304. temp_seed:=PInteger(@buff[PWord(@buff[1])^-3])^;
  305. _init_tables(temp_seed,_2_byte_table_size);
  306. end;
  307. if(buff[3]=#$2e)then begin
  308. //if(Protocol = 871)or(Protocol = 12)then _init_tables(PInteger(@buff[$16])^, $58); // CT2.2
  309. //if(Protocol = 851)or(Protocol = 19)then _init_tables(PInteger(@buff[$16])^, $55); // CT2
  310. //if Protocol = 831 then _init_tables(PInteger(@buff[$16])^, $4E); // CT1.5+
  311. _init_tables(PInteger(@buff[$16])^, $80);
  312. end;
  313. end else begin
  314. if not _id_mix and(buff[3]=#$0e)then Protocol:=PInteger(@buff[4])^;
  315. if _id_mix and not enc then _decode_ID;
  316. if _id_mix and enc then _encode_ID;
  317. end;
  318. end;
  319.  
  320. procedure TencDec.INIT;
  321. begin
  322. //newxor
  323. if @CreateXorOut = nil then
  324. CreateXorOut := CreateXorIn;
  325.  
  326. //xorS, xorC - init
  327. if Assigned(CreateXorIn) then
  328. begin
  329. CreateXorIn(@xorS);
  330. innerXor := true;
  331. end
  332. else
  333. xorS := L2Xor.Create;
  334.  
  335. if Assigned(CreateXorOut) then
  336. begin
  337. CreateXorOut(@xorC);
  338. innerXor := true;
  339. end
  340. else
  341. xorC := L2Xor.Create;
  342. end;
  343.  
  344. procedure TencDec.EncodePacket;
  345. var
  346. isToServer : boolean;
  347. CurrentCoddingClass : TCodingClass;
  348. NeedEncrypt : boolean;
  349. temp : word;
  350. begin
  351. isToServer := (Dirrection = PCK_GS_ToServer) or (Dirrection = PCK_LS_ToServer); //ďŕęĺň čäĺň íŕ ńĺđâĺđ ?
  352.  
  353.  
  354. if isToServer then //â çŕâčńčěîńňč îň íŕďđŕâëĺíč˙ âűáčđŕĺě ęîäčđóţůčé ęëŕńń
  355. begin
  356. NeedEncrypt := (not Settings.isNoDecrypt) and InitXOR;
  357. CurrentCoddingClass := xorC;
  358. end
  359. else
  360. begin
  361. NeedEncrypt := (not Settings.isNoDecrypt) and InitXOR;
  362. if Settings.isAION and not InitXOR and not Settings.isNoDecrypt then
  363. packet.Data[0]:=(packet.Data[0] + $ae) xor $ee;
  364. CurrentCoddingClass := xorS;
  365. end;
  366.  
  367. if NeedEncrypt then
  368. begin
  369. if isToServer and Settings.isGraciaOff then
  370. Corrector(Packet.Size, True);
  371.  
  372. temp := Packet.Size - 2;
  373. CurrentCoddingClass.EncryptGP(Packet.data, temp); //ęîäčđóĺě
  374. Packet.Size := temp + 2;
  375.  
  376. end;
  377.  
  378. if SetInitXORAfterEncode then
  379. begin
  380. InitXOR := true;
  381. SetInitXORAfterEncode := false;
  382. end;
  383. LastPacket := Packet;
  384. end;
  385.  
  386. procedure TencDec.CorrectXor;
  387. var
  388. // tmp: string;
  389. Offset: Word;
  390. TempPacket : Tpacket;
  391. temp : word;
  392. begin
  393. //Îáőîä ńěĺíű XOR ęëţ÷ŕ.
  394. case pckCount of
  395. 3: CorrectXorData := Packet;
  396. 4: begin
  397. TempPacket := Packet;
  398. // SetLength(tmp, TempPacket.Size);
  399. // Move(TempPacket, tmp[1], TempPacket.Size);
  400. temp := TempPacket.Size-2;
  401. xorS.DecryptGP(TempPacket.Data, temp);
  402. TempPacket.Size := temp + 2;
  403. Offset := $13 or ((TempPacket.size-7) div 295) shl 8;
  404. PInteger(@TempPacket.Data[0])^:=PInteger(@TempPacket.Data[0])^ xor Offset xor PInteger(@(xorS.GKeyS[0]))^;
  405. xorS.InitKey(TempPacket.Data[0],Byte(isInterlude));
  406. xorC.InitKey(TempPacket.Data[0],Byte(isInterlude));
  407. if (not Settings.isNoDecrypt) then
  408. begin
  409. temp := CorrectXorData.Size - 2;
  410. xorC.DecryptGP(CorrectXorData.Data, temp);
  411. CorrectXorData.Size := temp + 2;
  412. end;
  413. if (not Settings.isNoDecrypt) then
  414. begin
  415. temp := CorrectXorData.Size - 2;
  416. xorC.EncryptGP(CorrectXorData.Data, temp);
  417. CorrectXorData.Size := temp + 2;
  418. end;
  419. InitXOR:=True;
  420. end;
  421. end;
  422. end;
  423.  
  424. procedure TencDec.ProcessRecivedPacket;
  425. var
  426. Offset: Word;
  427. WStr: WideString;
  428. begin
  429. if not Settings.isAION then case Packet.Data[0] of
  430. $00: if not InitXOR then begin
  431. isInterlude:=(Packet.Size>19);
  432. xorC.InitKey(Packet.Data[2], Byte(isInterlude));
  433. xorS.InitKey(Packet.Data[2], Byte(isInterlude));
  434. SetInitXORAfterEncode := true;
  435. end;
  436.  
  437. $15: if not Settings.isKamael then begin //and (pckCount=7)
  438. Offset := 1;
  439. while not ((Packet.Data[Offset]=0) and (Packet.Data[Offset+1]=0)) do Inc(Offset);
  440. SetLength(WStr, round((Offset+0.5)/2));
  441. Move(Packet.Data[1], WStr[1], Offset);
  442.  
  443. CharName := WideStringToString(WStr, 1251);
  444. //Ďîëó÷ĺíî čě˙ ńîĺäčíĺíč˙
  445. sendAction(TencDec_Action_GotName);
  446. end;
  447. //CharSelected
  448. $0B: if Settings.isKamael then begin // and (pckCount=6)
  449. Offset := 1;
  450. while not ((Packet.Data[Offset] = 0) and (Packet.Data[Offset + 1] = 0)) do Inc(Offset);
  451. SetLength(WStr, round((Offset+0.5)/2));
  452. Move(Packet.Data[1], WStr[1], Offset);
  453. CharName := WideStringToString(WStr, 1251);
  454. if Settings.isGraciaOff then
  455. Corrector(Packet.Size,False, True); // číčöčŕëčçŕöč˙ ęîđđĺęňîđŕ
  456. //Ďîëó÷ĺíî čě˙ ńîĺäčíĺíč˙
  457. sendAction(TencDec_Action_GotName);
  458. end;
  459. $2e: if (not InitXOR) and Settings.isKamael then begin
  460. isInterlude := True;
  461. xorC.InitKey(Packet.Data[2], Byte(isInterlude));
  462. xorS.InitKey(Packet.Data[2], Byte(isInterlude));
  463. if Settings.isGraciaOff then
  464. Corrector(Packet.Size,False,True); // číčöčŕëčçŕöč˙ ęîđđĺęňîđŕ
  465. SetInitXORAfterEncode := true;
  466. exit;
  467. end;
  468. end else case Packet.Data[0] of
  469. { $41: if not InitXOR then begin
  470. xorC.InitKey(Packet.Data[3], 2);
  471. xorS.InitKey(Packet.Data[3], 2);
  472. SetInitXORAfterEncode := true;
  473. end;}
  474. // CharInfo
  475. $18: if CharName = '[unk]' then begin
  476. CharName := WideStringToString(PWideChar(@Packet.Data[$2a]), 1251);
  477. //Ďîëó÷ĺíî čě˙ ńîĺäčíĺíč˙
  478. sendAction(TencDec_Action_GotName);
  479. end;
  480. {// Character list
  481. $c1: begin
  482. CharName := '[unk]';
  483. end;}
  484. else if not InitXOR then begin
  485. xorC.InitKey(Packet.Data[3], 2);
  486. xorS.InitKey(Packet.Data[3], 2);
  487. SetInitXORAfterEncode := true;
  488. end;
  489. end;
  490. end;
  491.  
  492. procedure TencDec.sendAction(act: integer);
  493. begin
  494. if assigned(onNewAction) then
  495. onNewAction(act, Self);
  496. end;
  497.  
  498. { L2Xor }
  499.  
  500. constructor L2Xor.Create;
  501. begin
  502. FillChar(GKeyS[0],SizeOf(GKeyS),0);
  503. FillChar(GKeyR[0],SizeOf(GKeyR),0);
  504. keyLen := 0;
  505. isAion:=False;
  506. end;
  507.  
  508. procedure L2Xor.DecryptGP(var Data; var Size: Word);
  509. var
  510. k:integer;
  511. i,t:byte;
  512. pck:array[0..$FFFD] of Byte absolute Data;
  513. begin
  514. i:=0;
  515. for k:=0 to size-1 do
  516. begin
  517. t:=pck[k];
  518. pck[k]:=t xor GKeyR[k and keyLen] xor i xor IfThen(isAion and(k>0),Byte(KeyConst2[k and 63]));
  519. i:=t;
  520. end;
  521. Inc(PCardinal(@GKeyR[keyLen-7])^,size);
  522. if isAion and(Size>0)then pck[0]:=(pck[0] xor $EE) - $AE; // č íŕôčăŕ ýňî...
  523. end;
  524.  
  525. procedure L2Xor.EncryptGP(var Data; var Size: Word);
  526. var
  527. i:integer;
  528. k:byte;
  529. pck:array[0..$FFFD] of Byte absolute Data;
  530. begin
  531. if isAion and(Size>0)then pck[0]:=(pck[0] + $AE) xor $EE; // č íŕôčăŕ ýňî...
  532. k:=0;
  533. for i:=0 to size-1 do begin
  534. pck[i]:=pck[i] xor GKeyS[i and keyLen] xor k xor IfThen(isAion and(i>0),Byte(KeyConst2[i and 63]));
  535. k:=pck[i];
  536. end;
  537. Inc(PCardinal(@GKeyS[keyLen-7])^,size);
  538. end;
  539.  
  540. procedure L2Xor.InitKey(const XorKey; Interlude: Byte);
  541. const
  542. KeyConst: array[0..3] of Byte = ($A1,$6C,$54,$87);
  543. KeyConstInterlude: array[0..7] of Byte = ($C8,$27,$93,$01,$A1,$6C,$31,$97);
  544. var
  545. key2:array[0..15] of Byte;
  546. begin
  547. case Interlude of
  548. 1:begin
  549. keyLen:=15;
  550. Move(XorKey,key2,8);
  551. Move(KeyConstInterlude,key2[8],8);
  552. end;
  553. 0:begin
  554. keyLen:=7;
  555. Move(XorKey,key2,4);
  556. Move(KeyConst,key2[4],4);
  557. end;
  558. 2:begin
  559. keyLen:=7;
  560. Move(XorKey,key2,4);
  561. Move(KeyConst,key2[4],4);
  562. PCardinal(@key2[0])^:=PCardinal(@key2[0])^ - $3ff2cc87 xor $cd92e451;
  563. isAion:=True;
  564. end;
  565. end;
  566. Move(key2,GKeyS,16);
  567. Move(key2,GKeyR,16);
  568. inherited;
  569. end;
  570.  
  571. procedure L2Xor.PostEncrypt(var Data; var Size: Word);
  572. begin
  573. //Íč÷ĺăî íĺ äĺëŕĺě, čáî íč÷ĺăî äĺëŕňü č íĺ íŕäî.
  574. end;
  575.  
  576. procedure L2Xor.PreDecrypt(var Data; var Size: Word);
  577. begin
  578. //Íč÷ĺăî íĺ äĺëŕĺě, čáî íč÷ĺăî äĺëŕňü č íĺ íŕäî.
  579. end;
  580.  
  581. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement