All pastes #2090837 Raw Edit

Someone

public text v1 · immutable
#2090837 ·published 2011-10-17 16:08 UTC
rendered paste body

#!/usr/sbin/dtrace -Cs

#pragma D option flowindent

/* typedef uint16_t	sa_family_t; */

/* type redeclared: struct sockaddr */
/* struct sockaddr { */
/* 	sa_family_t	sa_family;	/\* address family *\/ */
/* 	char		sa_data[14];	/\* up to 14 bytes of direct address *\/ */
/* }; */

/* struct sockaddr_in { */
/* 	sa_family_t	sin_family; */
/* 	in_port_t	sin_port; */
/* 	struct	in_addr sin_addr; */
/* 	char		sin_zero[8]; */
/* }; */

/* typedef union lptr { */
/* 	uint64_t lp_ll; */
/* #ifdef _LP64 */
/* 	void	*lp_ptr; */
/* #endif */
/* #ifdef _ILP32 */
/* 	void	*_lp_p2[2]; */
/* #ifdef _LITTLE_ENDIAN */
/* #define	lp_ptr	_lp_p2[0] */
/* #define	lp_pad	_lp_p2[1] */
/* #else /\* _ENDIAN *\/ */
/* #define	lp_pad	_lp_p2[0] */
/* #define	lp_ptr	_lp_p2[1] */
/* #endif /\* _ENDIAN *\/ */
/* #endif /\* _ILP32 *\/ */
/* } lptr_t; */

#define	SMBIOC_HASH_SZ	16

struct smb_iods {
	int32_t		is_tran_fd;	/* transport FD */
	uint32_t	is_vcflags;	/* SMBV_... */
	uint8_t 	is_hflags;	/* SMB header flags */
	uint16_t	is_hflags2;	/* SMB header flags2 */
	uint16_t	is_smbuid;	/* SMB header UID */
	uint16_t	is_next_mid;	/* SMB header MID */
	uint32_t	is_txmax;	/* max tx/rx packet size */
	uint32_t	is_rwmax;	/* max read/write data size */
	uint32_t	is_rxmax;	/* max readx data size */
	uint32_t	is_wxmax;	/* max writex data size */
	uint8_t		is_ssn_key[SMBIOC_HASH_SZ]; /* session key */
	/* Signing state */
	uint32_t	is_next_seq;	/* my next sequence number */
	uint32_t	is_u_maclen;	/* MAC key length */
	lptr_t		is_u_mackey;	/* user-space ptr! */
};

struct smbioc_ssn_work {
	smb_iods_t	wk_iods;
	smb_sopt_t	wk_sopt;
	int		wk_out_state;
};
/* typedef struct smbioc_ssn_work smbioc_ssn_work_t; */

#define	NTLM_CHAL_SZ		8	/* challenge size */

#define	SMBIOC_MAX_NAME		256

union smbioc_sockaddr {
	struct sockaddr sa;	/* generic */
	struct sockaddr_in sin;
	struct sockaddr_in6 sin6;
};
/* typedef union smbioc_sockaddr smbioc_sockaddr_t; */

struct smbioc_ssn_ident {
	smbioc_sockaddr_t id_srvaddr;
	char		id_domain[SMBIOC_MAX_NAME];
	char		id_user[SMBIOC_MAX_NAME];
};
/* typedef struct smbioc_ssn_ident smbioc_ssn_ident_t; */

struct smbioc_ossn {
	uint32_t		ssn_vopt;	/* i.e. SMBVOPT_CREATE */
	uint32_t		ssn_owner;	/* Unix owner (UID) */
	smbioc_ssn_ident_t	ssn_id;
	char			ssn_srvname[SMBIOC_MAX_NAME];
};

#define	NTLM_HASH_SZ		SMBIOC_HASH_SZ

struct smb_iod_ssn {
	struct smbioc_ossn iod_ossn;
	int		iod_authflags;	/* SMB_AT_x */
	uchar_t		iod_nthash[NTLM_HASH_SZ];
	uchar_t		iod_lmhash[NTLM_HASH_SZ];
	/* Kerberos cred. cache res. name? */
};
/* typedef struct smb_iod_ssn smb_iod_ssn_t; */

struct smb_ctx {
	int		ct_flags;	/* SMBCF_ */
	int		ct_dev_fd;	/* device handle */
	int		ct_door_fd;	/* to smbiod */
	int		ct_parsedlevel;
	int		ct_minlevel;
	int		ct_maxlevel;
	char		*ct_fullserver; /* orig. server name from cmd line */
	char		*ct_srvaddr_s;	/* hostname or IP address of server */
	struct addrinfo *ct_addrinfo;	/* IP addresses of the server */
	struct nb_ctx	*ct_nb;		/* NetBIOS info. */
	char		*ct_locname;	/* local (machine) name */
	struct smb_iod_ssn	ct_iod_ssn;
	/* smbioc_oshare_t	ct_sh; XXX */
	int		ct_minauth;
	int		ct_shtype_req;	/* share type wanted */
	char		*ct_origshare;
	char		*ct_home;
	char		*ct_rpath;	/* remote file name */

	/* Connection setup SMB stuff. */
	/* Strings from the SMB negotiate response. */
	char		*ct_srv_OS;
	char		*ct_srv_LM;

	/* NTLM auth. stuff */
	uchar_t		ct_clnonce[NTLM_CHAL_SZ];
	uchar_t		ct_ntlm_chal[NTLM_CHAL_SZ];
	char		ct_password[SMBIOC_MAX_NAME];

	/* See ssp.c */
	void		*ct_ssp_ctx;
	smbioc_ssn_work_t ct_work;
};

pid$target::smb_ctx_setfullserver:entry
{
	/* this->ctx = (struct smb_ctx*)copyin(arg0, sizeof (struct smb_ctx)); */
	self->ctx = (struct smb_ctx*)copyin(arg0, sizeof (struct smb_ctx));

	printf("name: %s\n", copyinstr(arg1));

	/* /\* OK *\/ */
	/* printf("ct_minlevel: %d, ct_maxlevel: %d\n", */
	/*        self->ctx->ct_minlevel, */
	/*        self->ctx->ct_maxlevel); */

	/* printf("ctx->ct_fullserver[0]: %c\n", this->ctx->ct_fullserver[0]); */

	/* printf("ctx->ct_fullserver: %s\n", */
	/*        this->ctx->ct_fullserver != NULL ? */
	/*        stringof(this->ctx->ct_fullserver) : "<NULL>" */
	/*        ); */

}

pid$target::smb_ctx_setfullserver:return
{
	/* this->ctx = (struct smb_ctx*)copyin(self->ctx, sizeof (struct smb_ctx)); */

	printf("ct_minlevel: %d, ct_maxlevel: %d\n",
	       self->ctx->ct_minlevel,
	       self->ctx->ct_maxlevel);

	printf("ctx->ct_fullserver: %s\n",
	       self->ctx->ct_fullserver != NULL ?
	       stringof(self->ctx->ct_fullserver) : "<NULL>"
	       );

	exit(0);
}

/* fbt:smbsrv::entry */
/* { */

/* } */

/*
 * # ./smbsrv.d -p 102694
 * dtrace: script './smbsrv.d' matched 2 probes
 * CPU FUNCTION                                 
 *   0  -> smb_ctx_setfullserver                 name: foo
 * 
 *   0  <- smb_ctx_setfullserver                 ct_minlevel: 0, ct_maxlevel: 3
 * ctx->ct_fullserver: <NULL>
 */