OS-X Linux拦截进程调用

时间:2012-03-21 16:18:08

标签: linux process call intercept

如何拦截从我的进程调用的其他进程发出的调用。 (比如说 - 我打电话给make,我想截取并修改来自make的gcc调用)。

3 个答案:

答案 0 :(得分:1)

从您的问题中可以看出您正在寻找Makefile帮助,特别是您正在寻找为C编译器调用所做的事情。

make允许在本地重新定义任何命令 - 您只需重新定义make中的宏 - 对于gcc,您只需重新定义CC宏。

你可以从像

之类的命令那样做
make CC=echo

会替换从gccecho的所有来电(不是很有用,但你明白了)。 或者你可以通过添加像

这样的行在Makefile中完成
   CC=echo
   testprogram: testprogram.o

当你make testprogram时,make会回应一些东西而不是调用gcc

答案 1 :(得分:1)

以下是ptrace的一个小例子:

#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <sys/user.h>
#include <sys/prctl.h>

const char *sys_call_name(long num);

int main()
{
  pid_t pid = fork();
  struct user_regs_struct regs;
  if (!pid) { 
    /* child */
    while (1) { printf("C\n"); sleep(1); }
  }
  else { /* parent */
    int status = 0;
    ptrace(PTRACE_ATTACH, pid, NULL, 0); 
    ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_SYSCALL) ;
    while (1) {
      printf("waiting\n");
      pid = wait(&status);
      /* child gone */
      //if (WIFEXITED(status)) { break; }
      ptrace(PTRACE_GETREGS, pid, 0, &regs);
      /* regs.orig_eax is the system call number */
      printf("A system call: %d : %s\n", regs.orig_eax, sys_call_name(regs.orig_eax));
      /* let child continue */
      ptrace(PTRACE_SYSCALL, pid, NULL, 0); 
    }   
  }
  return 0;
}


const char *sys_call_name(long num) {
  switch(num) {
    case   4: return "write";
    case 162: return "nanosleep";
    case 165: return "getresuid";
    case 174: return "rt_sigaction";
    case 175: return "rt_sigprocmask";
    default:  return "unknown";
  }
}

答案 2 :(得分:0)

你不容易。有问题的设施是ptrace功能,不适合胆小的人。