在上一篇文章《 Linux x86内核终止D状态的进程》中,我展示了32位x86系统中如何编码杀死D进程。本文我将展示一种64位x86系统上的方法。
        说实话,64位系统上做这样的事是比较难的,因为你无法通过修改p->thread.ip来到达将进程拽出死循环的目的。要想知道64位系统上到底该怎么把进程执行绪引出,我们得先看看”标准“的做法是什么。

标准的做法就是fork时的行为,一个新进程刚刚被创建,它第一次进入运行状态之前,并不是通过switch_to切出的,为了让它”看起来像“是被切出而后被切入,就需要ret_from_fork来制造现场。问题是既然无法修改p->thread.ip,那又如何把执行绪引导到ret_from_fork里。

答案在于,64位(这里特指x86_64)系统是在switch_to中直接通过标志位判断跳转的,其过程如下:

1.在copy_thread中设置TIF_FORK标志

2.在switch_to中判断TIF_FORK标志是否存在,若存在则直接跳转到ret_from_fork

因此ret_from_fork在64位系统中是硬编码到switch_to中的,不像32位系统中那样是可以随意修改的。

到这里,想通过修改堆栈上保存的PC寄存器来达到跳出循环的这条心也该死了。一个进程被切入,要么循着被切出之前的路径走,要么进入ret_from_fork,只有这两条路。如果循着之前的路,那还是在死循环里面,那么只能给D进程设置TIF_FORK标记,引导它进入ret_from_fork!
        然而我们并不是真的希望它return from fork,而是因为这是不得已的办法,它只能到ret_from_fork里面。接下来怎么办?
        接下来的技术涉及到inline hook,我们希望hook掉ret_from_fork这个entry!具体如何inline hook,本文不讲,不然本文又要很长很长了。本文仅仅给出ret_from_fork被hook后的样子:

ENTRY(ret_from_fork)DEFAULT_FRAMELOCK ; btr $TIF_FORK,TI_flags(%r8)push kernel_eflags(%rip)CFI_ADJUST_CFA_OFFSET 8popf                                    # reset kernel eflagsCFI_ADJUST_CFA_OFFSET -8call schedule_tail                      # rdi: 'prev' task parameterGET_THREAD_INFO(%rcx)testl $_TIF_D, TI_flags(%rcx)        # 这里判断是不是有新增的TIF_D标识,如果有,就直接do_exitjnz do_exitRESTORE_RESTtestl $3, CS-ARGOFFSET(%rsp)            # from kernel_thread?je   int_ret_from_sys_calltestl $_TIF_IA32, TI_flags(%rcx)        # 32-bit compat task needs IRETjnz  int_ret_from_sys_callRESTORE_TOP_OF_STACK %rdi, -ARGOFFSETjmp ret_from_sys_call                   # go to the SYSRET fastpathCFI_ENDPROC
END(ret_from_fork)

然后,模块里非常简单的设置TIF_FORK和TIF_D即可:

