home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / w00w00 / sectools / dsniff / decode_icq.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-16  |  3.4 KB  |  125 lines

  1. /*
  2.   decode_icq.c
  3.  
  4.   ICQ.
  5.   
  6.   See http://www.algonet.se/~henisak/icq/ for details...
  7.  
  8.   Copyright (c) 2000 Dug Song <dugsong@monkey.org>
  9.  
  10.   $Id: decode_icq.c,v 1.1 2000/05/16 17:31:14 dugsong Exp $
  11. */
  12.  
  13. #include <sys/types.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include "decode.h"
  17.  
  18. #define ICQ2_UIN_OFFSET        6
  19. #define ICQ2_CMD_OFFSET        2
  20. #define ICQ2_PASS_OFFSET    16
  21.  
  22. #define ICQ5_UIN_OFFSET        6
  23. #define ICQ5_CMD_OFFSET        14
  24. #define ICQ5_CKSUM_OFFSET    20
  25. #define ICQ5_PASS_OFFSET    34
  26.  
  27. const u_char icq5_table [] = {
  28.     0x59, 0x60, 0x37, 0x6B, 0x65, 0x62, 0x46, 0x48, 0x53, 0x61, 0x4C,
  29.     0x59, 0x60, 0x57, 0x5B, 0x3D, 0x5E, 0x34, 0x6D, 0x36, 0x50, 0x3F,
  30.     0x6F, 0x67, 0x53, 0x61, 0x4C, 0x59, 0x40, 0x47, 0x63, 0x39, 0x50,
  31.     0x5F, 0x5F, 0x3F, 0x6F, 0x47, 0x43, 0x69, 0x48, 0x33, 0x31, 0x64,
  32.     0x35, 0x5A, 0x4A, 0x42, 0x56, 0x40, 0x67, 0x53, 0x41, 0x07, 0x6C,
  33.     0x49, 0x58, 0x3B, 0x4D, 0x46, 0x68, 0x43, 0x69, 0x48, 0x33, 0x31,
  34.     0x44, 0x65, 0x62, 0x46, 0x48, 0x53, 0x41, 0x07, 0x6C, 0x69, 0x48,
  35.     0x33, 0x51, 0x54, 0x5D, 0x4E, 0x6C, 0x49, 0x38, 0x4B, 0x55, 0x4A,
  36.     0x62, 0x46, 0x48, 0x33, 0x51, 0x34, 0x6D, 0x36, 0x50, 0x5F, 0x5F,
  37.     0x5F, 0x3F, 0x6F, 0x47, 0x63, 0x59, 0x40, 0x67, 0x33, 0x31, 0x64,
  38.     0x35, 0x5A, 0x6A, 0x52, 0x6E, 0x3C, 0x51, 0x34, 0x6D, 0x36, 0x50,
  39.     0x5F, 0x5F, 0x3F, 0x4F, 0x37, 0x4B, 0x35, 0x5A, 0x4A, 0x62, 0x66,
  40.     0x58, 0x3B, 0x4D, 0x66, 0x58, 0x5B, 0x5D, 0x4E, 0x6C, 0x49, 0x58,
  41.     0x3B, 0x4D, 0x66, 0x58, 0x3B, 0x4D, 0x46, 0x48, 0x53, 0x61, 0x4C,
  42.     0x59, 0x40, 0x67, 0x33, 0x31, 0x64, 0x55, 0x6A, 0x32, 0x3E, 0x44,
  43.     0x45, 0x52, 0x6E, 0x3C, 0x31, 0x64, 0x55, 0x6A, 0x52, 0x4E, 0x6C,
  44.     0x69, 0x48, 0x53, 0x61, 0x4C, 0x39, 0x30, 0x6F, 0x47, 0x63, 0x59,
  45.     0x60, 0x57, 0x5B, 0x3D, 0x3E, 0x64, 0x35, 0x3A, 0x3A, 0x5A, 0x6A,
  46.     0x52, 0x4E, 0x6C, 0x69, 0x48, 0x53, 0x61, 0x6C, 0x49, 0x58, 0x3B,
  47.     0x4D, 0x46, 0x68, 0x63, 0x39, 0x50, 0x5F, 0x5F, 0x3F, 0x6F, 0x67,
  48.     0x53, 0x41, 0x25, 0x41, 0x3C, 0x51, 0x54, 0x3D, 0x5E, 0x54, 0x5D,
  49.     0x4E, 0x4C, 0x39, 0x50, 0x5F, 0x5F, 0x5F, 0x3F, 0x6F, 0x47, 0x43,
  50.     0x69, 0x48, 0x33, 0x51, 0x54, 0x5D, 0x6E, 0x3C, 0x31, 0x64, 0x35,
  51.     0x5A, 0x00, 0x00
  52. };
  53.  
  54. int
  55. decode_icq(u_char *buf, int len)
  56. {
  57.     u_int uin;
  58.     char *p;
  59.     
  60.     if (len < 2)
  61.         return (0);
  62.     
  63.     switch (pletohs(buf)) {
  64.     case 2:
  65.         if (len < ICQ2_PASS_OFFSET + 1)
  66.             return (0);
  67.         
  68.         if (pletohs(&buf[ICQ2_CMD_OFFSET]) != 1000)
  69.             return (0);
  70.         
  71.         uin = pletohs(&buf[ICQ2_UIN_OFFSET]);
  72.         p = buf + ICQ2_PASS_OFFSET;
  73.         break;
  74.         
  75.     case 5:
  76.     {
  77.         u_long a1, a2, a3, a4, a5, c, key, i, k;
  78.         
  79.         if (len < ICQ5_PASS_OFFSET + 1)
  80.             return (0);
  81.         
  82.         c = pletohl(&buf[ICQ5_CKSUM_OFFSET]);
  83.         
  84.         a1 = c & 0x0001f000; a1 = a1 >> 0x0c;
  85.         a2 = c & 0x07c007c0; a2 = a2 >> 0x01;
  86.         a3 = c & 0x003e0001; a3 = a3 << 0x0a;
  87.         a4 = c & 0xf8000000; a4 = a4 >> 0x10;
  88.         a5 = c & 0x0000083e; a5 = a5 << 0x0f;
  89.         
  90.         key = len * 0x68656C6C;
  91.         key += a1 + a2 + a3 + a4 + a5;
  92.         
  93.         for (i = 0x0a; i < len + 3; i += 4) {
  94.             k = key + icq5_table[i & 0xff];
  95.             if (i != 0x16) {
  96.                 buf[i] ^= (u_char)(k & 0xff);
  97.                 buf[i + 1] ^= (u_char)((k & 0xff00) >> 8);
  98.             }
  99.             if (i != 0x12) {
  100.                 buf[i + 2] ^= (u_char)((k & 0xff0000) >> 16);
  101.                 buf[i + 3] ^= (u_char)((k & 0xff000000) >> 24);
  102.             }
  103.         }
  104.         if (pletohs(&buf[ICQ5_CMD_OFFSET]) != 1000)
  105.             return (0);
  106.         
  107.         uin = pletohl(&buf[ICQ5_UIN_OFFSET]);
  108.         p = buf + ICQ5_PASS_OFFSET;
  109.     }
  110.     break;
  111.     
  112.     default:
  113.         return (0);
  114.     }
  115.     snprintf(Buf, sizeof(Buf), "%d %s\n", uin, p);
  116.     
  117.     len = strlen(Buf);
  118.     
  119.     if (!is_ascii_string(Buf, len))
  120.         return (0);
  121.     
  122.     return (len);
  123. }
  124.  
  125.