Finding where an executable was run from -- a proposal.

Dennis L. Mumaugh dlm at cuuxb.ATT.COM
Wed May 25 04:39:37 AEST 1988


In article <4626 at hoptoad.uucp> gnu at hoptoad.uucp (John Gilmore) writes:
>Actually, that's not the point (you could always write a subroutine
>that searched the path to find argv[0]).  The point is that I want a
>mechanism that cannot be spoofed.  Mystery variables in the
>environment, library routines that look at argv[0], etc, can all be
>spoofed by a 3-line program (that changes the environment then calls
>exec(), or that passes different things as the filename to execute
>versus argv[0] to exec()).  If real applications are going to use this,
>it's critical that they are able to depend upon the pointer they find.

There is such a facility that originated in Version 8  that  will
see  light  of  day in NEW ATT releases of UNIX.  This is part of
the /proc file system.  It  is  an  ioctl  that  returns  a  file
descriptor of the text of the process.
    PIOCOPENT -- provides a read-only  file  descriptor  for  the
    executable  file  associated with the "traced" process.  This
    allows a debugger to find the symbol table without having  to
    know any path names.

Once you have the file descriptor, fstat it and get  the  device,
inode  pair,  and then execute ncheck -i on the correct device to
get a path name.  Of course  this  is  modulo  links  (  hard  or
symbolic).

What?  You must be root to run ncheck?  True, but why  would  you
be so concerned about being lied to otherwise.

Actually, the PIOCOPENT would have been very useful  for  the  V6
Adventure  game that Jim Gillogly wrote.  He put the messages for
the game at the end of the a.out following the "meaningful"  part
of  the  a.out.  His program did all sorts of contortions to find
the name of the file so it could be opened and read. [It  had  to
be installation and user independent/proff.]

With the ioctl from /proc, it would be a three line code section:

	sprintf(procname,"/proc/%05d",getpid());
	procfd = open(procname,O_RDONLY);
	textfd = ioctl(procfd,PIOCOPENT);
	lseek(textfd, (long)offset,0);

So, if that is what you are really intending to do, use Version 8
or wait a year -- it is already available for System V Release 3.1. for
the 3B4000.
-- 
=Dennis L. Mumaugh
 Lisle, IL       ...!{ihnp4,cbosgd,lll-crg}!cuuxb!dlm



More information about the Comp.unix.wizards mailing list