Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在父进程中不工作的Ptrace选项

在父进程中不工作的Ptrace选项
EN

Stack Overflow用户
提问于 2022-06-14 07:55:48
回答 1查看 118关注 0票数 2

当所需的系统调用在父进程中恢复时,Ptrace选项不会设置正确的状态。我只能使用在这里看到的没有PEEKUSER,SYSGOOD或SYSCALL。在过去的几天里,我已经读过这篇文章,并寻找了一些例子,我精神上精疲力竭。

任何想法/建议,无论多小,都是受欢迎的。谢谢。

论点:/bin/bash -c "echo 'first test' | wc -c"

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/ptrace.h>

int wait_for_syscall(pid_t child) {
    int status;
    while (1) {
        ptrace(PTRACE_CONT, child, 0, 0);
        waitpid(child, &status, 0);
        if (WIFSTOPPED(status) && WSTOPSIG(status) | 0x80)
            return 0;
        if (WIFEXITED(status))
            return 1;
    }
}

int main(int argc, char *argv[]) {
    int status;
    int counter = 0;
    pid_t pid = fork();
    if (pid < 0)
        exit(1);
    else if (pid == 0) {
        ptrace(PTRACE_TRACEME, pid, NULL, NULL);
        raise(SIGSTOP);
        return execve(argv[1], &argv[1], NULL);
    } else {
        wait(&status);
        ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_EXITKILL | PTRACE_O_TRACEEXEC | PTRACE_O_TRACESECCOMP);

        while (1) {
            if (wait_for_syscall(pid) != 0) break;
            
            if (status >> 8 == (SIGTRAP | (PTRACE_EVENT_EXEC << 8)))
                counter++;

            if (status >> 8 == (SIGTRAP | (PTRACE_EVENT_SECCOMP << 8)))
                counter++;

            if (wait_for_syscall(pid) != 0) break;
        }
    }
    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-14 08:32:17

在主循环中,使用范围为statusmain

这不是您在wait_for_syscall中设置的相同的wait_for_syscall(它有自己的status的私有副本)。

因此,status in main从未更新过。

要修复,可以传递指向wait_for_syscall的指针

我保留了它的原样,但我相信循环中对wait_for_syscall的第二个调用是无关的,实际上可能会悄悄地吸收syscall。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/ptrace.h>

int
wait_for_syscall(pid_t child,int *stp)
{
    int status;

    while (1) {
        ptrace(PTRACE_CONT, child, 0, 0);

        waitpid(child, &status, 0);
        *stp = status;

        if (WIFSTOPPED(status) && WSTOPSIG(status) | 0x80)
            return 0;
        if (WIFEXITED(status))
            return 1;
    }
}

int
main(int argc, char *argv[])
{
    int status;
    int counter = 0;

    pid_t pid = fork();
    if (pid < 0)
        exit(1);

    if (pid == 0) {
        ptrace(PTRACE_TRACEME, pid, NULL, NULL);
        raise(SIGSTOP);
        return execve(argv[1], &argv[1], NULL);
    }

    wait(&status);
    ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_EXITKILL | PTRACE_O_TRACEEXEC | PTRACE_O_TRACESECCOMP | PTRACE_O_TRACECLONE);

    while (1) {
        if (wait_for_syscall(pid,&status) != 0)
            break;

        if (status >> 8 == (SIGTRAP | (PTRACE_EVENT_EXEC << 8)))
            counter++;

        if (status >> 8 == (SIGTRAP | (PTRACE_EVENT_SECCOMP << 8)))
            counter++;

        if (status >> 8 == (SIGTRAP | (PTRACE_EVENT_CLONE << 8)))
            counter++;

        if (wait_for_syscall(pid,&status) != 0)
            break;
    }

    return 0;
}

更新:

我明白了。它关闭bc,现在它只进行一次迭代,然后就停止了。所以它不会继续/转到下一个系统调用。:( - Olivia22

好吧,我玩过一些变奏曲。以下是一些变化:

除了

  1. PTRACE_O_TRACEFORK之外,还需要PTRACE_O_TRACECLONE (这是一件大事;-)

PATH)

  • 使用execvp来保存环境变量(例如,

  • )

  1. waitpid应该为pid获取-1以捕获子节点,等等,

