Linux内核如何装载和启动一个可执行程序

秦鼎涛 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

 

一、视频学习

 

二、使用gdb跟踪分析一个execve系统调用内核处理函数sys_execve
 增加execve系统调用指令:
Linux内核如何装载和启动一个可执行程序 - 1029577254 - 1029577254的博客
 
Linux内核如何装载和启动一个可执行程序 - 1029577254 - 1029577254的博客
 在Makefile找到启动内核命令:
Linux内核如何装载和启动一个可执行程序 - 1029577254 - 1029577254的博客
 启动内核后,找到增加的exec命令:
Linux内核如何装载和启动一个可执行程序 - 1029577254 - 1029577254的博客
执行exec——新加载的执行程序来输出的“hello world
Linux内核如何装载和启动一个可执行程序 - 1029577254 - 1029577254的博客
 冻结后gdb跟踪,设置断点:
Linux内核如何装载和启动一个可执行程序 - 1029577254 - 1029577254的博客
 
执行到了sys_execve:
Linux内核如何装载和启动一个可执行程序 - 1029577254 - 1029577254的博客
进入do_execve内部
Linux内核如何装载和启动一个可执行程序 - 1029577254 - 1029577254的博客
继续执行,到了load_elf_binary
Linux内核如何装载和启动一个可执行程序 - 1029577254 - 1029577254的博客
 
list后,可以看出静态链接时elf_interp为空
Linux内核如何装载和启动一个可执行程序 - 1029577254 - 1029577254的博客
 再执行,跟踪到start_thread
 
 Linux内核如何装载和启动一个可执行程序 - 1029577254 - 1029577254的博客
 
 
三、总结
  新的可执行程序是从new_ip开始执行,start_thread实际上是把返回到用户态的位置从Int 0x80的下一条指令,
变成了规定的新加载的可执行文件的入口位置,即修改内核堆栈的EIP的值作为新程序的起点。当执行到execve系统调
用时,陷入内核态,用execve加载的可执行文件覆盖当前进程的可执行程序,当execve系统调用返回时,返回新的可
执行程序的执行起点(main函数位置),所以execve系统调用返回后新的可执行程序能顺利执行。对于静态链接的可
执行程序和动态链接的可执行程序execve系统调用返回时,如果是静态链接,elf_entry指向可执行文件规定的头部
(main函数对应的位置0x8048***);如果需要依赖动态链接库,elf_entry指向动态链接器的起点。 
posted @ 2016-04-09 14:59  A.W.S  阅读(281)  评论(0)    收藏  举报