系统安全
文章平均质量分 79
shifters
这个作者很懒,什么都没留下…
展开
-
结构体中冒号的含义
C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,允许其它类型类型的存在。使用位域的主要目的是压缩存储,其大致规则为:1)如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;2)如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新原创 2012-05-11 17:04:32 · 4802 阅读 · 2 评论 -
xde反汇编引擎源码
这是用c语言写的经典XDE反汇编引擎源代码1.写在前面的话 eXtended (XDE) disassembler engine ---------------------------------- version 1.02转载 2011-12-02 20:20:57 · 5701 阅读 · 0 评论 -
rootkit技术之IoCallDriver介绍
IoCallDriver是一个非常重要的内核例程,利用它可以过滤所有的系统请求,在IoCallDriver中调用IofCallDriver例程,几乎所有的内核驱动都调用了IofCallDriver。IoCallDriver的原型如下:NTSTATUS IoCallDriver( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP原创 2011-12-03 09:16:09 · 3222 阅读 · 0 评论 -
栈的增长和溢出
VC编译器在构建一个x86程序时,为栈设置的默认参数是保留1MB,初始提交4KB,这意味着系统会为这个进程的初始线程创建一个1MB大小的栈,并先提交其中的一小部分(8KB,其中4KB为保护页)供程序使用。提交一小部分的目的是为了节约内存,如果提交的内存空间用完了就会触发栈增长机制来扩大提交区域。系统在提交栈空间时会故意多提交一个页面,称这个页面为栈保护页面(Stack Guard Page)。原创 2011-11-29 08:54:57 · 1310 阅读 · 0 评论 -
读书笔记_Rootkit技术_深入补丁
之前介绍的都是在函数的入口处进行代码补丁,因为在内存中很容易找到函数,所以这个方法很容易实现。但anti-rootkit也同样容易检测到这种补丁,因为它可以只检查函数起始的20个字节的完整性就能够发现是否被打补丁。若将代码改动置于初始的20个字节之后,那么这些软件就无法检测到。可以通过搜索函数中特定的代码字节来进行打补丁。如果这些代码是唯一的,那么只需要在内存中搜索它们并对其打补丁。如果代码不原创 2011-11-07 20:54:43 · 816 阅读 · 0 评论 -
Windows 文件系统(1)
在现代操作系统中,文件系统为存储设备提供了流方式的数据管理,允许应用程序共享卷的存储空间,同时又可以独享不同的数据流。在Windows中,文件系统提供了一个层次状的名字空间,并集成了系统的全局名字空间中;文件对象既是设备对象的已打开实例的抽象,也代表了文件系统中一个已打开的数据流实例。Windows 的文件系统以卷设备对象为存储基础,不同种类的文件系统定义了不同的存储格式。文件系统格式的描述能力也原创 2011-11-27 20:28:22 · 1891 阅读 · 0 评论 -
读书笔记_栈
栈的概念:从数据结构角度来看,栈是一种存储数据的容器(container),放入数据的操作被称为压入(push),从栈中取出数据的操作称为弹出(pop),采用的是后进先出的规则,即LIFO。而从计算机系统的角度而言,栈是存储局部变量和进行函数调用所必须不可少的连续内存区域。编译器再编译时会将函数调用和局部变量存取编译为合适的栈操作。操作系统在创建线程时,会为每个线程创建栈,包括分配栈所需的内存空间原创 2011-11-07 14:53:01 · 851 阅读 · 2 评论 -
读书笔记_Rootkit技术跳转模板
下面来介绍中断表的钩子,由于每个中断服务例程都位于不同的地址,因此每项的重入地址都是唯一的,这就需要一个跳转模板来调用到rootkit代码中,这种技术就称之为跳转模板(jump template)技术。 所有模板调用相同的rootkit代码,函数总是返回到的它的调用者,因此不必担心rootkit代码中的运行时地址修正。这种技术将唯一的特定代码作用于每个ISR(Interrupt Ser原创 2011-11-06 11:14:28 · 771 阅读 · 0 评论 -
读书笔记_Rootkit技术_文件过滤驱动程序(2)
第一部分介绍了基本的钩住磁盘驱动器,下面介绍使用调度例程来完成文件过滤。以下是标准的调度例程:NTSTATUS OurFilterDispatch ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){ PIO_STACK_LOCATION currentIrpStack; … currentIrpSta原创 2011-11-26 21:46:30 · 1013 阅读 · 0 评论 -
Rootkit技术基础(5) anti-rootkit
现在RK(rootkit)和ARK(anti-rootkit)的斗争已经进行了很久,在印象中最早出来的ARK工具是冰刃(IceSword),从冰 刃开始出来到现在RK和ARK的斗争一直在继续,目前冰刃还是在流行当中,自己感觉也正是冰刃的出来才带动了当前流行的RK和ARK的斗争呵呵,现在很多 病毒木马已经广泛的带有驱动,使用一些RK的技术和方法使自己更底层些更强大些,当前流行的ARK工具主要包括:隐原创 2011-11-05 10:18:28 · 1387 阅读 · 1 评论 -
Rookit技术基础(3)
.端口隐藏很多人检查自己中没中木马或后门,都会一些方法来查看自己本机所开的端口来判断是否有木马监听,而有些rootkit就开始想如何隐藏端口了。最 简单的枚举当前所开放的端口信息是调用iphlpapi.dll中的AllocateAndGetTcpTableFromStack和 AllocateAndGetUdpTableFromStack函数,或者AllocateAndGetTcpExTa原创 2011-11-05 10:14:38 · 1024 阅读 · 0 评论 -
读书笔记_CALL和RET指令
CALL指令是x86CPU中专门用作函数调用的指令,它的作用就是将当前的程序指针(EIP寄存器)值保存到栈中(称为linking information),然后转移到(branch to)目标操作数所指定的函数(被调用过程)继续执行。 根据被调用过程是否位于同一个代码段,CALL调用被分为近调用(Near Call)和远调用(Far Call)两种。在近调用中CPU的操作如下:A.原创 2011-11-13 19:49:23 · 5265 阅读 · 0 评论 -
读书笔记_跨特权级调用
通常发起调用的函数和被调用的函数都是位于同一个特权级的代码中的,这种调用叫做同特权级调用,另一种情况是位于不同特权级代码段中的代码互相调用,被称为跨特权级调用。跨特权级调用通常是通过一个所谓的调用门(Call Gate)来完成的。调用门的全称是调用门描述符( Call-Gate Descriptor),其结构与中断描述符非常类似,调用门描述符可以出现在GDT和LDT表中,不可以出现在IDT表中。原创 2011-11-14 13:13:57 · 1030 阅读 · 0 评论 -
Windows内核编程的一个小例子
#include "ntddk.h"void Example1Unload(IN PDRIVER_OBJECT pDrvobj){UNICODE_STRING usDosDevName;DbgPrint("Example1: Driver is being unload.\n");RtlInitUnicodeString(&usDosDevName, L原创 2012-05-03 12:40:56 · 1111 阅读 · 0 评论 -
访问硬件示例 访问键盘控制器
控制一个芯片首先要知道它的地址,大多数PC上的8259键盘控制器在地址0x60和0x64上是可寻址的,这些位置有时称为端口(port),因为它们提供了进入硬件芯片的入口。在使用DDK时,有多个宏可以读写这些端口:READ_PORT_UCHAR ();WRITE_PORT_UCHAR();另外也可以使用汇编指令.示例代码如下所示,感兴趣的话可以自己试试:#in原创 2012-05-03 21:31:22 · 2524 阅读 · 2 评论 -
访问硬件
大多数的硬件设备都有一个可以再某处进行寻址的微芯片。将数据移入和移出微芯片都需要一个地址,通常这个地址是预先知晓的并且固化到系统中的。地址总线包含许多细线,其中一些连至每个微芯片,因此通过在内存中指定一个要写入的地址,实际上就选择了一个微芯片。大多数的硬件都有某种控制器芯片,它给出一个可寻址的内存位置,有时称为端口(port),读写端口可能需要特殊的操作码指令:一些处理器具有特殊指令集,必须使用它原创 2012-05-01 14:21:28 · 893 阅读 · 0 评论 -
设计模式(1)
虽然小弟是夸专业学习的计算机,但对于第一次听说设计模式也是倍感羞愧。于是马上搜索了一些资料。原来设计模式真是在架构设计方面处于十分重要的地位。在网上搜索到一份笔记《设计模式精解-GOF23种设计模式解析》感觉不错,尤其是对初学者,我觉得设计模式可以先对其有个大概的感念,当在实际的工作中需要设计架构时,在详细研究每种结构的优缺点也不迟,下面就分享一下自己的感悟。设计模式分为三类模式:创建型模式,原创 2012-03-09 16:40:25 · 674 阅读 · 0 评论 -
windows下异常处理
异常的分发和处理时在线程范围内进行的,异常处理器的注册也是相对线程而言的。Windows系统中的每个用户态线程都拥有一个线程环境块(Thread Environment Block),TEB结构的具体定义。TEB结构的起始处总有一个被称为线程信息块(Thread information Block)的结构,简称TIB。TIB的第一字段ExceptionList记录的就是用来登记结构化异常处理链表的原创 2011-12-26 22:17:29 · 883 阅读 · 1 评论 -
Rootkits技术_直接内核操作(1)
直接内核对象操作(DirectKernel Object Manipulation, DKOM),通过直接内核对象操作可以在不安装钩子的情况下隐藏进程和驱动程序。在更改内核对象之前需要明确以下问题:1. 需要明确所要修改的对象是怎样的,包括结构的成员是什么2. 需要深入理解如何使用对象3. 要考虑不同操作系统的版本以及同一版本不同服务补丁之间的差异原创 2011-12-25 20:19:32 · 1426 阅读 · 0 评论 -
PE文件地址与内存地址
1. VC中可以通过#pragmadata_seg()可以将代码中的任意部分编译到PE的任意节中,节名也可以自己定义。如果文件经过了加壳处理,那么PE的节的信息就会变的非常“古怪”。2. PE文件地址与VA(virtualAddress)之间的转换。文件偏移地址(file offset)文件相对于文件开头的偏移装载基址(image base)PE装入内存时的基地址,原创 2011-12-14 21:15:24 · 3089 阅读 · 0 评论 -
堆(2)
Malloc calloc ,是CRT(C运行时库)的函数,运行时库初始化阶段会创建CRT堆,CRT堆是建立在Win32堆之上的,所以以上内存分配函数最终也是调用HeapAlloc函数来分配内存的。New操作符是通过中间函数间接调用HeapAlloc来分配内存。中间函数可以降低可以降低编译器与操作系统间的耦合度,还可以借助这些中间函数加入内存检查功能来辅助调试。下面介绍 HeapFree函原创 2011-12-15 08:28:00 · 1299 阅读 · 0 评论 -
Intel 8042键盘控制器详细介绍
本文转自http://shanzy.bokee.com/834368.htmlps/2 键盘硬件概述 对于驱动来说,和键盘相关的最重要的硬件是两个芯片。一个是 intel 8042 芯片,位于主板上,CPU 通过 IO 端口直接和这个芯片通信,获得按键的扫描码或者发送各种键盘命令。另一个是 intel 8048 芯片或者其兼容芯片,位于键盘中,这个芯片主要作用是从键盘的硬件中转载 2011-11-16 22:29:32 · 6963 阅读 · 0 评论 -
堆
堆(heap)是组织内存的一种重要方式,是程序在运行期动态申请空间的主要途径。与栈空间是由编译器产生的代码自动分配和释放不同,栈上的空间需要程序员自己编写代码来申请 (如HeapAlloc)和释放(如HeapFree),而且分配和释放操作应严格匹配,忘记释放或多次释放是不正确的。 与栈上的缓冲区溢出类似,如果想堆上的缓冲区写入超过其大小的内容,也会因为溢出而破坏堆上的其他内容,可能原创 2011-12-07 09:25:08 · 1180 阅读 · 1 评论 -
rootkit基础(2)
一、系统调用表 系统调用表又称系统服务表或者服务描述符表,是Windows 内核在进行各种系统操作时所需的一个函数指针表。也就是说,这个表中存放的是提供系统服务的各种函数的地址。当然,该表所指向的都是系统自身的一些函数, 但是,如果我们对它做了手脚后,就可以让它指向我们自己的函数。这正是本文要讲解的重点。读者一定要注意,修改系统调用表及替换内核函数时,会对系统全局产生影响,稍有不慎就会导致原创 2011-11-05 10:11:11 · 977 阅读 · 3 评论 -
Rootkit基础(1)
1. rootkit的主要分类: 应用级->内核级->硬件级 早期的rootkit主要为应用级rootkit,应用级rootkit主要通过替换login、ps、ls、netstat等系统工具,或修 改.rhosts等系统配置文件等实现隐藏及后门;硬件级rootkit主要指bios rootkit,可以在系统加载前获得控制权,通过向磁盘中写入 文件,再由引导程序加载该文件重新获得控制权,也可原创 2011-11-05 09:15:08 · 1187 阅读 · 0 评论 -
Rootkit技术基础(4)
Rootkit自身也是木马后门或恶意程序的一类,只是,它很特殊,为什么呢?因为,你无法找到它。 正如自然界的规则一样,最流行的病毒,对生物的伤害却是最小的,例如一般的感冒,但是 最不流行的病毒,却是最夺命的。Rootkit木马就是信息世界里的 AIDS(爱滋病),一旦感染 ,就难以用一般手段消灭了,因为它和自然界里的同类做的事情一样,破坏了系统自身检测 的完整性——抛开术语的描述也许难以理解,但是原创 2011-11-05 10:16:51 · 1757 阅读 · 1 评论 -
读书笔记_windows下的验证机制
常见的测试手段有以下几种: 黑盒测试 白盒测试 内建自检(BIST,Built-InSelf-Test),是指在软件代码内部构建一些测试功能,这些功能可以在某些情况下执行,或者被自动测试工具所调用以发现问题。 压力测试(Stresstesting),用于测原创 2011-10-19 09:04:12 · 1314 阅读 · 1 评论 -
读书笔记_windows内核编程基础_part 1
1. 数据类型的定义,一般使用重定义的方式,例如ULONG,UCHAR等,x86到x64平台,指针从4字节转变成8字节。2. 大多数的内核API都返回一个状态,这个状态的类型为NTSTATUS。一般用宏NT_SUCCESS()来判断返回值是否成功3原创 2011-10-07 19:08:43 · 791 阅读 · 0 评论 -
读书笔记_windows下的混合钩子(HOOK)_part 1
读书笔记_windows下的混合钩子(HOOK)_part 1 在windows,所谓的混合钩子,指的是即使用用户态下的钩子,又使用内核态的钩子。优点是既能实现强大的功能,又能避免被安全软件发现。 混合HOOK使用IAT HOOK 勾住用户空间进程,下面原创 2011-10-07 16:33:09 · 985 阅读 · 0 评论 -
读书笔记_windows下的混合钩子(HOOK)_part 5_钩子的内存空间
钩子的内存空间用户空间的钩子的问题之一是为了编写LoadLibrary参数或编写代码,钩子通常必须在远程进程中分配空间。在内核中存在一个可写区域,它映射到每个进程的地址空间。另一个技术利用了两个虚拟地址映射到同一个物理地址这个事实。内核地址0xFFDF0000和用户地址0x7原创 2011-10-15 23:35:39 · 933 阅读 · 0 评论 -
读书笔记_Windows的启动过程
Windows的启动过程:1. 系统固件(firmware)首先启动,即BIOS(Basic Input/Output System, 基本输入输出系统)或EFI(Entex Firmware Interface),BIOS或EFI在完成基本的硬件检测和平台初始化原创 2011-10-07 21:59:51 · 1020 阅读 · 1 评论 -
读书笔记_windows下的混合钩子(HOOK)_part 4_使用MDL修改内存保护机制
MDL(Memory Descriptor List),指内存描述符表,它包含了该内存区域的起始地址、拥有者进程、字节数量以及标志。MDL结构定义在ntddk.h中,具体结构如下:Typedef struct _MDL{ Struct _MDL *Next;原创 2011-10-15 10:30:08 · 2151 阅读 · 0 评论 -
读书笔记_windows下的混合钩子(HOOK)_part 3_HookImportsOfImage函数解析
HookImportsOfImage函数解析以下是_IMAGE_DOS_HEADER的结构,是在winnt.h头文件下的,指的是DOS.exe文件的头typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header原创 2011-10-11 21:04:15 · 739 阅读 · 0 评论 -
读书笔记_windows内核调试_part2_ 多核启动过程
多核启动过程下面我们看多核处理器的启动过程,在part 1中介绍过每个CPU都会执行KiInitializeKernel函数,但只有第一个CPU才执行其中的所有初始化工作,包括全局的初始化,其他CPU只执行CPU的相关的部分。0号CPU才调用和执行KiInitSystem,初原创 2011-10-11 22:30:30 · 1064 阅读 · 0 评论 -
Windows下的日志机制
对于日志,大部分人的想法应当和我起初的想法一致,只要写个函数,在这个函数中打开一个文件,把需要记录的事件信息写到这个文件中。然后在需要记录日志的地方调用这个函数。但此时需要考虑的问题有很多,包括文件名的定义,是每次写日志都创建一个新文件还是在一个文件中写所有的信息。如果是同一原创 2011-09-25 15:23:27 · 9788 阅读 · 0 评论 -
Windows下的钩子
Windows下的钩子2011-9-9API钩子应用程序将kernel32.dll加载到自己的私有空间0x0001000~0x7FFE0000之间,所以本地进程只要能访问目标进程的地址空间,就可以直接重写kernel32.dll中或应用程序导入表中的任何函数。通过利用机器原创 2011-09-21 11:52:01 · 2366 阅读 · 3 评论 -
读书笔记_windows下的混合钩子(HOOK)_part 2
读书笔记_windows下的混合钩子(HOOK)_part 21. 分析PE文件下面接着看如果分析PE文件,从而找到其要导入的DLL。首先看PE文件的导入数据.idata段。.idata段是导入数据,包括导入库和导入地址名称表。在WINNT.H中所定义的数原创 2011-10-09 17:17:21 · 734 阅读 · 0 评论 -
读书笔记_windows内核编程基础_part 2
在进行编译驱动程序时,要对使用的平台进行选择,包括x86, x64, IA64.X86指的是IA32平台,它是一个intel通用计算机系列的标准编号的缩写,也标识一套通用的计算机指令集合,X与处理器没有任何关系它是一个对所有*86系统的简单的通配符定义。采用32位变长指令集,原创 2011-10-18 22:30:40 · 1520 阅读 · 0 评论 -
读书笔记_Rootkit技术之detour补丁
下面介绍一下内联函数钩子。这种钩子远比IAT钩子强大,并不存在与Dll绑定时间相关的问题。在实现内联函数钩子时,rootkit实际上是重写了目标函数的代码字节,因此不管应用程序如何或者何时解析函数地址,都能够钩住函数。该方法在内核或用户空间都可以使用,但更常见于用户空间。 通常实现的内联函数钩子时会保存钩子要重写的目标函数的多个起始字节。保存了原始字之后,常常在目标函数的前5个字节中放原创 2011-11-02 21:08:27 · 1254 阅读 · 1 评论 -
VC6的栈平衡检查
栈的有序性依靠每个函数都遵守栈的使用规则,保证函数返回时栈指针(ESP)的值与进入函数时一致,即保持栈平衡。否则的话就会导致栈溢出,可能引起安全问题或程序崩溃。VC6会自动在每个函数的末尾插入指令来调用一个名为_chkesp的函数,_chkesp是C运行库(CRT)中的一个函数,用来检查栈指针的完好性,检查方法是比较ESP和EBP寄存器的值,看其是否相等,如果相等则通过,否则就准备参数调用_C原创 2011-11-21 17:30:39 · 1190 阅读 · 0 评论