LKM 注射
- 格式:doc
- 大小:96.00 KB
- 文档页数:28
Rootkit的类型、功能及主要技术Rootkit 的类型小结1.固化Rootkits和BIOS Rootkits固化程序是存于ROM中,通常很小,使用系统硬件和BIOS 创建顽固的软件镜像。
将制定的代码植入到BIOS 中,刷新BIOS,在BIOS 初始化的末尾获得运行机会。
重启无用、格式化无用,在硬盘上无法探测,现有的安全软件将大部分的扫描时间用在了对硬盘的扫描上。
本文整理:(第三方信息安全网)/2 内核级Rootkits内核级Rootkits(Kernelland Rootkits)是通过修改内核、增加额外的代码、直接修改系统调用表、系统调用跳转(Syscall Jump),并能够替换一个操作系统的部分功能,包括内核和相关的设备驱动程序。
现在的操作系统大多没有强化内核和驱动程序的不同特性。
许多内核模式的Rootkit 是作为设备驱动程序而开发,或者作为可加载模块,如Linux 中的可加载模块或Windows 中的设备驱动程序,这类Rootkit 极其危险,它可获得不受限制的安全访问权。
如果代码中有任何一点错误,那么内核级别的任何代码操作都将对整个系统的稳定性产生深远的影响。
特点:无进程;无端口。
与用户级Rootkit 相比,与操作系统处于同一级别,可以修改或破坏由其它软件所发出的任何请求。
3 用户态Rootkits用户态Rootkits(Userland Rootkits)是运行在Ring3 级的Rootkit,由于Ring3 级就是用户应用级的程序,而且信任级别低,每一个程序运行,操作系统给这一层的最小权限。
用户态Rootkit使用各种方法隐藏进程、文件,注入模块、修改注册表等。
4 应用级Rootkits应用级Rootkits 通过具有特洛伊木马特征的伪装代码来替换普通的应用程序的二进制代码,也可以使用Hook、补丁、注入代码或其它方式来修改现有应用程序的行为。
5 代码库Rootkits代码库Rootkits 用隐藏攻击者信息的方法进行补丁、Hook、替换系统调用。
注塑模具技术规范美的集团家用空调国内事业部发布注塑模具技术规范1、目的1。
1、规范美的国内空调注塑模具制作规范和验收标准。
1。
2、不断提高模具质量,确保模具正常生产, 生产出合格的注塑件产品。
1。
3、模具厂家必须按照此标准进行模具设计及制造,若模具设计及制造因不符合此标准而引起的模具质量问题,由模具厂家承担一切后果。
2、范围本标准规定了塑料制件的模具工艺性,统一塑料模具的设计、制作标准、验收标准.本标准适用于家用空调国内事业部。
3、规范性引用文件无4、术语和定义无5、模具分类根据模架尺寸将模具分为大、中、小三类。
5.1、模架尺寸6060以上称为大型模具;5.2、模架尺寸3030~6060之间为中型模具;5.3、模架尺寸3030以下为小型模具.6、模架选用6.1、优先选用标准模架。
6.2、若选用非标模架,应优先选用标准板厚。
6.3、大型非标模架,导柱直径不小于Φ60mm,导套采用石墨铜套制做。
6.4、大型非标模架导套孔壁厚与模架边不得小于20mm,回针孔壁厚与模架边为35~40mm,回针直径不小于Φ30。
6.5、大型非标模架A板、B板起吊螺钉孔为M36~M48。
6.6、模架必须指定的供应商采购.6.6.1、模架非成型部分的模板零件应采用1050材质, 硬度HB170-220。
6。
6.2、导柱、导套回针等所用材料表面硬度不低于HRC60 2。
6。
6。
3、A板、B板镶件框壁厚一般为:(小模)30~50mm、(中模)50~80mm、(大模)80~120mm.6.6.4、开镶件框后B板厚度一般为:(小模)30~50mm、(中模)50~80mm、(大模)80~120mm。
6.6.5、镶件成型部位厚度一般为:(小模)25~35mm、(中模)35~50mm、(大模)50~70mm。
7、钢材选用7。
4、以下材料由模具厂家提供材料证明及采购证明。
滑块材料(外观)用738H钢料,硬度 HRC34~38,(非外观)用738钢料,硬度 HRC29~33. 斜顶材料用LKM738钢料,表面进行氮化处理,硬度HV700。
按键注射模具设计作者:齐永杰来源:《中小企业管理与科技·下旬刊》2011年第09期摘要:叙述了按键注射模结构设计过程,分析了模具各部分结构形式,通过计算选择了合适的注射机。
关键词:按键注射模模具设计1 产品的工艺分析图1为塑件按键的产品示意图,本产品对透光性要求很高,成型后需要再经喷漆处理才能达到产品使用要求,为此材料选用透明PC,其具有优良的物理机械性能,韧性好、耐热性好、易着色、吸水率低,在成型零件时可达到很好的尺寸精度并能在很宽的温度范围内保持尺寸的稳定性,是一种优良的热塑性工程塑料,设计模具时成型收缩率可取0.5%。
整个产品尺寸较小,结构简单,从一般注射模具结构特点和经济性能等方面考虑,本按键注射模采用1模8腔的结构形式。
2 模具结构设计2.1 分型面的选择综合该产品的结构特点与使用要求等方面的考虑,该产品模具结构形式选择单分型面注射模结构,该种形式是注射模中最简单的一种结构形式,并根据该种形式来进行模具该产品的模具结构设计。
根据分型面应选择在产品产品外形最大轮廓处的原则,同时结合产品的结构特点、外观要求及制模需要等要求,分型面设计成如图2的形式。
2.2 浇注系统与推出机构的设计浇注系统的设计应让该模具结构形式中的各个型腔的塑件产品的尺寸、质量等均一稳定,同时要减少浇口对产品外观的影响,结合单分型面的模具结构形式,故该模具采用侧向进料的形式,分流道截面采用半圆形的形式,适合加工。
该产品结构形状简单,产品侧向没有影响轴向开模推出的凹凸形状,为此可只采用一般的推杆推出的形式,考虑到推杆的顶位面是斜面,所以在推杆的固定端加上定位销的设计。
具体如图3所示。
2.3 冷却系统的设计为了保证在量产过程中产品的外观质量要求,同时缩短产品在模具内的冷却时间,为此需要设计合理的冷却水路。
在保证与其它部件不发生干涉的前提下,冷却水道尽量靠近模具型腔,提高冷却效果。
本模具上下模采用一进一出的相同的冷却形式,具体如图4所示。
技术要求;1、材料:PP2、产量:10万件3、未注公差尺寸按GB/T14486-1993中MT6。
4、要求塑件表面不得有气孔、熔接痕、飞边等缺陷,不得有明显的浇口痕迹。
图1图21.对塑件的工艺性分析1.1塑料品种:PP颜色:绿色、红色基本特性:聚丙烯无色、无味、无毒。
外观似聚乙烯,但比聚乙烯更透明、更轻。
密度仅为0.90~0.91g/cm3。
它不吸水,光泽好,易着色。
聚丙烯具有聚乙烯所有的优良性能,如卓越的介电性能、耐水性、化学稳定性,宜于成形加工等;还具有聚乙烯所没有的许多性能,如屈服强度、抗拉强度和硬度及弹性比聚乙烯好。
定向拉伸后聚丙烯可制作铰链,有特别高的抗弯曲疲劳强度。
熔点为164℃~170℃,耐热性好,能在100℃以上的温度下进行消毒灭菌。
其低温使用温度达-15℃,低于-35℃时会脆裂。
聚丙烯的高温绝缘性能好,而且由于其不吸水,绝缘性能不受湿度的影响,但在氧、热、光的作用下极易解聚、老化,所以必须加入防老化剂。
成形特点:1)成形加工性好,可以用注射、挤出、吹塑及真空成形等方法加工;2)吸湿性小,可能发生熔体破裂,长期与热金属接触容易分解;3)比聚乙烯流动性好,溢边值0.03mm,压力对熔体粘度比温度影响显著,应在较高压力下成形;4)冷却速度快,浇注系统及冷却系统应缓慢散热,适当延长冷却时间,以稳定尺寸;5)收缩率大且波动范围大,方向性明显,易发生缩孔、凹陷及变形;6)应注意控制成形温度,料温低时方向性明显,尤其低温高压时更显著,模温低于50℃时,塑件表面不光泽,易产生熔接不良和流痕,模温高于90℃时易发生翘曲和变形;7)塑件壁厚应均匀,避免缺口和尖角,防止应力集中,塑件内不能有铜质嵌件,聚丙烯与铜接触后会变脆;8)取向显著,不宜采用直接浇口,否则浇口附近残余应力大,易使塑件翘曲变形。
1.2塑件尺寸精度:塑件有7尺寸标注,按标准GB/T14486-1993中属于一般精度,按MT6级精度。
Rootkit技术rootkit的主要分类早期的rootkit主要为应用级rootkit,应用级rootkit主要通过替换login、ps、ls、netstat 等系统工具,或修改.rhosts等系统配置文件等实现隐藏及后门;硬件级rootkit主要指bios rootkit,可以在系统加载前获得控制权,通过向磁盘中写入文件,再由引导程序加载该文件重新获得控制权,也可以采用虚拟机技术,使整个操作系统运行在rootkit掌握之中;目前最常见的rootkit是内核级rootkit。
内核级rootkit又可分为lkm rootkit、非lkm rootkit。
lkm rootkit主要基于lkm技术,通过系统提供的接口加载到内核空间,成为内核的一部分,进而通过hook系统调用等技术实现隐藏、后门功能。
非lkm rootkit主要是指在系统不支持lkm机制时修改内核的一种方法,主要通过/dev/mem、/dev/kmem设备直接操作内存,从而对内核进行修改。
非lkm rootkit要实现对内核的修改,首先需要获得内核空间的内存,因此需要调用kmalloc分配内存,而kmalloc是内核空间的调用,无法在用户空间直接调用该函数,因此想到了通过int 0x80调用该函数的方法。
先选择一个不常见的系统调用号,在sys_call_table 中找到该项,通过写/dev/mem直接将其修改为kmalloc函数的地址,这样当我们在用户空间调用该系统调用时,就能通过int 0x80进入内核空间,执行kmalloc函数分配内存,并将分配好的内存地址由eax寄存器返回,从而我们得到了一块属于内核地址空间的内存,接着将要hack的函数写入该内存,并再次修改系统调用表,就能实现hook系统调用的功能。
rootkit的常见功能隐藏文件:通过strace ls可以发现ls命令其实是通过sys_getdents64获得文件目录的,因此可以通过修改sys_getdents64系统调用或者更底层的readdir实现隐藏文件及目录,还有对ext2文件系统直接进行修改的方法,不过实现起来不够方便,也有一些具体的限制。
==Phrack Inc.==Volume 0x0b, Issue 0x3d, Phile #0x0a of 0x0f|=----------------=[ Infecting loadable kernel modules ]=----------------=| |=-----------------------------------------------------------------------=| |=--------------------=[ truff <truff@> ]=-------------------=| |=-----------------------------------------------------------------------=| |=------------=[ translator: osmose <osmose@> ]=-------------=|LKM 注射--[ 内容1 - 介绍2 - ELF 基础知识2.1 - The .symtab section2.2 - The .strtab section3 - 玩转 loadable kernel modules3.1 - 模块加载3.2 - 修改 .strtab section3.3 - 插入代码3.4 - 保持隐蔽性4 - 实例4.1 - 最简单的 LKM 感染4.2 - 我还会回来的(重启之后)5 - 关于其他的操作系统5.1 - Solaris5.2 - *BSD5.2.1 - FreeBSD5.2.2 - NetBSD5.2.3 - OpenBSD6 - 结论7 - 感谢8 - 参考资料9 - 源代码9.1 - ElfStrChange9.2 - Lkminject--[ 1 - 介绍这些年来,很多 rootkit 使用了 loadable kernel modules。
这仅仅是一种短暂的流行现象吗?不是,lkm 的广泛使用得益于它强大的功能:可以隐藏文件,进程还有其他一些妙用。
对于第一代使用 lkm 的 rootkits,使用lsmod命令就可以轻易的找出它们。
我们见过许许多多隐藏模块的手法,比如在Plaguez的文章 [1]里提到的那种,还有更多的在Adore Rootkit [2]里面用到的技巧。
几年以后,我们还看到一些新技术:通过使用/dev/kmem [3] 修改kernel内存映射(kernel memory image)。
最后,参考资料[4]向我们展示了静态内核补丁(static kernel patching)技术。
这个技术解决了一个大问题:rootkit在机器重启后可以重新加载。
(译者注:查找了一下lsmod的运作方式,供大家了解。
"在kernel 2.0.x 时,指令'lsmod'是去开启档案 '/proc/modules' 来得知系统中,已加载哪些 Module。
不过到了kernel 2.1.x以后,系统提供了函式' query_module'。
因此,此时'lsmod'的实作便是透过呼叫 query_module 来取得系统已加载 module的相关资料。
")本文提出了一种新的隐藏lkm rootkits的技术并且保证这些rootkit在机器重启后能够重新加载。
文章会提到如何感染一个系统使用的内核模块。
本文针对的是 Linux kernel x86 2.4.x 系列,不过这个技术可以在任何使用ELF文件格式的系统中推广。
要了解这个技术需要一些基础知识。
内核模块是ELF object 文件,我们需要了解一点ELF格式,尤其是关于符号命名部分的知识。
此后,我们会接着学习模块加载机制以便了解如何把恶意代码插入内核模块中。
最后,实战操作一下模块的插入。
--[ 2 - ELF 基础Executable(可执行) & Linking(链接) Format (ELF) 是用于linux操作系统上的可执行文件格式。
我们先要了解部分相关知识,以后用得着(如果想要全面了解ELF格式,请参考[1])。
当链接两个ELF object 文件的时候,链接程序需要知道每个object文件里相关符号的一些情况。
每个ELF object文件(比如lkm的那些object文件)包含了两个部分(译者注:就是后文的 .symtab 和 .strtab 两个section )。
这两个section 是用来存储每个符号的信息结构的。
我们不但要研究它们,还要总结出一些对感染内核模块有用的思路。
----[ 2.1 - .symtab section这部分是一个结构列表。
当链接程序使用那些ELF object文件里的符号时,就需要这些数据。
在/usr/include/elf.h里可以找到这个结构的定义:/* Symbol table entry. */(符号列表入口)typedef struct{Elf32_Word st_name; /* Symbol name (string tbl index) */(符号名(字符串列表索引))Elf32_Addr st_value; /* Symbol value */(符号的值)Elf32_Word st_size; /* Symbol size */(符号数据占用空间的大小)unsigned char st_info; /* Symbol type and binding */(符号类型和绑定) unsigned char st_other; /* Symbol visibility */(符号的可见性)Elf32_Section st_shndx; /* Section index */(各section 的索引)} Elf32_Sym;这里我们只对st_name感兴趣。
实际上它是 .strtab section 的索引,而那些符号的名称就是存储在 .strtab 里面的。
----[ 2.2 - .strtab section.strtab section 是一个非空字符串的列表。
正如我们上面看见的,Elf32_Sym里面的st_name是 .strtab section 的索引。
如果我们寻找的符号在某个字符串里,我们可以很方便的得到这个字符串的偏移地址。
下面是我们的计算公式:offset_sym_name = offset_strtab + st_nameoffset_strtab 是 .strtab section 相对于文件起始处的偏移地址,可以通过section 名称解析机制获得。
这和我们要谈的技术关系不是很大,这里就不深究了。
参考资料[5]里面详细探讨了这个问题,后面章节9.1给出了具体实现的代码。
现在可以说,在ELF object 文件里,我们可以很方便的找到符号名并修改它们。
不过修改过程中始终要牢记一点:.strtab section 是由连续的非空字符串组成的,这对修改后新的符号名是一个限制:新名称的长度不能超过原来的那个长度,否则会殃及 .strtab 中下一个符号。
(译者注:这里和溢出的道理一样,新名称长度超过原先设定值,多出的部分就会写到后面一个符号名区域里,覆盖后面有用的部分)遵守了这一点,我们就能做到简单的修改符号名而不影响模块的正常运行,最终实现用一个模块感染另一个模块。
--[ 3 - 玩转 loadable kernel modules下面这段给出了动态加载模块程序的源代码。
了解了这个,我们就能学会在模块中插入代码了。
----[ 3.1 - 模块加载内核模块的加载是通过insmod这个用户空间工具实现的。
insmod包含在modutils包里[6]。
我们感兴趣的东西是insmod.c文件里的init_module()函数。
static int init_module(const char *m_name, struct obj_file *f,unsigned long m_size, const char *blob_name,unsigned int noload, unsigned int flag_load_map){(1) struct module *module;struct obj_section *sec;void *image;int ret = 0;tgt_long m_addr;....(2) module->init = obj_symbol_final_value(f,obj_find_symbol(f, "init_module"));(3) module->cleanup = obj_symbol_final_value(f,obj_find_symbol(f, "cleanup_module"));....if (ret == 0 && !noload) {fflush(stdout); /* Flush any debugging output */(4) ret = sys_init_module(m_name, (struct module *) image);if (ret) {error("init_module: %m");lprintf("Hint: insmod errors can be caused by incorrect module parameters, ""including invalid IO or IRQ parameters.\n""You may find more information in syslog or the output from dmesg");}}在 (1) 里,函数向一个结构体模块(struct module)填充了加载模块必须的数据。
需要关注的部分是 init_module 和 cleanup_module。
这是两个函数指针,分别指向被加载模块的 init_module() 和 cleanup_module() 函数。
(2)里面的 obj_find_symbol() 函数遍历符号列表查找名字为init_module的符号,然后提取这个结构体符号(struct symbol)并把它传递给 obj_symbol_final_value()。
后者从这个结构体符号提取出init_module函数的地址。
同理,在 (3) 里这个工作对于cleanup_module()又重复了一遍。