05 2013 档案
摘要:根据前两篇博文中的实验:1:Linux进程地址空间之初探:一2:Linux进程地址空间之初探:二 现对进程的创建和可执行程序的加载过程总结如下:一:进程地址空间的组成及相关数据结构 Linux为每个进程都维持了一个独立的虚拟地址空间,进程地址空间又被分为几个虚拟内存区域:代码段、数据段、堆段、栈段、共享库段。进程地址空间中的任何有效地址都只能位于唯一的区域,这些区域不能相互覆盖。通过mmap/munmap函数,内核可以创建/删除一个虚拟内存区域。 主要的数据结构有: task_struct : 进程描述符结构,定义在<linux/sched.h>文件中,描述了该进程打开的文件、进程
阅读全文
摘要:引言:上篇博文中,我们简单的介绍了Linux虚拟存储器的概念及组成情况,下面来分析分析进程的创建和终结及跟进程地址空间的联系。这里首先介绍一个比较重要的概念:存储器映射在Linux系统中,通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容,这个过程称为存储器映射。存储器映射为共享数据、创建新的进程以及加载程序提供了一种高效的机制。虚拟存储器区域可以映射到两种类型对象中:1)普通文件:一个虚拟区域可以映射到普通磁盘文件的连续部分,例如可执行目标文件。虚拟区域分为若干的虚拟页面,这些虚拟页面初始化时并没有实际交换进物理存储器,直到CPU第一次引用页面时才真正的加载
阅读全文
摘要:引言:现代操作系统提供了一种对内存的抽象概念,叫做虚拟存储器,它为每个进程提供了一个大的,一致的,和私有的地址空间。通过一个很清晰的机制,虚拟存储器提供了3个重要的能力:1)它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效的使用了主存。2)它为每个进程提供了一致的地址空间,从而简化了存储器管理。3)它保护了每个进程的地址空间不被其他进程破坏。Linux操作系统同样也采用了虚拟内存技术,对一个进程而言,它好像可以访问整个系统的所有物理内存,更重要的是,即使单独一个进程,它拥有的地址空间也可以远远大于系统物理内
阅读全文
摘要:实验环境:Ubuntu12.04下面我们通过 example.c 代码分别生成.cpp .s .o 和ELF可执行文件,并加载运行来分析 程序 example在CPU上执行的整个过程,并由此分析单任务计算机和多任务计算机的工作原理: example.c 2 int g(int x) 3 { 4 return x + 3; 5 } 6 7 int f(int x) 8 { 9 return g(x);10 }11 int main()12 {13 return f(8) + 1; }一:为了在系统上运行example.c 程序,每条C语句都必须转化为低级机器语言指令,然...
阅读全文
摘要:上篇随笔中实现了隐藏进程,在实际的处理中,经常会用模块来达到修改系统调用的目的,但是当插入一个模块时,若不采取任何隐藏措施,很容易被对方发现,一旦对方发现并卸载了所插入的模块,那么所有利用该模块来隐藏的文件就暴露了,所以应继续分析如何来隐藏特定名字的模块。 这里我们可以通过/proc文件系统来向内核传递命令的方式,实现获取root权限、隐藏模块、隐藏进程、显示进程、显示模块、允许卸载模块等功能。 对于什么是/proc文件系统,以及如何通过它来跟内核通信,可以参考这里: http://www.ibm.com/developerworks/cn/linux/l-proc.html 下面直接贴代码.
阅读全文
摘要:实现隐藏进程一般有两个方法:1,把要隐藏的进程PID设置为0,因为系统默认是不显示PID为0的进程。2,修改系统调用sys_getdents()。 Linux系统中用来查询文件信息的系统调用是sys_getdents,这一点可以通过strace来观察到,例如strace ls 将列出命令ls用到的系统调用,从中可以发现ls是通过getdents系统调用来操作的,对应于内核里的sys_getedents来执行。当查询文件或者目录的相关信息时,Linux系统用 sys_getedents来执行相应的查询操作,并把得到的信息传递给用户空间运行的程序,所以如果修改该系统调用,去掉结果中与某些特定文件的
阅读全文
浙公网安备 33010602011771号