if (pid > 0) {for_each_process(p) {if (task_pid_vnr(p) == pid) {set_task_state(p, TASK_INTERRUPTIBLE);// 设置TIF_FORK,目的是执行流导入ret_from_forkset_tsk_thread_flag(p, TIF_FORK);// 设置TIF_D,目的是将执行流在hook后的ret_from_fork里进行区分set_tsk_thread_flag(p, TIF_D);wake_up_process(p);break;}}
}

和32位系统的实验方法一样,D进程将被拉出死循环,然后死掉!

注意,用kprobe/jprobe技术进行hook事实上就是一种inline hook的应用,然而我们不方便用它来hook ret_from_fork,因为你既不能在ret_from_fork之前执行hook,也不能之后执行hook,而必须在其中间,即调用完schedule_tail之后去执行do_exit,因此,正确的做法是hook别的函数而不是hook ret_from_fork这个函数。仔细观察ret_from_fork的汇编码,就会发现在int_ret_from_sys_call,ret_from_sys_call的pre handler中进行TIF_D的判断并且执行do_exit应该是正确的做法!

        温州皮鞋,下雨进水不会胖!

Linux x86_64内核终止D状态的进程相关推荐

  1. linux中断初始化程序,Linux x86_64 内核中断初始化

    Linux x86_64 内核中断初始化 中断分类 Linux 系统中, 中断分为: 硬中断: 由外部设备或者执行异常产生的需要快速处理的中断如缺页中断定时器硬件中断 根据内部产生还是外部产生, 分为 ...

  2. Linux的内核设计与实现之进程管理(含源码)

    Linux内核设计与实现--进程篇之进程管理 目录 概述 进程与线程 进程管理 进程描述符及任务结构 进程状态 进程上下文 线程创建 写时拷贝 fork() vfork() 创建线程 内核线程 进程终 ...

  3. linux 命令 sys_call_table地址,Linux x86_64 内核查找sys_call_table注意事项

    /*----------------------------------------------------*/ 本文档的CopyRight归jonathan所有,可自由转载,转载时请保持文档的完整性 ...

  4. Linux如何终止D状态的进程

    在百忙中抽出点时间帮温州皮鞋厂老板解决一个杀掉D进程的问题,虽然最终线上的机器被老板蹂躏挂了,我也没帮上什么实质性的忙,还是写点记录,以备查阅.         碰到这个问题,我第一个反应就是网搜解决 ...

  5. Linux内核进程调度的时机和进程切换

    陈铁+ 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 对于现代操作系统,多 ...

  6. linux进程上下文切换的具体过程,Linux实验三 结合中断上下文切换和进程上下文切换分析Linux内核一般执行过程...

    fork系统调?创建?进程,也就?个进程变成了两个进程,两个进程执?相同的代码,只是fork系统调?在?进程和?进程中的返回值不同. 打开linux-5.4.34/arch/x86/entry/sys ...

  7. [入门篇]Linux操作系统fork子进程的创建以及进程的状态 超超超详解!!!我不允许有人错过!!!

    目录 0.前言 1.fork()创建子进程讲解 1.1fork()的简单介绍 1.2 创建子进程详解 1.2.1 如何理解fork创建子进程 1.2.2 子进程的PCB以及子进程的代码和数据 1.2. ...

  8. 通过fork来剖析Linux内核的内存管理和进程管理(上)

    1.开场白 本文主要从内存管理和进程管理两个维度来窥探一下fork背后隐藏的技术细节,希望能够通过本文让大家站在一个高度去看进程创建. 全文分为两部分讲解:fork的内存管理部分和进程管理部分,内存管 ...

  9. Linux内核源码分析《进程管理》

    Linux内核源码分析<进程管理> 前言 1. Linux 内核源码分析架构 2. 进程原理分析 2.1 进程基础知识 2.2 Linux进程四要素 2.3 进程描述符 task_stru ...

最新文章

  1. python操作excel表格-Python自动化办公之操作Excel文件
  2. Java基础篇:四种代码块详解
  3. 王某调离岗位后所使用计算机由新到任陈某,2017年沧州事业单位考试模拟卷
  4. db2 语句包括不必要的列表_DB2 SQL0956C 数据库堆中没有足够的处理空间可用来处理此语句...
  5. 关于某系统的全面质量属性战术
  6. kaggle实战笔记_1.数据处理
  7. caffe+vs2013+window10+GPU(CPU)配置
  8. Bailian4121 股票买卖【最值】
  9. 一次搞定this和闭包
  10. Shell 编程入门到精通
  11. csol修改本地服务器,CSOL简单地控制台优化+显卡优化 低配也能流畅运行
  12. IT码农哥放弃50万年薪:辞职卖咖喱凉皮
  13. [oracle]Oracle数据库安全管理
  14. CSS使用小操作(隐藏滚动,实现三角行等...)
  15. “剧情+综艺” 助推国潮文化破圈
  16. 使用ping命令检测设备在线
  17. 使用jquery,按回车键实现tab键的功能
  18. nagios NSCA 被动检测
  19. mysql存储过程之循环(WHILE,REPEAT和LOOP)
  20. Excel常用公式和技巧

热门文章

  1. 关于计算机游戏的英语读法,英语趣味课堂:计算机游戏 computer game
  2. Android调试--创建文件失败(设置了权限)
  3. 2023 手术机器人现状
  4. 小猪短租携手飞猪:共享住宿首推“先住后付”
  5. python利用while语句打印星号
  6. 收藏:WBS任务分解法
  7. android的阻尼效果
  8. 程序员数学(19)–一次函数
  9. Tomcat的性能与并发量
  10. 【javascript】中国省市区号JSON格式数据--2017年为准,含省市名称和电话区号