我添加了调试打印(dbgprt)

ptrace(PTRACE_CONT,...)

  1. 添加了signo

下面是重构代码(包含大量调试):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/ptrace.h>

#define SHOW(_sym) \
    dbgprt(#_sym ": %8.8X %8.8X\n",_sym,SIGTRAP | (_sym << 8))

#define dbgprt(_fmt...) \
    do { \
        int sverr = errno; \
        printf(_fmt); \
        errno = sverr; \
    } while (0)

#define ONERR(_expr) \
    do { \
        if (! (_expr)) \
            break; \
        dbgprt("ONERR " #_expr " line %d -- %s\n",__LINE__,strerror(errno)); \
        exit(1); \
    } while (0)

int
main(int argc, char *argv[])
{
    int status;
    int counter = 0;
    long err;

    pid_t pidm = getpid();

    pid_t pid0 = fork();
    if (pid0 < 0)
        exit(1);

    if (pid0 == 0) {
        ptrace(PTRACE_TRACEME, pid0, NULL, NULL);
        //raise(SIGSTOP);
#if 0
        execve(argv[1], &argv[1], NULL);
#else
        execvp(argv[1], &argv[1]);
#endif
        exit(97);
    }

    dbgprt("main: pid0=%d/%d\n",pid0,pid0 - pidm);
    dbgprt("main: SIGSTOP %d\n",SIGSTOP);
    dbgprt("main: SIGTRAP %d\n",SIGTRAP);

    SHOW(PTRACE_EVENT_EXEC);
    SHOW(PTRACE_EVENT_SECCOMP);
    SHOW(PTRACE_EVENT_CLONE);

#if 0
    err = ptrace(PTRACE_ATTACH,pid0,0,0);
    ONERR(err < 0);
#endif

    err = waitpid(-1,&status,0);
    ONERR(err < 0);

#if 1
    unsigned int opt = 0;
    opt |= PTRACE_O_EXITKILL;
    opt |= PTRACE_O_TRACEEXEC;
    opt |= PTRACE_O_TRACESECCOMP;
    opt |= PTRACE_O_TRACECLONE;
    opt |= PTRACE_O_TRACEFORK;
    err = ptrace(PTRACE_SETOPTIONS, pid0, 0, opt);
    ONERR(err < 0);
#endif

    err = ptrace(PTRACE_CONT,pid0,0,0);
    ONERR(err < 0);

    while (1) {
#if 1
        pid_t pid = waitpid(-1, &status, 0);
#else
        pid_t pid = wait(&status);
#endif

        unsigned int evmsk = status >> 16;

        dbgprt("waitpid: pid=%d/%d status=%8.8X\n",pid,pid - pidm,status);
        dbgprt("waitpid: status %8.8X %8.8X evmsk=%8.8X\n",
            status >> 8,status & 0x7F,evmsk);

        if (pid < 0) {
            dbgprt("waitpid: errno=%d -- %s\n",errno,strerror(errno));
            break;
        }

        if (WIFEXITED(status)) {
            dbgprt("waitpid: WIFEXITED code=%d\n",WEXITSTATUS(status));
            continue;
        }

        int signo = 0;

        do {
            if (WIFSTOPPED(status)) {
                signo = WSTOPSIG(status);
                dbgprt("waitpid: WIFSTOPPED signo=%d\n",signo);
            }

            if (WIFSIGNALED(status)) {
                signo = WTERMSIG(status);
                dbgprt("waitpid: WIFSIGNALED signo=%d\n",signo);
            }
        } while (0);

#if 0
        if (WIFSTOPPED(status) && WSTOPSIG(status) | 0x80)
            return 0;
        if (WIFEXITED(status))
            return 1;
#endif

        if (status >> 8 == (SIGTRAP | (PTRACE_EVENT_EXEC << 8))) {
            dbgprt("EXEC\n");
            counter++;
        }

        if (status >> 8 == (SIGTRAP | (PTRACE_EVENT_SECCOMP << 8))) {
            dbgprt("SECCOMP\n");
            counter++;
        }

        if (status >> 8 == (SIGTRAP | (PTRACE_EVENT_CLONE << 8))) {
            dbgprt("CLONE\n");
            counter++;
        }

        dbgprt("main: counter=%d\n",counter);

        err = ptrace(PTRACE_CONT, pid, 0, signo);
        ONERR(err < 0);
    }

    return 0;
}

下面是程序调用和输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+ ./fix3 /bin/bash -c 'cat /bin/bash | wc -c'
main: pid0=1905216/1
main: SIGSTOP 19
main: SIGTRAP 5
PTRACE_EVENT_EXEC: 00000004 00000405
PTRACE_EVENT_SECCOMP: 00000007 00000705
PTRACE_EVENT_CLONE: 00000003 00000305
waitpid: pid=1905216/1 status=0001057F
waitpid: status 00000105 0000007F evmsk=00000001
waitpid: WIFSTOPPED signo=5
main: counter=0
waitpid: pid=1905217/2 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=0
waitpid: pid=1905217/2 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=0
waitpid: pid=1905216/1 status=0000117F
waitpid: status 00000011 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=17
main: counter=0
waitpid: pid=1905217/2 status=00000000
waitpid: status 00000000 00000000 evmsk=00000000
waitpid: WIFEXITED code=0
waitpid: pid=1905216/1 status=0000117F
waitpid: status 00000011 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=17
main: counter=0
waitpid: pid=1905216/1 status=0001057F
waitpid: status 00000105 0000007F evmsk=00000001
waitpid: WIFSTOPPED signo=5
main: counter=0
waitpid: pid=1905218/3 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=0
waitpid: pid=1905218/3 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=0
waitpid: pid=1905216/1 status=0000117F
waitpid: status 00000011 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=17
main: counter=0
waitpid: pid=1905218/3 status=00000000
waitpid: status 00000000 00000000 evmsk=00000000
waitpid: WIFEXITED code=0
waitpid: pid=1905216/1 status=0000117F
waitpid: status 00000011 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=17
main: counter=0
waitpid: pid=1905216/1 status=0001057F
waitpid: status 00000105 0000007F evmsk=00000001
waitpid: WIFSTOPPED signo=5
main: counter=0
waitpid: pid=1905219/4 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=0
waitpid: pid=1905219/4 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=0
waitpid: pid=1905216/1 status=0000117F
waitpid: status 00000011 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=17
main: counter=0
waitpid: pid=1905220/5 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=0
waitpid: pid=1905219/4 status=0001057F
waitpid: status 00000105 0000007F evmsk=00000001
waitpid: WIFSTOPPED signo=5
main: counter=0
waitpid: pid=1905220/5 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=0
waitpid: pid=1905219/4 status=0000117F
waitpid: status 00000011 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=17
main: counter=0
waitpid: pid=1905220/5 status=0004057F
waitpid: status 00000405 0000007F evmsk=00000004
waitpid: WIFSTOPPED signo=5
EXEC
main: counter=1
waitpid: pid=1905220/5 status=00000000
waitpid: status 00000000 00000000 evmsk=00000000
waitpid: WIFEXITED code=0
waitpid: pid=1905219/4 status=0000117F
waitpid: status 00000011 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=17
main: counter=1
waitpid: pid=1905219/4 status=00000000
waitpid: status 00000000 00000000 evmsk=00000000
waitpid: WIFEXITED code=0
waitpid: pid=1905216/1 status=0000117F
waitpid: status 00000011 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=17
main: counter=1
waitpid: pid=1905216/1 status=0001057F
waitpid: status 00000105 0000007F evmsk=00000001
waitpid: WIFSTOPPED signo=5
main: counter=1
waitpid: pid=1905221/6 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=1
waitpid: pid=1905221/6 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=1
waitpid: pid=1905216/1 status=0000117F
waitpid: status 00000011 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=17
main: counter=1
waitpid: pid=1905221/6 status=0001057F
waitpid: status 00000105 0000007F evmsk=00000001
waitpid: WIFSTOPPED signo=5
main: counter=1
waitpid: pid=191190216
05222/7 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=1
waitpid: pid=1905222/7 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=1
waitpid: pid=1905221/6 status=0000117F
waitpid: status 00000011 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=17
main: counter=1
waitpid: pid=1905222/7 status=0004057F
waitpid: status 00000405 0000007F evmsk=00000004
waitpid: WIFSTOPPED signo=5
EXEC
main: counter=2
waitpid: pid=1905222/7 status=00000000
waitpid: status 00000000 00000000 evmsk=00000000
waitpid: WIFEXITED code=0
waitpid: pid=1905221/6 status=0000117F
waitpid: status 00000011 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=17
main: counter=2
waitpid: pid=1905221/6 status=00000000
waitpid: status 00000000 00000000 evmsk=00000000
waitpid: WIFEXITED code=0
waitpid: pid=1905216/1 status=0000117F
waitpid: status 00000011 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=17
main: counter=2
waitpid: pid=1905216/1 status=0001057F
waitpid: status 00000105 0000007F evmsk=00000001
waitpid: WIFSTOPPED signo=5
main: counter=2
waitpid: pid=1905223/8 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=2
waitpid: pid=1905223/8 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=2
waitpid: pid=1905216/1 status=0001057F
waitpid: status 00000105 0000007F evmsk=00000001
waitpid: WIFSTOPPED signo=5
main: counter=2
waitpid: pid=1905224/9 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=2
waitpid: pid=1905224/9 status=0000137F
waitpid: status 00000013 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=19
main: counter=2
waitpid: pid=1905223/8 status=0004057F
waitpid: status 00000405 0000007F evmsk=00000004
waitpid: WIFSTOPPED signo=5
EXEC
main: counter=3
waitpid: pid=1905224/9 status=0004057F
waitpid: status 00000405 0000007F evmsk=00000004
waitpid: WIFSTOPPED signo=5
EXEC
main: counter=4
waitpid: pid=1905223/8 status=00000000
waitpid: status 00000000 00000000 evmsk=00000000
waitpid: WIFEXITED code=0
waitpid: pid=1905224/9 status=00000000
waitpid: status 00000000 00000000 evmsk=00000000
waitpid: WIFEXITED code=0
waitpid: pid=1905216/1 status=0000117F
waitpid: status 00000011 0000007F evmsk=00000000
waitpid: WIFSTOPPED signo=17
main: counter=4
waitpid: pid=1905216/1 status=00000000
waitpid: status 00000000 00000000 evmsk=00000000
waitpid: WIFEXITED code=0
waitpid: pid=-1/-1905216 status=00000000
waitpid: status 00000000 00000000 evmsk=00000000
waitpid: errno=10 -- No child processes

更新2:

非常感谢,我会去研究它,看看它是如何工作的。如果0和1在这里意味着什么呢?- Olivia22

为了在这里进行说明,我使用cpp条件来表示旧代码和新代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#if 0
// old code
#else
// new code
#endif

#if 1
// new code
#endif

有时,我会输入一些实验代码,但结果会是“不太好”。所以,我将把它包装在一个#if 0中。我将保留它一段时间,以提醒自己,我做了,但它没有工作(例如,PTRACE_ATTACH块)。

条件词是“注释掉”代码的快速方法,它比使用(例如)更干净。/**/对。

当我完成并且我认为代码是最终的,我将删除适当的条件。

一种简单的方法是通过unifdef -k运行代码(我们得到):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/ptrace.h>

#define SHOW(_sym) \
    dbgprt(#_sym ": %8.8X %8.8X\n",_sym,SIGTRAP | (_sym << 8))

#define dbgprt(_fmt...) \
    do { \
        int sverr = errno; \
        printf(_fmt); \
        errno = sverr; \
    } while (0)

#define ONERR(_expr) \
    do { \
        if (! (_expr)) \
            break; \
        dbgprt("ONERR " #_expr " line %d -- %s\n",__LINE__,strerror(errno)); \
        exit(1); \
    } while (0)

int
main(int argc, char *argv[])
{
    int status;
    int counter = 0;
    long err;

    pid_t pidm = getpid();

    pid_t pid0 = fork();
    if (pid0 < 0)
        exit(1);

    if (pid0 == 0) {
        ptrace(PTRACE_TRACEME, pid0, NULL, NULL);
        //raise(SIGSTOP);
        execvp(argv[1], &argv[1]);
        exit(97);
    }

    dbgprt("main: pid0=%d/%d\n",pid0,pid0 - pidm);
    dbgprt("main: SIGSTOP %d\n",SIGSTOP);
    dbgprt("main: SIGTRAP %d\n",SIGTRAP);

    SHOW(PTRACE_EVENT_EXEC);
    SHOW(PTRACE_EVENT_SECCOMP);
    SHOW(PTRACE_EVENT_CLONE);

    err = waitpid(-1,&status,0);
    ONERR(err < 0);

    unsigned int opt = 0;
    opt |= PTRACE_O_EXITKILL;
    opt |= PTRACE_O_TRACEEXEC;
    opt |= PTRACE_O_TRACESECCOMP;
    opt |= PTRACE_O_TRACECLONE;
    opt |= PTRACE_O_TRACEFORK;
    err = ptrace(PTRACE_SETOPTIONS, pid0, 0, opt);
    ONERR(err < 0);

    err = ptrace(PTRACE_CONT,pid0,0,0);
    ONERR(err < 0);

    while (1) {
        pid_t pid = waitpid(-1, &status, 0);

        unsigned int evmsk = status >> 16;

        dbgprt("waitpid: pid=%d/%d status=%8.8X\n",pid,pid - pidm,status);
        dbgprt("waitpid: status %8.8X %8.8X evmsk=%8.8X\n",
            status >> 8,status & 0x7F,evmsk);

        if (pid < 0) {
            dbgprt("waitpid: errno=%d -- %s\n",errno,strerror(errno));
            break;
        }

        if (WIFEXITED(status)) {
            dbgprt("waitpid: WIFEXITED code=%d\n",WEXITSTATUS(status));
            continue;
        }

        int signo = 0;

        do {
            if (WIFSTOPPED(status)) {
                signo = WSTOPSIG(status);
                dbgprt("waitpid: WIFSTOPPED signo=%d\n",signo);
            }

            if (WIFSIGNALED(status)) {
                signo = WTERMSIG(status);
                dbgprt("waitpid: WIFSIGNALED signo=%d\n",signo);
            }
        } while (0);

        if (status >> 8 == (SIGTRAP | (PTRACE_EVENT_EXEC << 8))) {
            dbgprt("EXEC\n");
            counter++;
        }

        if (status >> 8 == (SIGTRAP | (PTRACE_EVENT_SECCOMP << 8))) {
            dbgprt("SECCOMP\n");
            counter++;
        }

        if (status >> 8 == (SIGTRAP | (PTRACE_EVENT_CLONE << 8))) {
            dbgprt("CLONE\n");
            counter++;
        }

        dbgprt("main: counter=%d\n",counter);

        err = ptrace(PTRACE_CONT, pid, 0, signo);
        ONERR(err < 0);
    }

    return 0;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72620023

复制
相关文章
webpack的watch选项不工作原因分析
今天尝试将以前创建的一个前端项目改为webpack编译,该项目使用了VueJS v2.0,原来是编写gulp脚本完成构建的。很自然就直接用vue-cli来搞定这个事了。 使用vue-cli创建项目 因为以前用过webpack,而vue-cli创建的项目底层其实还是使用webpack构建的,所以使用起来还是很简单的。 # 使用yarn,这个命令是跟npm兼容的,但速度快很多,而且可以保证依赖包版本的一致性,强烈推荐 yarn install --global vue-cli vue-cli webpack v
jeremyxu
2018/05/10
4.1K0
【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 )
ptrace 函数原型 : ptrace 函数实际上是由一系列的函数组成 , 具体调用哪个函数 , 要根据第一个参数确定 ;
韩曙亮
2023/03/29
9180
【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 )
父进程欺骗实践
监控父进程和子进程之间的关系是威胁检测团队检测恶意活动的常用技术,例如,如果powershell是子进程,而Microsoft Word是父进程,这是一种折中的行为,各种EDR可以很容易地检测到这种异常活动,这时红队可以考虑使用父进程PID欺骗作为逃避方法,Windows API调用"CreateProcess"允许用户传入一个用于分配父PID的参数,它可以用于指定当前进程的父进程。
Al1ex
2021/04/13
1.4K0
父进程欺骗实践
父进程和子进程谁先运行?
Linux中,父进程和子进程是并行运行的,先运行哪个是不确定的,在小红帽系统(Red Hat)中,先运行的是子进程,在ubuntu系统中,父进程是先运行的。
Jasonangel
2021/05/28
3.9K0
Linux中父进程为何要苦苦地知道子进程的死亡原因?
一个普遍的常识是,在Linux里面总是“白发人送黑发人”,子进程死亡,父进程透过wait()等待子进程死亡,并清理子进程僵尸,当然父进程也可以因此而获得子进程的死亡原因。
Linux阅码场
2020/01/14
2.1K0
Linux中父进程为何要苦苦地知道子进程的死亡原因?
Swift中防止ptrace依附
在移动开发中,安全是一个很重要的话题,当然安全是没有绝对的,只能说尽可能的提高安全性。在iOS的开发中,为了防止别人窥视我们的App,我们得采用一些手段来进行防范。
100000798482
2018/08/20
1.2K0
Swift中防止ptrace依附
在eclipse中没有server(需在选项中设置)
①在软件eclipse下的Help->InstallNew Software->中,在Work with中点击Add,如下,加入
全栈程序员站长
2022/07/25
3.9K0
在eclipse中没有server(需在选项中设置)
在未知大小的父元素中设置居中
当提到在web设计中居中元素时。关于被居中的元素和它父元素的信息,你知道的越多就越容易设置。那么假如当你不知道任何信息?居中也是可设置的。
lesM10
2019/08/26
4K0
在未知大小的父元素中设置居中
Linux ptrace 的实现
前言:ptrace 是 Linux 内核提供的非常强大的系统调用,通过 ptrace 可以实现进程的单步调试和收集系统调用情况。比如 strace 和 gdb 都是基于 ptrace 实现的,strace 可以显示进程调用了哪些系统调用,gdb 可以实现对进程的调试。本文介绍这些工具的底层 ptrace 是如何实现的。这里选用了 1.2.13 的早期版本,原理是类似的,新版内核代码过多,没必要陷入过多细节中。
theanarkh
2021/12/09
1.6K0
关于父进程和子进程的关系(UAC 绕过思路)
假设是a进程创建了b进程,那么a进程就是b进程的父进程。反之,假设是b创建了a,那么b进程就是a的父进程,这是在windows出现以来一直是程序员们都证实的,可是在在win Vista后面有了一个新安全消息机制。UAC(user account control),这里科普下UAC的功能,事实上UAC就是大家常见的安装软件或者启动程序的时候的出现的全屏变暗的一个提示框,这里顺便提醒下大家不要把它的提醒级别减少。这里大家不要蓄意把他的提示级别较低。这样会带来非常大的安全隐患。由于正常的UAC级别下,会检測程序是否有数字签名(可识别程序),以及他的数字签名是否合法。这对于一部分低端的木马具有提醒作用(注意这里说的是能够提示一般的 灰鸽子等变种,高端的木马会绕过这里,具体思路见后面),好了这里再回头说进程关系,这里先说一句关键的话:进程在创建进程时。他的父进程能够被指定。这个是在《深入解析Windows操作系统》(第六版)中有具体的说明,里面的意思是这样解释UAC提权的,当用户同意一次UAC提权时。AIS服务(AppInfo Service)调用的CreateProcessAsUser() 函数创建进程而且赋予恰当的管理员权限,在理论上说AIS服务(所在的进程)是提权后进程的父进程。当我们用进程树查看工具(顺便推荐几款用过的Process moniter。IceSworld,Process Explorer等) 查看时,会发现提权的进程的父进程是创建它的进程,这是由于AIS利用了CreateProcessAsUser() API中的一个新的功能,这里的新功能就是将提权进程的父进程设置成创建该进程的进程,假设我们利用一下该API,我们就能够将自己的进程的的父进程设置为随意进程(要提权绕过UAC的鸽子注意了),假设把木马进程的父进程设置为 杀软 的ID或者csrss.exe ,notepad.exe 等可信进程,那么对于根据父进程可疑(进程链)来查杀的杀软就轻易绕过了,这里顺便提示下还有一个绕过反调试的小技巧,假设你发现一个该死的小程序检查父进程是不是explorer.exe来推断是否是合法环境。那你会咋办?这里通常是逆向一些小游戏的时候常见滴,好吧,不卖关子了。根据上面的介绍,我调试的时候把他的父进程从 ollydbg直接改成他要求的explorer.exe 就Ok了。
全栈程序员站长
2022/07/20
1.7K0
父进程退出时如何确保子进程退出?
子进程退出的时候,父进程能够收到子进程退出的信号,便于管理,但是有时候又需要在父进程退出的时候,子进程也退出,该怎么办呢?
编程珠玑
2019/09/02
12.4K0
Fork进程后,是否与父进程共享stdio?
今天想到一个问题:如果我在代码里面,fork当前进程,然后两个进程都执行scanf(),那会发生什么?键盘输入的数据是定向到哪个进程呢?
灯珑LoGin
2023/10/18
1720
如何在父进程中读取子(外部)进程的标准输出和标准错误输出结果
        最近接手一个小项目,要求使用谷歌的aapt.exe获取apk软件包中的信息。依稀记得去年年中时,有个同事也问过我如何获取被调用进程的输出结果,当时还研究了一番,只是没有做整理。今天花点时间,将该方法整理成文。(转载请指明出于breaksoftware的csdn博客)
方亮
2019/01/16
3.9K0
Ptrace使用
ptrace共有四个参数: long ptrace(enum __ptrace_request request,pid_t pid,void *addr,void *data); 其中第一个参数可以取如下内容:
Wilbur-L
2021/02/05
2K0
linux-沙盒入门,ptrace从0到1
本文是在linux系统角度下,对ptrace反调试进行底层分析,使我们更清楚的看到一些底层原理的实现,更好的理解在逆向工程中的一些突破口,病毒怎么实现代码注入,本文还将列出一些常见的攻防手段,分析其原理,让我们一同见证见证茅与盾激情对决!内容很充实,建议躺着阅读!!!!!!!!
Gamma实验室
2021/03/10
4.4K1
linux-沙盒入门,ptrace从0到1
GDB调试-从入门实践到原理
在上篇文章中,我们分析了线上coredump产生的原因,其中用到了coredump分析工具gdb,这几天一直有读者在问,能不能写一篇关于gdb调试方面的文章,今天借助此文,分享一些工作中的调试经验,希望能够帮到大家。
高性能架构探索
2022/08/25
3.1K0
GDB调试-从入门实践到原理
PageHelper在SpringBoot的@PostConstruct中不生效
在使用PageHelper的过程中,出现了一个很奇怪的问题,假设在数据库中存放有30条Country记录,我们用下面的方法使用PageHelper进行分页查询,那么我们希望得到的page.size是10。
翎野君
2023/05/12
9670
在 Vue 中,父组件中传递数据给子组件
在父组件中传递数据给子组件。在 Vue 中,可以通过 props 属性来实现父组件向子组件传递数据的功能。
王小婷
2023/09/11
3010
CVE-2021-3156 sudo堆栈溢出漏洞预警
国外的Qualys 研究团队在 sudo 发现了堆溢出漏洞,sudo是一种几乎无处不在的非常实用程序,可用于大型 Unix 类操作系统(类似与windows的UAC功能,但是功能更加强大,它还允许用户使用其他用户的安全权限运行程序,不仅限于管理员哟)。
Gamma实验室
2021/02/12
9720
CVE-2021-3156 sudo堆栈溢出漏洞预警
8.7 父进程检测反调试
首先这是一种比较奇特的反调试思路,通过检测自身父进程来判定是否被调试,原理非常简单,我们的系统在运行程序的时候,绝大多数应用程序都是由Explorer.exe这个父进程派生而来的子进程,也就是说如果没有被调试其得到的父进程就是Explorer.exe的进程PID,而如果被调试则该进程的父进程PID就会变成调试器的PID值,通过对父进程的检测即可实现检测是否被调试的功能。
微软技术分享
2023/09/27
2640
8.7 父进程检测反调试

相似问题

Ptrace父进程

10

父进程的ptrace

21

ptrace在64位中不工作。

12

子进程和父进程不工作

20

为什么ptrace在setuid之后不附加到进程?

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文