2010-06-08 102 views
0

哪里出错?如何为eip分配值以更改在程序中运行的位置?如何在ubuntu中用C语言指定EIP的值

请帮忙!!!!

错误:无法转换“mcontext_t *”到“sigcontext *”在分配

struct ucontext { 
    unsigned long  uc_flags; 
    struct ucontext *uc_link; 
    stack_t  uc_stack; 
    struct sigcontext uc_mcontext; 
    sigset_t  uc_sigmask; /* mask last for extensibility */ 
}; 

#include <stdio.h> 
#include <signal.h> 
#include <asm/ucontext.h> 
void handler(int signum, siginfo_t *siginfo, void *uc0){ 
    struct ucontext *uc; 
    struct sigcontext *sc; 

    uc = (struct ucontext *)uc0; 
    sc = &uc->uc_mcontext; 

    sc->eip = target; 
    //uc->uc_mcontext.gregs[REG_EIP] 
} 

int main (int argc, char** argv){ 
    struct sigaction act; 
    act.sa_sigaction = handler; 
    act.sa_flags = SA_SIGINFO; 
    sigaction(SIGTRAP, &act, NULL); 

    asm("movl $skipped, %0" : : "m" (target)); 

    asm("int3"); // cause SIGTRAP 
    printf("to be skipped.\n"); 
    asm("skipped:"); 
    printf("Done.\n"); 
} 
+0

首先,您需要移动'#includes'以使它们位于'struct ucontext'之前,否则'sigset_t' * et al *在使用之前不会被定义。 – 2010-06-08 14:06:16

+0

它编译和运行在我的电脑上,没有错误。 GCC 4.3 – zoli2k 2010-06-08 14:07:14

+0

gcc(Ubuntu 4.4.1-4ubuntu9)4.4.1运行错误 – user353573 2010-06-08 14:10:05

回答

1

仅供参考。检查man setjmpman longjmp