⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 http_ntlm.c

📁 harvest是一个下载html网页得机器人
💻 C
📖 第 1 页 / 共 2 页
字号:
  char **allocuserpwd;  /* point to the name and password for this */  char *userp;  char *passwdp;  /* point to the correct struct with this */  struct ntlmdata *ntlm;  *ready = FALSE;  if(proxy) {    allocuserpwd = &conn->allocptr.proxyuserpwd;    userp = conn->proxyuser;    passwdp = conn->proxypasswd;    ntlm = &conn->proxyntlm;  }  else {    allocuserpwd = &conn->allocptr.userpwd;    userp = conn->user;    passwdp = conn->passwd;    ntlm = &conn->ntlm;  }  /* not set means empty */  if(!userp)    userp=(char *)"";  if(!passwdp)    passwdp=(char *)"";    switch(ntlm->state) {  case NTLMSTATE_TYPE1:  default: /* for the weird cases we (re)start here */    hostoff = 32;    domoff = hostoff + hostlen;        /* Create and send a type-1 message:    Index Description          Content    0     NTLMSSP Signature    Null-terminated ASCII "NTLMSSP"                               (0x4e544c4d53535000)    8     NTLM Message Type    long (0x01000000)    12    Flags                long    16    Supplied Domain      security buffer(*)    24    Supplied Workstation security buffer(*)    32    start of data block    */    snprintf((char *)ntlmbuf, sizeof(ntlmbuf), "NTLMSSP%c"             "\x01%c%c%c" /* 32-bit type = 1 */             "%c%c%c%c"   /* 32-bit NTLM flag field */             "%c%c"  /* domain length */             "%c%c"  /* domain allocated space */             "%c%c"  /* domain name offset */             "%c%c"  /* 2 zeroes */             "%c%c"  /* host length */             "%c%c"  /* host allocated space */             "%c%c"  /* host name offset */             "%c%c"  /* 2 zeroes */             "%s"   /* host name */             "%s",  /* domain string */             0,     /* trailing zero */             0,0,0, /* part of type-1 long */             LONGQUARTET(               NTLMFLAG_NEGOTIATE_OEM|      /*   2 */               NTLMFLAG_NEGOTIATE_NTLM_KEY  /* 200 */               /* equals 0x0202 */               ),             SHORTPAIR(domlen),             SHORTPAIR(domlen),             SHORTPAIR(domoff),             0,0,             SHORTPAIR(hostlen),             SHORTPAIR(hostlen),             SHORTPAIR(hostoff),             0,0,             host, domain);    /* initial packet length */    size = 32 + hostlen + domlen;    /* now keeper of the base64 encoded package size */    size = Curl_base64_encode(ntlmbuf, size, &base64);    if(size >0 ) {      Curl_safefree(*allocuserpwd);      *allocuserpwd = aprintf("%sAuthorization: NTLM %s\r\n",                              proxy?"Proxy-":"",                              base64);      free(base64);    }    else      return CURLE_OUT_OF_MEMORY; /* FIX TODO */    break;      case NTLMSTATE_TYPE2:    /* We received the type-2 already, create a type-3 message:    Index   Description            Content    0       NTLMSSP Signature      Null-terminated ASCII "NTLMSSP"                                   (0x4e544c4d53535000)    8       NTLM Message Type      long (0x03000000)    12      LM/LMv2 Response       security buffer(*)    20      NTLM/NTLMv2 Response   security buffer(*)    28      Domain Name            security buffer(*)    36      User Name              security buffer(*)    44      Workstation Name       security buffer(*)    (52)    Session Key (optional) security buffer(*)    (60)    Flags (optional)       long    52 (64) start of data block    */    {    int lmrespoff;    int ntrespoff;    int useroff;    unsigned char lmresp[0x18]; /* fixed-size */#ifdef USE_NTRESPONSES    unsigned char ntresp[0x18]; /* fixed-size */#endif    const char *user;    int userlen;    user = strchr(userp, '\\');    if(!user)      user = strchr(userp, '/');    if (user) {      domain = userp;      domlen = user - domain;      user++;    }    else      user = userp;    userlen = strlen(user);    mkhash(passwdp, &ntlm->nonce[0], lmresp#ifdef USE_NTRESPONSES           , ntresp#endif      );    domoff = 64; /* always */    useroff = domoff + domlen;    hostoff = useroff + userlen;    lmrespoff = hostoff + hostlen;    ntrespoff = lmrespoff + 0x18;    /* Create the big type-3 message binary blob */    size = snprintf((char *)ntlmbuf, sizeof(ntlmbuf),                    "NTLMSSP%c"                    "\x03%c%c%c" /* type-3, 32 bits */                    "%c%c%c%c" /* LanManager length + allocated space */                    "%c%c" /* LanManager offset */                    "%c%c" /* 2 zeroes */                    "%c%c" /* NT-response length */                    "%c%c" /* NT-response allocated space */                    "%c%c" /* NT-response offset */                    "%c%c" /* 2 zeroes */                                        "%c%c"  /* domain length */                    "%c%c"  /* domain allocated space */                    "%c%c"  /* domain name offset */                    "%c%c"  /* 2 zeroes */                                        "%c%c"  /* user length */                    "%c%c"  /* user allocated space */                    "%c%c"  /* user offset */                    "%c%c"  /* 2 zeroes */                                        "%c%c"  /* host length */                    "%c%c"  /* host allocated space */                    "%c%c"  /* host offset */                    "%c%c%c%c%c%c"  /* 6 zeroes */                                        "\xff\xff"  /* message length */                    "%c%c"  /* 2 zeroes */                                        "\x01\x82" /* flags */                    "%c%c"  /* 2 zeroes */                    /* domain string */                    /* user string */                    /* host string */                    /* LanManager response */                    /* NT response */                    ,                    0, /* zero termination */                    0,0,0, /* type-3 long, the 24 upper bits */                    SHORTPAIR(0x18),  /* LanManager response length, twice */                    SHORTPAIR(0x18),                    SHORTPAIR(lmrespoff),                    0x0, 0x0,                    #ifdef USE_NTRESPONSES                    SHORTPAIR(0x18),  /* NT-response length, twice */                    SHORTPAIR(0x18),#else                    0x0, 0x0,                    0x0, 0x0,#endif                    SHORTPAIR(ntrespoff),                    0x0, 0x0,                    SHORTPAIR(domlen),                    SHORTPAIR(domlen),                    SHORTPAIR(domoff),                    0x0, 0x0,                    SHORTPAIR(userlen),                    SHORTPAIR(userlen),                    SHORTPAIR(useroff),                    0x0, 0x0,                                        SHORTPAIR(hostlen),                    SHORTPAIR(hostlen),                    SHORTPAIR(hostoff),                    0x0, 0x0, 0x0, 0x0, 0x0, 0x0,                                 0x0, 0x0,                    0x0, 0x0);    /* size is now 64 */    size=64;    ntlmbuf[62]=ntlmbuf[63]=0;    memcpy(&ntlmbuf[size], domain, domlen);    size += domlen;    memcpy(&ntlmbuf[size], user, userlen);    size += userlen;    /* we append the binary hashes to the end of the blob */    if(size < ((int)sizeof(ntlmbuf) - 0x18)) {      memcpy(&ntlmbuf[size], lmresp, 0x18);      size += 0x18;    }#ifdef USE_NTRESPONSES    if(size < ((int)sizeof(ntlmbuf) - 0x18)) {            memcpy(&ntlmbuf[size], ntresp, 0x18);      size += 0x18;    }#endif    ntlmbuf[56] = size & 0xff;    ntlmbuf[57] = size >> 8;    /* convert the binary blob into base64 */    size = Curl_base64_encode(ntlmbuf, size, &base64);    if(size >0 ) {      Curl_safefree(*allocuserpwd);      *allocuserpwd = aprintf("%sAuthorization: NTLM %s\r\n",                              proxy?"Proxy-":"",                              base64);      free(base64);    }    else      return CURLE_OUT_OF_MEMORY; /* FIX TODO */    ntlm->state = NTLMSTATE_TYPE3; /* we sent a type-3 */    *ready = TRUE;    /* Switch to web authentication after proxy authentication is done */    if (proxy)      Curl_http_auth_stage(conn->data, 401);  }  break;  case NTLMSTATE_TYPE3:    /* connection is already authenticated,     * don't send a header in future requests */    if(*allocuserpwd) {      free(*allocuserpwd);      *allocuserpwd=NULL;    }    *ready = TRUE;    break;  }  return CURLE_OK;}#endif /* USE_SSLEAY */#endif /* !CURL_DISABLE_HTTP */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -