Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 2 Sep 2000 20:01:50 +0200 (CEST)
From:      awr <awr@plan9.hert.org>
To:        Pavlin Ivanov Radoslavov <pavlin@catarina.usc.edu>
Cc:        freebsd-hackers@FreeBSD.ORG, sef@FreeBSD.ORG
Subject:   Re: Q: System call interception
Message-ID:  <Pine.BSF.4.03.10009021941570.7193-100000@plan9.hert.org>
In-Reply-To: <200009030800.BAA32964@rumi.usc.edu>

next in thread | previous in thread | raw e-mail | index | archive | help

Intercepting syscalls is very easy.  In my mind, what you should do is
write a KLD that creates a syscall that mimicks the actions of what
syscall you are going to hijack.  Your new syscall will only look at the
struct ##syscall_args *uap pointer [kernel land argument to syscall] and
modify it.  After modifying, all you'll have to do is just call the old
syscall.  In generic terms, here's what i did for hijacking open(2):


  static int
  open_wrap(struct proc *p, struct open_args *uap)
  {
    /* mess with what's getting pased */
    

    ret = open(p, uap);		/* call real open */
    return(ret);
  }

statitc struct sysent open_wrap_s = {
  3,	/* # of argumentsbeing passed to it */
  open_wrap	/* func pointer to our syscall */
};


static int
load_handler(...)
{
 ...

 MOD_LOAD:
	...
	sysent[SYS_open] = open_wrap_s;
        ....
 MOD_UNLOAD
	sysent[SYS_open].sy_call = (sy_call_t *)open; /* put back old */

}
 

Then, all you'ld have to do is load the kld and your calls would be
intercepted by the wrapping syscall.

For more details:

  http://subterrain.net/~awr/KLD-Tutorial/
  	Introduction to writing KLDs & an examples tar.gz
  http://thc.pimmel.com/files/thc/bsdkern.html
	Good tutorial on more blackhat related things to do
	with KLDs.

Hope this helps.


Andrew 


On Sun, 3 Sep 2000, Pavlin Ivanov Radoslavov wrote:

> 
> I need to write some code that will be like a wrapper
> for some user-level binaries and will intercept some system calls
> before and after each call, and eventually modify the arguments
> and/or the result.
> 
> First I was looking at ptrace(3), but seems that the
> *BSD ptrace doesn't have the equivalent of PTRACE_SYSCALL.
> 
> I tried to use the /proc file system, but I ran into a problem.
> By adapting the truss(1) code I could intercept
> a child process's system calls (before and after the syscall is
> completed).
> However, if I want to modify the return result for example by
> writing to the registers (using write() to "/proc/%d/regs"), I get
> error "Device busy". 
> The procfs(5) man page says that I can write to the registers only
> if the child process is stopped, but seems like that
> successful "ioctl(PIOCWAIT)" before the writing to the registers is
> not enough.
> Playing with writing "attach", "wait", etc. to /proc/%d/ctl
> didn't help either.
> 
> I did some search around to find sample code how to modify the
> intercepted syscalls behavior, but coudn't find any. Any suggestions
> or ideas?
> 
> Thanks,
> Pavlin
> 
> P.S. Tested OS version: FreeBSD-4.1 and 3.2
> 
> 
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-hackers" in the body of the message
> 



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.03.10009021941570.7193-100000>