找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3390|回复: 0

linux ptrace实验

[复制链接]

311

主题

228

回帖

7379

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5625 个
贡献
253 次
宅之契约
0 份
在线时间
954 小时
注册时间
2014-1-25
发表于 2016-5-1 17:23:06 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 元始天尊 于 2016-5-1 17:33 编辑

ptrace是所有调试和跟踪程序所用的基础,包括gdb,strace,ltrace等工具
ptrace也用于反调试,因为对于一个线程ptrace之后便不能再ptrace
ptrace有2种启动方式:
1.在子进程中ptrace通知父进程调试自己
2.从一个进程对另一个进程进行ptrace

因此ptrace的结构也分为3种(网上收集):
1.父进程调试子进程
int pid=fork())
if(pid == -1)
{
}
else if(pid == 0)//子进程
{
        ptrace(PTRACE_TRACEME,0,0,0);                       
}
else//父进程
{
        wait(0);
}

2.子进程调试父进程
   pid_t pid = fork();
    assert(pid != -1);
    int status;
    long readme = 0;
    if (pid)
    {
        readme = 42;
        printf("parent: child pid is %d\n", pid);
        assert(pid == wait(&status));
        printf("parent: child terminated?\n");
        assert(0 == status);
    }
    else
    {
        pid_t tracee = getppid();
        printf("child: parent pid is %d\n", tracee);
        sleep(1); // give parent time to set readme
        assert(0 == ptrace(PTRACE_ATTACH, tracee));
        assert(tracee == waitpid(tracee, &status, 0));
        printf("child: parent should be stopped\n");
        printf("child: peeking at parent: %ld\n", ptrace(PTRACE_PEEKDATA, tracee, &readme));
    }

3.A进程调试B进程
[code]

同时,下面2种情况测试失败:
1.ptrace自身
2.互相ptrace

反反调试的构思:(用户态)
由于不存在环回ptrace,因此对于由于已经ptrace而无法调试的程序,找到第一个发出ptrace的进程(/proc/self/status TracerPid),注入并执行ptrace DETACH,
之后对下一级同样操作直到最后的子进程
回复

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-5-19 08:57 , Processed in 0.028188 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表