home *** CD-ROM | disk | FTP | other *** search
-
- ==Phrack Inc.=
-
- Volume Three, Issue 30, File #7 of 12
-
- =-------------------=
-
- VAX/VMS Fake Mail
-
- by Jack T. Tab
-
- =-------------------=
-
-
- In the August 1986 issue of VAX PROFESSIONAL, the BASIC subroutine that appears
- at the end of this text was published. It was not until more than two years
- later that DEC included a callable mail interface with VMS 5.x. While the
- official version is much more extensive, the routine included here has one
- important feature. The ability to have a mail message appear to be from
- someone else is a good addition to most "toolkits."
-
- VMS Mail works in two manners. The first is the familiar interactive. The
- second is as a network object. In this method, MAIL is invoked by the
- NETSERVER.COM command procedure in response to an incoming connect request.
- MAIL.EXE is activated as network object 27. The other network objects can be
- viewed by using the NCP command SHOW KNOWN OBJECTS. In this mode, MAIL.EXE
- operates as a slave process, receiving instructions from the master process.
- The master, in most cases, is another process running MAIL.EXE interactively.
- The slave process can handle requests to deliver mail to as many recipients as
- necessary. Addresses that are not on the same node as the slave process are
- forwarded by activating yet another slave process on the target node. The
- information sent by the master MAIL to the slave MAIL is quite simple and
- straightforward, consisting of a series of strings.
-
- The first string is for the FROM name. This is what makes the subroutine
- useful, as it can be anything (i.e. the_Easter_Bunny). The next set of strings
- are to whom the mail is to be sent. One address per string, with a null
- string, chr(0), terminating the list. The third item is what the receiver(s)
- sees in their TO: field. This also can be anything. VMS MAIL can use this
- option for its .DIS distribution lists. The final information is the body of
- the message. It too is terminated by another null string. The subject of the
- mail message is taken from the first line of this text.
-
- The MAIL slave will send back appropriate status messages indicating problems
- if they occur. Such as "Addressee Unknown" or VMS and DECnet errors like "Disk
- Quota Exceeded" or "Remote Node Not Reachable").
-
- The only privilege that seems necessary is NETMBX. Without it the subroutine
- cannot call MAIL as a network object. Our beloved system management resolved
- the problem of people pretending to be SYSTEM by installing MAIL with NETMBX
- and removing the priv from the student accounts. The subroutine works just as
- well with JNET and BITNET as it does with DECNET addresses.
-
-
- ***********************************CUT HERE************************************
- 1 %TITLE 'MAIL SUBROUTINE'
-
- SUB MAILT( STRING NODE, & STRING FROM_NAME, & STRING
- TO_LIST(), & STRING TO_SHOW, & STRING SUBJECT, & STRING
- TEXT() )
-
- OPTION TYPE = INTEGER
-
- DECLARE INTEGER FUNCTION & PUT_MSG
-
- DECLARE STRING FUNCTION & GET_MSG, & GET_INPUT
-
- DECLARE INTEGER CONSTANT & TRUE = -1, & FALSE = 0 Net_Link_Open
- = FALSE
-
- Z = POS( NODE + ":" , ":" , 1) NODE_NAME$ = LEFT$( NODE , Z - 1 ) ON
- ERROR GOTO Mail_Net_Error MAIL_CHANNEL = 12 OPEN NODE_NAME$ + '::"27="'
- AS FILE MAIL_CHANNEL
-
- Net_Link_Open = TRUE
-
- STS = PUT_MSG( FROM_NAME ) IF STS <> 0 THEN GOTO ERROR_DONE END
- IF RECEIVERS = 0 TO_COUNT = 1
-
- Mail_Recipients: IF TO_LIST( TO_COUNT ) = "" THEN GOTO End_Of_Line
- END IF STS = PUT_MSG( EDIT$( TO_LIST( TO_COUNT ) , 32 ) ) IF STS <> 0
- THEN GOTO Error_Done END IF GOSUB Errchk IF LINK_ERR <> 0
- THEN GOTO Error_Done END IF
-
- IF ( ERRSTS AND 1 ) = 0 THEN
- GOTO Error_Done
- END IF
-
- TO_COUNT = TO_COUNT + 1
- GOTO Mail_Recipients
-
- END_OF_LINE:
- STS = PUT_MSG( CHR$(0) )
- IF STS <> 0 THEN
- GOTO Error_Done
- END IF
- IF RECEIVERS = 0 THEN
- GOTO Mail_Done
- END IF
-
- STS = PUT_MSG( TO_SHOW )
- IF STS <> 0 THEN
- GOTO Error_Done
- END IF
-
- STS = PUT_MSG( SUBJECT )
- IF STS <> 0 THEN
- GOTO Error_Done
- END IF
-
- FOR I = 1 UNTIL TEXT(I) = CHR$(255)
- STS = PUT_MSG( TEXT(I) )
- IF STS <> 0 THEN
- GOTO Error_Done
- END IF
- NEXT I
-
- STS = PUT_MSG( CHR$(0) )
- IF STS <> 0 THEN
- GOTO Error_Done
- END IF
- SAVE_COUNT = RECEIVERS
- INDEX = 0
-
- Delivery_Check:
- GOSUB Errchk
- IF LINK_ERR <> 0 THEN
- GOTO Error_Done
- END IF
- INDEX = INDEX + 1
- IF INDEX <> SAVE_COUNT THEN
- GOTO Delivery_Check
- END IF
- GOTO Mail_Done
-
- Errchk:
- MAIL_STS = ASCII( GET_MSG )
- IF LINK_ERR <> 0 THEN
- ERRSTS = LINK_ERR
- RETURN END IF
- IF ( MAIL_STS AND 1 ) = 1 THEN
- Receivers = Receivers + 1
- ERRSTS = MAIL_STS
- RETURN END IF
-
- Errmsg:
- MAIL_ERR$ = GET_MSG
- IF LINK_ERR <> 0 THEN
- ERRSTS = LINK_ERR
- RETURN END IF
- IF LEN( MAIL_ERR$ ) <> 1 THEN
- PRINT MAIL_ERR$
- GOTO Errmsg
- END IF
- IF ASCII( MAIL_ERR$ ) = 0 THEN
- RETURN
- ELSE
- GOTO Errmsg
- END IF
-
- DEF INTEGER PUT_MSG( STRING M )
- ON ERROR GOTO 1550
- MLEN = LEN( M )
- MOVE TO # MAIL_CHANNEL , M = MLEN
- PUT # MAIL_CHANNEL, COUNT MLEN
- PUT_MSG = 0
- EXIT DEF
-
- 1550 RESUME 1555
-
- 1555 PUT_MSG = ERR
- END DEF
-
- DEF STRING GET_INPUT( INTEGER C )
- EOF = FALSE
- ON ERROR GOTO 1650
- GET # C
- R = RECOUNT
- MOVE FROM #C , TEMP$ = R
- GET_INPUT = TEMP$
- EXIT DEF
-
- 1650 RESUME 1655
-
- 1655 EOF = TRUE
- END DEF
-
- DEF STRING GET_MSG
- ON ERROR GOTO 1750
- GET # MAIL_CHANNEL
- R = RECOUNT
- MOVE FROM # MAIL_CHANNEL , TEMP$ = R
- GET_MSG = TEMP$
- LINK_ERR = 0
- EXIT DEF
-
- 1750 RESUME
-
- 1755 LINK_ERR = ERR
- END DEF
-
- Mail_Net_Error: RESUME 1900
-
- 1900 PRINT "%Network communications error."
-
- Error_Done:
-
- Mail_Done:
- IF Net_Link_Open THEN
- CLOSE MAIL_CHANNEL
- END IF
-
- END SUB
- ***********************************CUT HERE************************************
- _______________________________________________________________________________
-