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

📄 print-smb.c

📁 Windump3.6.2源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    Copyright (C) Andrew Tridgell 1995-1999   This software may be distributed either under the terms of the   BSD-style license that accompanies tcpdump or the GNU GPL version 2   or later */#ifdef HAVE_CONFIG_H#include "config.h"#endif#ifndef lintstatic const char rcsid[] =     "@(#) $Header: /tcpdump/master/tcpdump/print-smb.c,v 1.7 2000/12/05 06:42:47 guy Exp $";#endif
#ifdef WIN32
#include <winsock2.h>
#include "bittypes.h"
#endif /* WIN32 */
#include <stdio.h>#include <string.h>#include <sys/types.h>#include "interface.h"#include "smb.h"static int request=0;const uchar *startbuf=NULL;struct smbdescript{  char *req_f1;  char *req_f2;  char *rep_f1;  char *rep_f2;  void (*fn)(); /* sometimes (u_char *, u_char *, u_char *, u_char *)		and sometimes (u_char *, u_char *, int, int) */};struct smbfns{  int id;  char *name;  int flags;  struct smbdescript descript;};#define DEFDESCRIPT  {NULL,NULL,NULL,NULL,NULL}#define FLG_CHAIN (1<<0)static struct smbfns *smbfind(int id,struct smbfns *list){  int sindex;  for (sindex=0;list[sindex].name;sindex++)     if (list[sindex].id == id) return(&list[sindex]);  return(&list[0]);}static void trans2_findfirst(uchar *param,uchar *data,int pcnt,int dcnt){  char *fmt;  if (request) {    fmt = "Attribute=[A]\nSearchCount=[d]\nFlags=[w]\nLevel=[dP5]\nFile=[S]\n";  } else {    fmt = "Handle=[w]\nCount=[d]\nEOS=[w]\nEoffset=[d]\nLastNameOfs=[w]\n";  }  fdata(param,fmt,param+pcnt);  if (dcnt) {    printf("data:\n");    print_data(data,dcnt);  }}static void trans2_qfsinfo(uchar *param,uchar *data,int pcnt,int dcnt){  static int level=0;  char *fmt="";  if (request) {    level = SVAL(param,0);    fmt = "InfoLevel=[d]\n";    fdata(param,fmt,param+pcnt);  } else {    switch (level) {    case 1:      fmt = "idFileSystem=[W]\nSectorUnit=[D]\nUnit=[D]\nAvail=[D]\nSectorSize=[d]\n";      break;    case 2:      fmt = "CreationTime=[T2]VolNameLength=[B]\nVolumeLabel=[s12]\n";      break;    case 0x105:      fmt = "Capabilities=[W]\nMaxFileLen=[D]\nVolNameLen=[D]\nVolume=[S]\n";      break;    default:      fmt = "UnknownLevel\n";    }    fdata(data,fmt,data+dcnt);  }  if (dcnt) {    printf("data:\n");    print_data(data,dcnt);  }}struct smbfns trans2_fns[] = {{0,"TRANSACT2_OPEN",0,   {"Flags2=[w]\nMode=[w]\nSearchAttrib=[A]\nAttrib=[A]\nTime=[T2]\nOFun=[w]\nSize=[D]\nRes=([w,w,w,w,w])\nPath=[S]",NULL,    "Handle=[d]\nAttrib=[A]\nTime=[T2]\nSize=[D]\nAccess=[w]\nType=[w]\nState=[w]\nAction=[w]\nInode=[W]\nOffErr=[d]\n|EALength=[d]\n",NULL,NULL}},{1,"TRANSACT2_FINDFIRST",0,   {NULL,NULL,NULL,NULL,trans2_findfirst}},{2,"TRANSACT2_FINDNEXT",0,DEFDESCRIPT},{3,"TRANSACT2_QFSINFO",0,   {NULL,NULL,NULL,NULL,trans2_qfsinfo}},{4,"TRANSACT2_SETFSINFO",0,DEFDESCRIPT},{5,"TRANSACT2_QPATHINFO",0,DEFDESCRIPT},{6,"TRANSACT2_SETPATHINFO",0,DEFDESCRIPT},{7,"TRANSACT2_QFILEINFO",0,DEFDESCRIPT},{8,"TRANSACT2_SETFILEINFO",0,DEFDESCRIPT},{9,"TRANSACT2_FSCTL",0,DEFDESCRIPT},{10,"TRANSACT2_IOCTL",0,DEFDESCRIPT},{11,"TRANSACT2_FINDNOTIFYFIRST",0,DEFDESCRIPT},{12,"TRANSACT2_FINDNOTIFYNEXT",0,DEFDESCRIPT},{13,"TRANSACT2_MKDIR",0,DEFDESCRIPT},{-1,NULL,0,DEFDESCRIPT}};static void print_trans2(uchar *words,uchar *dat,uchar *buf,uchar *maxbuf){  static struct smbfns *fn = &trans2_fns[0];  uchar *data,*param;  uchar *f1=NULL,*f2=NULL;  int pcnt,dcnt;  if (request) {    fn = smbfind(SVAL(words+1,14*2),trans2_fns);    data = buf+SVAL(words+1,12*2);    param = buf+SVAL(words+1,10*2);    pcnt = SVAL(words+1,9*2);    dcnt = SVAL(words+1,11*2);  } else {    data = buf+SVAL(words+1,7*2);    param = buf+SVAL(words+1,4*2);    pcnt = SVAL(words+1,3*2);    dcnt = SVAL(words+1,6*2);  }  printf("%s param_length=%d data_length=%d\n",	 fn->name,pcnt,dcnt);  if (request) {    if (CVAL(words,0) == 8) {      fdata(words+1,"Trans2Secondary\nTotParam=[d]\nTotData=[d]\nParamCnt=[d]\nParamOff=[d]\nParamDisp=[d]\nDataCnt=[d]\nDataOff=[d]\nDataDisp=[d]\nHandle=[d]\n",maxbuf);      return;	        } else {      fdata(words+1,"TotParam=[d]\nTotData=[d]\nMaxParam=[d]\nMaxData=[d]\nMaxSetup=[d]\nFlags=[w]\nTimeOut=[D]\nRes1=[w]\nParamCnt=[d]\nParamOff=[d]\nDataCnt=[d]\nDataOff=[d]\nSetupCnt=[d]\n",words+1+14*2);      fdata(data+1,"TransactionName=[S]\n%",maxbuf);    }    f1 = fn->descript.req_f1;    f2 = fn->descript.req_f2;  } else {    if (CVAL(words,0) == 0) {      printf("Trans2Interim\n");      return;    } else {      fdata(words+1,"TotParam=[d]\nTotData=[d]\nRes1=[w]\nParamCnt=[d]\nParamOff=[d]\nParamDisp[d]\nDataCnt=[d]\nDataOff=[d]\nDataDisp=[d]\nSetupCnt=[d]\n",words+1+10*2);    }    f1 = fn->descript.rep_f1;    f2 = fn->descript.rep_f2;  }  if (fn->descript.fn) {    fn->descript.fn(param,data,pcnt,dcnt);  } else {    fdata(param,f1?f1:(uchar*)"Paramaters=\n",param+pcnt);    fdata(data,f2?f2:(uchar*)"Data=\n",data+dcnt);        }}static void print_browse(uchar *param,int paramlen,const uchar *data,int datalen){  const uchar *maxbuf = data + datalen;  int command = CVAL(data,0);  fdata(param,"BROWSE PACKET\n|Param ",param+paramlen);  switch (command) {  case 0xF:    data = fdata(data,"BROWSE PACKET:\nType=[B] (LocalMasterAnnouncement)\nUpdateCount=[w]\nRes1=[B]\nAnnounceInterval=[d]\nName=[n2]\nMajorVersion=[B]\nMinorVersion=[B]\nServerType=[W]\nElectionVersion=[w]\nBrowserConstant=[w]\n",maxbuf);    break;      case 0x1:    data = fdata(data,"BROWSE PACKET:\nType=[B] (HostAnnouncement)\nUpdateCount=[w]\nRes1=[B]\nAnnounceInterval=[d]\nName=[n2]\nMajorVersion=[B]\nMinorVersion=[B]\nServerType=[W]\nElectionVersion=[w]\nBrowserConstant=[w]\n",maxbuf);    break;      case 0x2:    data = fdata(data,"BROWSE PACKET:\nType=[B] (AnnouncementRequest)\nFlags=[B]\nReplySystemName=[S]\n",maxbuf);    break;      case 0xc:    data = fdata(data,"BROWSE PACKET:\nType=[B] (WorkgroupAnnouncement)\nUpdateCount=[w]\nRes1=[B]\nAnnounceInterval=[d]\nName=[n2]\nMajorVersion=[B]\nMinorVersion=[B]\nServerType=[W]\nCommentPointer=[W]\nServerName=[S]\n",maxbuf);    break;  case 0x8:    data = fdata(data,"BROWSE PACKET:\nType=[B] (ElectionFrame)\nElectionVersion=[B]\nOSSummary=[W]\nUptime=[(W,W)]\nServerName=[S]\n",maxbuf);    break;      case 0xb:    data = fdata(data,"BROWSE PACKET:\nType=[B] (BecomeBackupBrowser)\nName=[S]\n",maxbuf);    break;      case 0x9:    data = fdata(data,"BROWSE PACKET:\nType=[B] (GetBackupList)\nListCount?=[B]\nToken?=[B]\n",maxbuf);    break;      case 0xa:    data = fdata(data,"BROWSE PACKET:\nType=[B] (BackupListResponse)\nServerCount?=[B]\nToken?=[B]*Name=[S]\n",maxbuf);    break;      case 0xd:    data = fdata(data,"BROWSE PACKET:\nType=[B] (MasterAnnouncement)\nMasterName=[S]\n",maxbuf);    break;      case 0xe:    data = fdata(data,"BROWSE PACKET:\nType=[B] (ResetBrowser)\nOptions=[B]\n",maxbuf);    break;      default:    data = fdata(data,"Unknown Browser Frame ",maxbuf);    break;  }}static void print_ipc(uchar *param,int paramlen,uchar *data,int datalen){  if (paramlen)    fdata(param,"Command=[w]\nStr1=[S]\nStr2=[S]\n",param+paramlen);  if (datalen)    fdata(data,"IPC ",data+datalen);}static void print_trans(uchar *words,uchar *data1,uchar *buf,uchar *maxbuf){  uchar *f1,*f2,*f3,*f4;  uchar *data,*param;  int datalen,paramlen;  if (request) {    paramlen = SVAL(words+1,9*2);    param = buf + SVAL(words+1,10*2);    datalen = SVAL(words+1,11*2);    data = buf + SVAL(words+1,12*2);    f1 = "TotParamCnt=[d] \nTotDataCnt=[d] \nMaxParmCnt=[d] \nMaxDataCnt=[d]\nMaxSCnt=[d] \nTransFlags=[w] \nRes1=[w] \nRes2=[w] \nRes3=[w]\nParamCnt=[d] \nParamOff=[d] \nDataCnt=[d] \nDataOff=[d] \nSUCnt=[d]\n";    f2 = "|Name=[S]\n";    f3 = "|Param ";    f4 = "|Data ";  } else {    paramlen = SVAL(words+1,3*2);    param = buf + SVAL(words+1,4*2);    datalen = SVAL(words+1,6*2);    data = buf + SVAL(words+1,7*2);    f1 = "TotParamCnt=[d] \nTotDataCnt=[d] \nRes1=[d]\nParamCnt=[d] \nParamOff=[d] \nRes2=[d] \nDataCnt=[d] \nDataOff=[d] \nRes3=[d]\nLsetup=[d]\n";    f2 = "|Unknown ";    f3 = "|Param ";    f4 = "|Data ";  }  fdata(words+1,f1,MIN(words+1+2*CVAL(words,0),maxbuf));  fdata(data1+2,f2,maxbuf - (paramlen + datalen));  if (!strcmp(data1+2,"\\MAILSLOT\\BROWSE")) {    print_browse(param,paramlen,data,datalen);    return;  }  if (!strcmp(data1+2,"\\PIPE\\LANMAN")) {    print_ipc(param,paramlen,data,datalen);    return;  }  if (paramlen) fdata(param,f3,MIN(param+paramlen,maxbuf));  if (datalen) fdata(data,f4,MIN(data+datalen,maxbuf));}static void print_negprot(uchar *words,uchar *data,uchar *buf,uchar *maxbuf){  uchar *f1=NULL,*f2=NULL;  if (request) {    f2 = "*|Dialect=[Z]\n";  } else {    if (CVAL(words,0) == 1) {      f1 = "Core Protocol\nDialectIndex=[d]";    } else if (CVAL(words,0) == 17) {      f1 = "NT1 Protocol\nDialectIndex=[d]\nSecMode=[B]\nMaxMux=[d]\nNumVcs=[d]\nMaxBuffer=[D]\nRawSize=[D]\nSessionKey=[W]\nCapabilities=[W]\nServerTime=[T3]TimeZone=[d]\nCryptKey=";    } else if (CVAL(words,0) == 13) {      f1 = "Coreplus/Lanman1/Lanman2 Protocol\nDialectIndex=[d]\nSecMode=[w]\nMaxXMit=[d]\nMaxMux=[d]\nMaxVcs=[d]\nBlkMode=[w]\nSessionKey=[W]\nServerTime=[T1]TimeZone=[d]\nRes=[W]\nCryptKey=";    }  }  if (f1)     fdata(words+1,f1,MIN(words + 1 + CVAL(words,0)*2,maxbuf));  else    print_data(words+1,MIN(CVAL(words,0)*2,PTR_DIFF(maxbuf,words+1)));    if (f2)     fdata(data+2,f2,MIN(data + 2 + SVAL(data,0),maxbuf));  else    print_data(data+2,MIN(SVAL(data,0),PTR_DIFF(maxbuf,data+2)));    }static void print_sesssetup(uchar *words,uchar *data,uchar *buf,uchar *maxbuf){  int wcnt = CVAL(words,0);  uchar *f1=NULL,*f2=NULL;  if (request) {    if (wcnt==10) {      f1 = "Com2=[w]\nOff2=[d]\nBufSize=[d]\nMpxMax=[d]\nVcNum=[d]\nSessionKey=[W]\nPassLen=[d]\nCryptLen=[d]\nCryptOff=[d]\nPass&Name=\n";    } else {      f1 = "Com2=[B]\nRes1=[B]\nOff2=[d]\nMaxBuffer=[d]\nMaxMpx=[d]\nVcNumber=[d]\nSessionKey=[W]\nCaseInsensitivePasswordLength=[d]\nCaseSensitivePasswordLength=[d]\nRes=[W]\nCapabilities=[W]\nPass1&Pass2&Account&Domain&OS&LanMan=\n";    }  } else {    if (CVAL(words,0) == 3) {      f1 = "Com2=[w]\nOff2=[d]\nAction=[w]\n";    } else if (CVAL(words,0) == 13) {      f1 = "Com2=[B]\nRes=[B]\nOff2=[d]\nAction=[w]\n";      f2 = "NativeOS=[S]\nNativeLanMan=[S]\nPrimaryDomain=[S]\n";    }  }  if (f1)     fdata(words+1,f1,MIN(words + 1 + CVAL(words,0)*2,maxbuf));  else    print_data(words+1,MIN(CVAL(words,0)*2,PTR_DIFF(maxbuf,words+1)));    if (f2)     fdata(data+2,f2,MIN(data + 2 + SVAL(data,0),maxbuf));  else    print_data(data+2,MIN(SVAL(data,0),PTR_DIFF(maxbuf,data+2))); }static struct smbfns smb_fns[] = {{-1,"SMBunknown",0,DEFDESCRIPT},{SMBtcon,"SMBtcon",0,   {NULL,"Path=[Z]\nPassword=[Z]\nDevice=[Z]\n",    "MaxXmit=[d]\nTreeId=[d]\n",NULL,    NULL}},{SMBtdis,"SMBtdis",0,DEFDESCRIPT},{SMBexit,"SMBexit",0,DEFDESCRIPT},{SMBioctl,"SMBioctl",0,DEFDESCRIPT},{SMBecho,"SMBecho",0,   {"ReverbCount=[d]\n",NULL,    "SequenceNum=[d]\n",NULL,    NULL}},{SMBulogoffX, "SMBulogoffX",FLG_CHAIN,DEFDESCRIPT},{SMBgetatr,"SMBgetatr",0,   {NULL,"Path=[Z]\n",    "Attribute=[A]\nTime=[T2]Size=[D]\nRes=([w,w,w,w,w])\n",NULL,    NULL}},{SMBsetatr,"SMBsetatr",0,   {"Attribute=[A]\nTime=[T2]Res=([w,w,w,w,w])\n","Path=[Z]\n",    NULL,NULL,NULL}},{SMBchkpth,"SMBchkpth",0,   {NULL,"Path=[Z]\n",NULL,NULL,NULL}},{SMBsearch,"SMBsearch",0,{"Count=[d]\nAttrib=[A]\n","Path=[Z]\nBlkType=[B]\nBlkLen=[d]\n|Res1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\n","Count=[d]\n","BlkType=[B]\nBlkLen=[d]\n*\nRes1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\nAttrib=[a]\nTime=[T1]Size=[D]\nName=[s13]\n",NULL}},{SMBopen,"SMBopen",0,   {"Mode=[w]\nAttribute=[A]\n","Path=[Z]\n",    "Handle=[d]\nOAttrib=[A]\nTime=[T2]Size=[D]\nAccess=[w]\n",NULL,    NULL}},{SMBcreate,"SMBcreate",0,   {"Attrib=[A]\nTime=[T2]","Path=[Z]\n",    "Handle=[d]\n",NULL,    NULL}},{SMBmknew,"SMBmknew",0,   {"Attrib=[A]\nTime=[T2]","Path=[Z]\n",    "Handle=[d]\n",NULL,    NULL}},{SMBunlink,"SMBunlink",0,   {"Attrib=[A]\n","Path=[Z]\n",NULL,NULL,NULL}},{SMBread,"SMBread",0,   {"Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n",NULL,    "Count=[d]\nRes=([w,w,w,w])\n",NULL,NULL}},{SMBwrite,"SMBwrite",0,   {"Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n",NULL,    "Count=[d]\n",NULL,NULL}},{SMBclose,"SMBclose",0,   {"Handle=[d]\nTime=[T2]",NULL,NULL,NULL,NULL}},{SMBmkdir,"SMBmkdir",0,   {NULL,"Path=[Z]\n",NULL,NULL,NULL}},{SMBrmdir,"SMBrmdir",0,   {NULL,"Path=[Z]\n",NULL,NULL,NULL}},{SMBdskattr,"SMBdskattr",0,{NULL,NULL,"TotalUnits=[d]\nBlocksPerUnit=[d]\nBlockSize=[d]\nFreeUnits=[d]\nMedia=[w]\n",NULL,NULL}},{SMBmv,"SMBmv",0,   {"Attrib=[A]\n","OldPath=[Z]\nNewPath=[Z]\n",NULL,NULL,NULL}},/* this is a Pathworks specific call, allowing the    changing of the root path */{pSETDIR,"SMBsetdir",0,   {NULL,"Path=[Z]\n",NULL,NULL,NULL}},{SMBlseek,"SMBlseek",0,   {"Handle=[d]\nMode=[w]\nOffset=[D]\n","Offset=[D]\n",NULL,NULL}},{SMBflush,"SMBflush",0,   {"Handle=[d]\n",NULL,NULL,NULL,NULL}},{SMBsplopen,"SMBsplopen",0,   {"SetupLen=[d]\nMode=[w]\n","Ident=[Z]\n","Handle=[d]\n",NULL,NULL}},{SMBsplclose,"SMBsplclose",0,   {"Handle=[d]\n",NULL,NULL,NULL,NULL}},{SMBsplretq,"SMBsplretq",0,   {"MaxCount=[d]\nStartIndex=[d]\n",NULL,    "Count=[d]\nIndex=[d]\n",    "*Time=[T2]Status=[B]\nJobID=[d]\nSize=[D]\nRes=[B]Name=[s16]\n",    NULL}},{SMBsplwr,"SMBsplwr",0,   {"Handle=[d]\n",NULL,NULL,NULL,NULL}},{SMBlock,"SMBlock",0,   {"Handle=[d]\nCount=[D]\nOffset=[D]\n",NULL,NULL,NULL,NULL}},{SMBunlock,"SMBunlock",0,   {"Handle=[d]\nCount=[D]\nOffset=[D]\n",NULL,NULL,NULL,NULL}},/* CORE+ PROTOCOL FOLLOWS */{SMBreadbraw,"SMBreadbraw",0,{"Handle=[d]\nOffset=[D]\nMaxCount=[d]\nMinCount=[d]\nTimeOut=[D]\nRes=[d]\n", NULL,NULL,NULL,NULL}},{SMBwritebraw,"SMBwritebraw",0,{"Handle=[d]\nTotalCount=[d]\nRes=[w]\nOffset=[D]\nTimeOut=[D]\nWMode=[w]\nRes2=[W]\n|DataSize=[d]\nDataOff=[d]\n",NULL,"WriteRawAck",NULL,NULL}},{SMBwritec,"SMBwritec",0,   {NULL,NULL,"Count=[d]\n",NULL,NULL}},{SMBwriteclose,"SMBwriteclose",0,   {"Handle=[d]\nCount=[d]\nOffset=[D]\nTime=[T2]Res=([w,w,w,w,w,w])",NULL,    "Count=[d]\n",NULL,NULL}},{SMBlockread,"SMBlockread",0,   {"Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n",NULL,    "Count=[d]\nRes=([w,w,w,w])\n",NULL,NULL}},{SMBwriteunlock,"SMBwriteunlock",0,   {"Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n",NULL,    "Count=[d]\n",NULL,NULL}},{SMBreadBmpx,"SMBreadBmpx",0,{"Handle=[d]\nOffset=[D]\nMaxCount=[d]\nMinCount=[d]\nTimeOut=[D]\nRes=[w]\n",NULL,"Offset=[D]\nTotCount=[d]\nRemaining=[d]\nRes=([w,w])\nDataSize=[d]\nDataOff=[d]\n",NULL,NULL}},{SMBwriteBmpx,"SMBwriteBmpx",0,{"Handle=[d]\nTotCount=[d]\nRes=[w]\nOffset=[D]\nTimeOut=[D]\nWMode=[w]\nRes2=[W]\nDataSize=[d]\nDataOff=[d]\n",NULL,"Remaining=[d]\n",NULL,NULL}},{SMBwriteBs,"SMBwriteBs",0,   {"Handle=[d]\nTotCount=[d]\nOffset=[D]\nRes=[W]\nDataSize=[d]\nDataOff=[d]\n",NULL,    "Count=[d]\n",NULL,NULL}},{SMBsetattrE,"SMBsetattrE",0,   {"Handle=[d]\nCreationTime=[T2]AccessTime=[T2]ModifyTime=[T2]",NULL,      NULL,NULL,NULL}},{SMBgetattrE,"SMBgetattrE",0,{"Handle=[d]\n",NULL, "CreationTime=[T2]AccessTime=[T2]ModifyTime=[T2]Size=[D]\nAllocSize=[D]\nAttribute=[A]\n",NULL,NULL}},{SMBtranss,"SMBtranss",0,DEFDESCRIPT},{SMBioctls,"SMBioctls",0,DEFDESCRIPT},{SMBcopy,"SMBcopy",0,   {"TreeID2=[d]\nOFun=[w]\nFlags=[w]\n","Path=[S]\nNewPath=[S]\n",    "CopyCount=[d]\n","|ErrStr=[S]\n",NULL}},

⌨️ 快捷键说明

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