📄 print-smb.c
字号:
/* 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 + -