/skycontact4_dll/skycontact4_dll/tcp_recv.c

https://gitlab.com/skype/skypeopensource2 · C · 189 lines · 92 code · 54 blank · 43 comment · 12 complexity · d4c0ddbd2d5fd10565232a2221f0c477 MD5 · raw file

  1. //
  2. // tcp_recv.c -- receive data process module
  3. //
  4. #include "short_types.h"
  5. extern int flag_auth_fail;
  6. extern int flag_blob_04_35;
  7. extern int flag_contacts_remain;
  8. extern int flag_commands_remain;
  9. extern char REMOTE_INDEXBUF[0x1000];
  10. extern int REMOTE_INDEXBUF_LEN;
  11. int init_file() {
  12. char *fp;
  13. fp = fopen("contacts.txt","w");
  14. fclose(fp);
  15. };
  16. int write_to_file(char *user) {
  17. char *fp;
  18. fp = fopen("contacts.txt","a");
  19. fprintf(fp, "%s\n", user);
  20. fclose(fp);
  21. };
  22. //
  23. // main recv loop
  24. //
  25. int process_recv_data (char *recvbuf, int recvlen) {
  26. unsigned int tmplen;
  27. int blkseq;
  28. int checked_pkt_len;
  29. int i;
  30. int packet_type;
  31. //
  32. // PKT'S Processing
  33. //
  34. //printf("Process AES pkts in 57 41\n");
  35. printf("\nProcess AES pkts with 41\n");
  36. // init from prev processing
  37. checked_pkt_len=0;
  38. i=0;
  39. // main loop
  40. while(checked_pkt_len < recvlen){
  41. int header_len;
  42. int AES_DATA_len;
  43. unsigned char membuf[0x1000];
  44. int membuf_len;
  45. int ret;
  46. i++;
  47. printf("\n:: PROCESSING PKT %d ::\n", i);
  48. // show header
  49. show_memory(recvbuf+checked_pkt_len, 5, "Header");
  50. if (memcmp(recvbuf, "\x17\x03\x01", 3) != 0) {
  51. printf("SSL marker bytes error, return...\n");
  52. return -1;
  53. };
  54. checked_pkt_len+=3;
  55. // pass two bytes of AES pkt size
  56. printf("AES pkt size: 0x%02X%02X\n", recvbuf[checked_pkt_len], recvbuf[checked_pkt_len+1]);
  57. //
  58. // need get pkt size here...
  59. //
  60. //wrong
  61. //tmplen = recvlen - 7;
  62. // pass 2 bytes of header
  63. //memcpy((char *)&tmplen, recvbuf+checked_pkt_len, 2);
  64. // some fucking magic
  65. tmplen = ((unsigned char)recvbuf[checked_pkt_len] & 0xff)*0x100;
  66. tmplen += (unsigned char)recvbuf[checked_pkt_len+1] & 0xff;
  67. tmplen = tmplen-2;
  68. checked_pkt_len+=2;
  69. printf("tmplen (one processed pkt len): 0x%08X\n", tmplen);
  70. printf("checked_pkt_len: 0x%08X\n", checked_pkt_len);
  71. printf("fullpkt len: 0x%08X\n", recvlen);
  72. if (recvbuf[checked_pkt_len-2] == 0x01) {
  73. //return -1;
  74. };
  75. /*
  76. if ((checked_pkt_len + tmplen - 3) > recvlen) {
  77. printf("This is a last pkt\n");
  78. tmplen = recvlen - checked_pkt_len + 2;
  79. printf("New pkt len: %d (0x%08X)\n", tmplen, tmplen);
  80. };
  81. */
  82. // aes len = -2 bytes from start, -2 bytes from end
  83. // -2 from end used as crc of whole pkt
  84. AES_DATA_len = tmplen;
  85. blkseq=get_blkseq(recvbuf+checked_pkt_len, AES_DATA_len+2);
  86. process_aes_crypt2(recvbuf+checked_pkt_len, AES_DATA_len, 1, blkseq, 0);
  87. main_unpack_all(recvbuf+checked_pkt_len, AES_DATA_len);
  88. get_04_35_blob(recvbuf+checked_pkt_len, AES_DATA_len, REMOTE_INDEXBUF, &REMOTE_INDEXBUF_LEN);
  89. if (1) {
  90. int pkt_id = 0;
  91. get_00_02_blob(recvbuf+checked_pkt_len, AES_DATA_len, &pkt_id);
  92. if (pkt_id > 0) {
  93. printf("Got reply on pkt_id: 0x%02X\n", pkt_id);
  94. };
  95. };
  96. //00-01: D1 20 00 00
  97. if (1) {
  98. int pkt_id = 0;
  99. get_00_01_blob(recvbuf+checked_pkt_len, AES_DATA_len, &pkt_id);
  100. if (pkt_id > 0) {
  101. printf("Got reply on pkt_id: 0x%02X\n", pkt_id);
  102. };
  103. };
  104. if (1) {
  105. u8 remote_str[0x1000];
  106. int remote_str_len;
  107. get_04_33_blob(recvbuf+checked_pkt_len, AES_DATA_len,remote_str, &remote_str_len);
  108. };
  109. if (1) {
  110. u8 remote_str[0x1000];
  111. int remote_str_len;
  112. remote_str_len = get_03_34_blob(recvbuf+checked_pkt_len, AES_DATA_len, remote_str);
  113. if (remote_str_len > 0) {
  114. printf("Name: %s\n", remote_str);
  115. write_to_file(remote_str);
  116. };
  117. };
  118. /*
  119. // pass 1-3 bytes of AES PKT DATA ID header (second AES data header?)
  120. header_len = 0;
  121. get_packet_size3(recvbuf+checked_pkt_len, 4, &header_len);
  122. */
  123. /*
  124. packet_type = (int)recvbuf[checked_pkt_len+header_len] & 0xFF;
  125. printf ("PACKET TYPE: 0x%02X\n", packet_type);
  126. */
  127. checked_pkt_len = checked_pkt_len + AES_DATA_len;
  128. // pass last two bytes of AES CRC
  129. printf("AES CRC: 0x%02X%02X\n", recvbuf[checked_pkt_len], recvbuf[checked_pkt_len+1]);
  130. checked_pkt_len=checked_pkt_len+2;
  131. printf("checked_pkt_len: 0x%08X\n", checked_pkt_len);
  132. printf("fullpkt len: 0x%08X\n", recvlen);
  133. };
  134. return 0;
  135. };