天书夜读:从汇编语言到Windows内核编程笔记(1)

 汇编部分

0、call、ret、push、pop、add、sub都可以操作堆栈,栈顶比栈底的地址小,由esp寄存器指向;
1、call 的本质相当于push+jmp,ret的本质相当于pop+jmp。

  call用来调用函数,先将下一条指令的地址压栈,再跳转到调用函数的开始处;ret弹出返回指令,再跳转;

2、数据传送指令:

  mov dst,src                    :数据移动指令;

  xor  eax,eax                   :快捷的清零指令;

  lea edi,[ebp-0cch]            :load effect address,方括号表示存储器,即ebp-0cch地址处得内容,该指令取得该内容的地址--ebp-0cch;

  stos dword ptr es:[edi]   :串存储指令,从es:[edi]开始,将eax中的内容以双字存储ecx次;

3、Windows中,不管哪种调用方式都是返回值放在eax中,然后返回。外部从eax中得到值。

4、Ebp总是被我们用来保存这个函数执行之前的esp的值,即当前函数的栈底;

5、把局部变量区域初始化成全0cccccccch,0cch实际是int 3 指令的机器码,这是一个断点中断指令。

6、C语言循环反汇编:

  for:

     mov  <循环变量>,<初始值>                 ;给循环变量赋初值

    jmp B                                                ;跳到第一次循环处

    A: (循环改动变量)                            ;修改循环变量

      ……

    B: cmp  <循环变量>,<限制变量>         ;检查循环条件

      jge  跳出循环

      (循环体)

      jmp A                                           ;跳回去修改循环变量

  if:

    cmp  <条件>                                      

    jle <下一个分支>

7、任何一段中间不加任何跳转,连续的mov和加减乘除指令一般都可以还原为一个C表达式。

  如果有下面的代码段,说明可能是含有数组或结构体

    Mov eax,<数组下标>

    Inul eax,eax,<结构大小>

    Mov ecx, <结构数组开始的地址>

    Mov eax, dword ptr [ecx + eax]

  若要访问结构内部变量的时候,最后面的一个指令还会加上一个数字:

    mov  eax,dword ptr[ecx+eax+0ch]

8、分析发行版汇编指令时:(看书,待练习

  与堆栈操作相关的,call,ret等相关指令,我们叫做函数调用([函数])指令:  F指令

  流程控制代码,涉及对循环变量的操作指令,判断和跳转指令:C指令

  数据处理指令,其它一般为数据处理指令:D指令

 

内核基础

1、基本概念
   首先需要安装DDK (Device Driver Kit),这里我选择Microsoft Windows Server 2003 SP1 DDK。
   Windows 驱动分成两类,一类是不支持即插即用的NT式驱动,一类是支持即插即用的WDM((Windows Driver Model))驱动。NT式驱动的安装是基于服务的,可以通过修改注册表进行,也可以直接通过服务函数,如CreateService进行安装;但WDM 式驱动不同,它安装的时候需要通过编写一个inf文件进行控制。
   Driver.h头文件中包含了开发NT式驱动所需要的NTDDK.h,此外还定义了几个标志来指明函数和变量分配在分页内存还是非分页内存中。Windows驱动程序的入口函数是DriverEntry函数。
  有两种编译驱动的办法,一种是用DDK环境来编译,需要在源代码所在目录下创建两个文件makefile和Sources,功能是引入DDK的bin目录下 的makefile.def文件,然后在开始菜单中选择“Windows XP Checked Build Environment”编译环境,进入需要编译的目录,输入”build“命令就可以;第二种编译方式是使用VC++进行编译。[1]]
为了调试方便,最好安装一个虚拟机。[2]
  Windows的驱动模型概念,本来是就驱动程序的行为而言的。比如WDM驱动,必须要满足提供n种被要求的特性(如电源管理、即插即用)才被称为WDM驱动。如果不提供这些功能,那么统一称为NT式驱动。同样的,WDF驱动也有它的一系列规范。
  WDF(Windows Driver Foundation)驱动是可以调用传统型驱动所调用的内核API的,WDF可以视为传统型的升级版。[3]
WDK = DDK (Driver Development Kit) + HCT Kit (Hardware Compatibility Test) + WDF (Windows Driver Foundation) + DTM (Driver Test Manager) + WDF Driver Verification Tools + IFS Kit (Installable File Systems Kit) + Free ISO image download - Visual Studio 2005 out of the box integration[4]

 

2、基本语法[5]


(1)字符串
  在驱动开发中四处可见的是Unicode字符串。因此可以说:Windows的内核是使用Uincode编码的。ANSI_STRING(单字节)仅仅在某些碰到窄字符的场合使用。而且这种场合非常罕见。一个定义如下:


typedef struct _UNICODE_STRING {
  USHORT Length; // 字符串的长度(字节数)
  USHORT MaximumLength; // 字符串缓冲区的长度(字节数)
  PWSTR Buffer; // 字符串缓冲区指针
} UNICODE_STRING, *PUNICODE_STRING;


  UNICODE_STRING并不保证Buffer中的字符串是以空结束的。因此,类似下面的做法都是错误的,可能会会导致内核崩溃:


UNICODE_STRING str;

len = wcslen(str.Buffer); // 试图求长度。
DbgPrint(“%ws”,str.Buffer); // 试图打印str.Buffer。


  如果要用以上的方法,必须在编码中保证Buffer始终是以空结束。但这又是一个麻烦的问题。所以,使用微软提供的Rtl系列函数来操作字符串,才是正确的方法。[6]

 

  字符串的初始化: 宏定义初始化, UNICODE_STRING sty = RTL_CONSTANT_STRING(L"my first string");     //ntdef.h中定义的宏

             函数初始化, RtlInitUnicodeString(&str,L"my first string!");

  字符串拷贝: 使用UNICODE_STRING要确保其缓冲区的长度

      RtlInitEmptyString(dst, dst_buf,256*sizeof(WCHAR));

      RtlCopyUnicodeString(&dst,&src);

  字符串连接:    RtlAppendUnicode ToString(&dst,L"my second string.")

         RtlAppendUnicodeStringToString(&dst,&src)        //将src连接到dst上

(2)内存与链表
  
内存分配:

  ExAllocatePoolWithTag(NonpagedPool/PagedPool, length, 自定义的内存标记32位数); //NonpagedPool永远存在于物理内存中,不会被交换到硬盘上
  ExFreePool(dst.Buffer)    //释放内存指针即可,不能释放栈空间,必须保证和ExAllocatePoolWithTag的成对关系


LIST_ENTRY中的数据成员Flink指向下一个LIST_ENTRY。windows内核中使用LIST_ENTRY作为链表,这个结构几乎随处可见。
  整个链表中的最后一个LIST_ENTRY的Flink不是空。而是指向头节点。得到LIST_ENTRY之后,要用CONTAINING_RECORD来得到链表节点中的数据。
  锁一般不会定义成局部变量。可以使用静态变量、全局变量,或者分配在堆中。

  LIST_ENTRY如果是作为链表的头,在使用之前,必须调用InitializeListHead来初始化。

 

  LIST_ENTRY插入到MY_FILE_INFOR结构(或者其他自定义结构)头部的好处:一个MY_FILE_INFOR看起来就像一个LIST_ENTRY。否则,就可以用下面的宏来获得链表节点。

  CONTAINING_RECORD(address, type, field) :  宏定义,作用是通过一个address结构的指针(指向type结构中的field),找到该指针指向的field所在结构(type类型)的指针。
文件操作
  在内核中不能调用用户层的Win32 API函数来操作文件。在这里必须改用一系列与之对应的内核函数。


VOID InitializeObjectAttributes(
  OUT POBJECT_ATTRIBUTES InitializedAttributes,   //OBJECT_ATTRIBUTES结构的指针
  IN PUNICODE_STRING ObjectName,                    //对象名字字符串,即文件路径
  IN ULONG Attributes,               //可以是OBJ_KERNEL_HANDLE等
  IN HANDLE RootDirectory,                                 //用于相对打开的情况,ObjectName为绝对路径的话,一般为NULL
  IN PSECURITY_DESCRIPTOR SecurityDescriptor   //用于设置安全描述符

);


  Windows内核中,无论是打开文件,还是注册表,设备等,都会先调用初始化一个OUT POBJECT_ATTRIBUTES


  OBJ_KERNEL_HANDLE表明打开的文件句柄一个“内核句柄”。内核文件句柄比应用层句柄使用更方便,可以不受线程和进程的限制。在任何线程中都可以读写。同时打开内核文件句柄不需要顾及当前进程是否有权限访问该文件的问题(如果是有安全权限限制的文件系统)。


  路径并不是像应用层一样直接写“C:\\a.dat”,而是写成了“\\??\\C:\\a.dat”。这是因为ZwCreateFile使用的是对象路径。“C:”是一个符号链接对象。符号链接对象一般都在“\\??\\”路径下。


注册表[5]
  应用编程中对应的子键 驱动编程中的路径写法


HKEY_LOCAL_MACHINE \Registry\Machine
HKEY_USERS \Registry\User
HKEY_CLASSES_ROOT 没有对应的路径
HKEY_CURRENT_USER 没有简单的对应路径,但是可以求得
ZwOpenKey
ZwQueryValueKey
ZwSetValueKey


时间和定时器

获得实际的毫秒数

void MyGetTickCount (PULONG msec)
{
  LARGE_INTEGER tick_count;
  ULONG myinc = KeQueryTimeIncrement();         //获得一个“滴答”的100纳秒数
  KeQueryTickCount(&tick_count);                      //获得“滴答”数
  tick_count.QuadPart *= myinc;
  tick_count.QuadPart /= 10000;                        //1毫秒=1000000纳秒
  *msec = tick_count.LowPart;
}

获得计算机的时间,并打印年月日

  PWCHAR MyCurTimeStr()

  {

    LARGE_INTEGER snow,now;

    TIME_FIELDS now_fields;

    static WCHAR time_str[32] = {0};

    KeQuerySystemTime(&snow);                             //获取标准时间,格林威治时间

    ExSystemTimeToLocalTime(&snow,&now);           //转换为当地时间

    RtlTimeToTimeFields(&now,&now_fields);       //转换为人们可以理解的时间要素

    RtlStringCchPrintfW(                                        //打印到字符串中

      time_str,

      32*2,

      L"%4d-%2d-%2d %2d-%2d-%2d",

      now_fields.Year,now_fields.Month,now_fields.Day,

      now_fields.Hour,now_fields.Minute,now_fields.Second);

    return time_str;

  }


KeSetTimer
内核的代码始终运行在某个“中断级”上。Dispatch > APC > Passive


参考
[1] http://www.cnblogs.com/phinecos/archive/2009/02/19/1393803.html
[2] http://www.cnblogs.com/qsilence/archive/2009/06/11/1501511.html
[3 http://msdn.microsoft.com/en-us/library/ff557565%28VS.85%29.aspx
[4] http://www.cnblogs.com/wanghao111/archive/2009/05/25/1489041.html
[5] Windows驱动编程基础教程.doc
[6] Windows DDK

 

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

总共20多兆,太大了,权限不够,一次上传不了。 总共2个包,这是第一个包 第二个包:http://download.csdn.net/source/2517250 入手篇 熟悉汇编   本书的第一部分,将帮助读者消除对汇编的恐惧,熟悉汇编。本部分包括第1~3章。稍显枯燥的是,它们和Windows内核无关,是纯C语言与汇编语言的关系的章节。如果读者已经精通汇编语言,并能顺利阅读汇编代码,请直接跳过本部分。   第1章 汇编指令与C语言 2   1.1 上机建立第一个工程 4   1.1.1 用Visual Studio创建工程 4   1.1.2 用Visual Studio查看汇编代码 5   1.2 简要复习常用的汇编指令 6   1.2.1 堆栈相关指令 6   1.2.2 数据传送指令 7   1.2.3 跳转与比较指令 8   1.3 C函数的参数传递过程 9   第2章 C语言的流程和处理 14   2.1 C语言的循环反汇编 15   2.1.1 for循环 15   2.1.2 do循环 16   2.1.3 while循环 17   2.2 C语言判断与分支的反汇编 18   2.2.1 if-else判断分支 18   2.2.2 switch-case判断分支 19   2.3 C语言的数组与结构 22   2.4 C语言的共用体和枚举类型 24   第3章 练习反汇编C语言程序 26   3.1 算法的反汇编 27   3.1.1 算法反汇编代码分析 27   3.1.2 算法反汇编阅读技巧 28   3.2 发行版的反汇编 29   3.3 汇编反C语言练习 33   基础篇 内核编程   本书的第二部分,是编写Windows内核程序编程方法的基础。本部分包括第4~7章,如果读者对Windows内核编程已经有一定的了解,可以跳过本部分;如果读者从未接触过Windows内核编程,本部分将指导读者开始Windows内核编程,学会使用WDK,并熟悉内核编程的习惯与方法。   第4章 内核字符串与内存 38   4.1 字符串的处理 39   4.1.1 使用字符串结构 39   4.1.2 字符串的初始化 41   4.1.3 字符串的拷贝 42   4.1.4 字符串的连接 42   4.1.5 字符串的打印 43   4.2 内存与链表 45   4.2.1 内存的分配与释放 45   4.2.2 使用LIST_ENTRY 46   4.2.3 使用长长整型数据 49   4.2.4 使用自选锁 50   第5章 文件与注册表操作 52   5.1 文件操作 53   5.1.1 使用OBJECT_ATTRIBUTES 53   5.1.2 打开和关闭文件 54   5.1.3 文件读/写操作 58   5.2 注册表操作 60   5.2.1 注册表键的打开 60   5.2.2 注册表值的读 62   5.2.3 注册表值的写 65   第6章 时间与线程 67   6.1 时间与定时器 68   6.1.1 获得当前滴答数 68   6.1.2 获得当前系统时间 69   6.1.3 使用定时器 70   6.2 线程与事件 73   6.2.1 使用系统线程 73   6.2.2 在线程中睡眠 75   6.2.3 使用同步事件 76   第7章 驱动、设备与请求 79   7.1 驱动与设备 80   7.1.1 驱动入口与驱动对象 80   7.1.2 分发函数和卸载函数 80   7.1.3 设备与符号链接 82   7.1.4 设备的安全创建 83   7.1.5 设备与符号链接的用户相关性 85   7.2 请求处理 86   7.2.1 IRP与IO_STACK_LOCATION 86   7.2.2 打开与关闭请求的处理 88   7.2.3 应用层信息传入 89   7.2.4 驱动层信息传出 91   探索篇 研究内核   本书的第三部分,开始探索Windows内核程序,并尝试阅读反汇编代码作为指引。本部分包括第8~10章。如果读者对Windows内核编程已经有一定的了解,这一部分会比较有趣;如果读者从未接触过Windows内核编程,读者应该先学习第二部分。能自己编写内核程序并不意味着可以读懂内核,虽然反过来是一定成立的。读懂别人编写的没有代码的程序,比自己编写更困难一些,但的确是值得的。   第8章 进入Windows内核 96   8.1 开始Windows内核编程 97   8.1.1 内核编程的环境准备 97   8.1.2 用C语言写一个内核程序 99   8.2 学习用WinDbg进行调试 102   8.2.1 软件的准备 102   8.2.2 设置Windows XP调试执行 103   8.2.3 设置VMWare虚拟机调试 104   8.2.4 设置被调试机为Vista的情况 105   8.2.5 设置Windows内核符号表 106   8.2.6 调试例子diskperf 106   8.3 认识内核代码函数调用方式 107   8.4 尝试反写C内核代码 111   8.5 如何在代码中寻找需要的信息 113   第9章 用C++编写的内核程序 117   9.1 用C++开发内核程序 118   9.1.1 建立一个C++的内核工程 118   9.1.2 使用C接口标准声明 119   9.1.3 使用类静态成员函数 120   9.1.4 实现new操作符 121   9.2 开始阅读一个反汇编的类 122   9.2.1 new操作符的实现 122   9.2.2 构造函数的实现 124   9.3 了解更多的C++特性 126   第10章 继续探索Windows内核 131   10.1 探索Windows已有内核调用 132   10.2 自己实现XP的新调用 135   10.2.1 对照调试结果和数据结构 135   10.2.2 写出C语言的对应代码 137   10.3 没有符号表的情况 138   10.4 64位操作系统下的情况 141   10.4.1 分析64位操作系统的调用 143   10.4.2 深入了解64位内核调用参数传递 145   深入篇 修改内核   这是本书的第四部分。读者已经尝试过探索Windows内核程序,并尝试阅读反汇编代码。那么接下来,必须掌握修改内核的方法。每一个Windows内核程序,都可以看做Windows内核本身的一个“补丁”。有时只需要独立存在,就能起到它的作用;有时却必须对已有的内核二进制代码进行部分修改。本部分包括第11~13章,主要介绍的是内核Hook。   第11章 机器码与反汇编引擎 150   11.1 了解Intel的机器码 151   11.1.1 可执行指令与数据 151   11.1.2 单条指令的组成 152   11.1.3 MOD-REG-R/M的组成 155   11.1.4 其他的组成部分 157   11.2 反汇编引擎XDE32基本数据结构 159   11.3 反汇编引擎XDE32具体实现 162   第12章 CPU权限级与分页机制 166   12.1 Ring0和Ring3权限级 167   12.2 保护模式下的分页内存保护 169   12.3 分页内存不可执行保护 172   12.3.1 不可执行保护原理 172   12.3.2 不可执行保护的漏洞 173   12.4 权限级别的切换 177   12.4.1 调用门及其漏洞 178   12.4.2 sysenter和sysexit指令 181   第13章 开发Windows内核Hook 186   13.1 XP下Hook系统调用IoCallDriver 187   13.2 Vista下IofCallDriver的跟踪 189   13.3 Vista下inline hook 193   13.3.1 写入跳转指令并拷贝代码 193   13.3.2 实现中继函数 196   实战篇 实际开发   实战部分是本书最深入和复杂的一部分,包括第14~17章。为了让前面练习的成果,在实际应用中产生价值,在这部分我们补充更多的理论知识并尝试用它们去做一点什么。这一部分包括指令分析、硬件基础知识、内核Hook的实际开发练习,以及将完成一个用到内核Hook的有趣的实例,这个实例有助于计算机阻挡各种病毒和木马的侵袭。   此外,本部分还包括特殊的一章,涉及如何巧妙地编写代码,来防止被其他不受欢迎的读者阅读。这与本书的主旨完全相反,正所谓物极必反。   第14章 反病毒、木马实例开发 200   14.1 反病毒、木马的设想 201   14.2 开发内核驱动 204   14.2.1内核中检查可执行文件 204   14.2.2 在内核中生成设备接口 208   14.2.3 在内核中等待监控进程的响应 210   14.3 开发监控进程 216   14.4 本软件进一步展望 218   第15章 Rootkit与HIPS 220   15.1 Rootkit为何很重要 222   15.2 Rootkit如何逃过检测 224   15.3 HIPS如何检测Rootkit 234   第16章 手写指令保护代码 237   16.1 混淆字符串 238   16.2 隐藏内核函数 244   16.3 混淆流程与数据操作 251   16.3.1 混淆函数出口 251   16.3.2 插入有意义的花指令 253   第17章 用VMProtect保护代码 258   17.1 安装VMProtect 259   17.2 使用VMProtect 261   17.3 查看VMProtect效果 267   参考文献 270
汇编语言Windows内核编程.pdf 【完整书签】【高清版】(共282页) ============================================ 入手篇 熟悉汇编 第1章 汇编指令与c语言 1.1 上机建立第一个工程 1.1.1用visual studio创建工程 1.1.2用visual studio查看汇编代码 1.2 简要复习常用的汇编指令 1.2.1堆栈相关指令 1.2.2数据传送指令 1.2.3跳转与比较指令 1.3 c函数的参数传递过程 第2章 c语言的流程和处理 2.1 c语言的循环反汇编 2.1.1 for循环 2.1.2 do循环 2.1.3 while循环 2.2 c语言判断与分支的反汇编 2.2.1 if-else判断分支 2.2.2 switch-case判断分支 2.3 c语言的数组与结构 2.4 c语言的共用体和枚举类型 . 第3章 练习反汇编c语言程序 3.1 算法的反汇编 3.1.1算法反汇编代码分析 3.1.2算法反汇编阅读技巧 3.2 发行版的反汇编 3.3 汇编反c语言练习 基础篇 内核编程 第4章 内核字符串与内存 4.1 字符串的处理 4.1.1使用字符串结构 4.1.2字符串的初始化 4.1.3字符串的拷贝 4.1.4字符串的连接 4.1.5字符串的打印 4.2 内存与链表 4.2.1内存的分配与释放 4.2.2使用list_entry 4.2.3使用长长整型数据 4.2.4使用自选锁 第5章 文件与注册表操作 5.1 文件操作 5.1.1使用object_attributes 5.1.2打开和关闭文件 5.1.3文件读/写操作 5.2 注册表操作 5.2.1注册表键的打开 5.2.2注册表值的读 5.2.3注册表值的写 第6章 时间与线程 6.1 时间与定时器 6.1.1获得当前滴答数 6.1.2获得当前系统时间 6.1.3使用定时器 6.2 线程与事件 6.2.1使用系统线程 6.2.2在线程中睡眠 6.2.3使用同步事件 第7章 驱动、设备与请求 7.1 驱动与设备 7.1.1驱动入口与驱动对象 7.1.2分发函数和卸载函数 7.1.3设备与符号链接 7.1.4设备的安全创建 7.1.5设备与符号链接的用户相关性 7.2 请求处理 7.2.1 irp与io_stack_location 7.2.2打开与关闭请求的处理 7.2.3应用层信息传入 7.2.4驱动层信息传出 探索篇 研究内核 第8章 进入windows内核 8.1 开始windows内核编程 8.1.1内核编程的环境准备 8.1.2用c语言写一个内核程序 8.2 学习用windbg进行调试 8.2.1软件的准备 8.2.2设置windows xp调试执行 8.2.3设置vmware虚拟机调试 8.2.4设置被调试机为vista的情况 8.2.5设置windows内核符号表 8.2.6调试例子diskperf 8.3 认识内核代码函数调用方式 8.4 尝试反写c内核代码 8.5 如何在代码中寻找需要的信息 第9章 用c++编写的内核程序 9.1 用c++开发内核程序 9.1.1建立一个c++的内核工程 9.1.2使用c接口标准声明 9.1.3使用类静态成员函数 9.1.4实现new操作符 9.2 开始阅读一个反汇编的类 9.2.1 new操作符的实现 9.2.2构造函数的实现 9.3 了解更多的c++特性 第10章 继续探索windows内核 10.1 探索windows已有内核调用 10.2 自己实现xp的新调用 10.2.1对照调试结果和数据结构 10.2.2写出c语言的对应代码 10.3 没有符号表的情况 10.4 64位操作系统下的情况 10.4.1分析64位操作系统的调用 10.4.2深入了解64位内核调用参数传递 深入篇 修改内核11章 机器码与反汇编引擎 11.1 了解intel的机器码 11.1.1可执行指令与数据 11.1.2单条指令的组成 11.1.3 mod-reg-r/m的组成 11.1.4其他的组成部分 11.2 反汇编引擎xde32基本数据结构 11.3 反汇编引擎xde32具体实现 第12章 cpu权限级与分页机制 12.1 ring0和ring3权限级 12.2 保护模式下的分页内存保护 12.3 分页内存不可执行保护 12.3.1不可执行保护原理 12.3.2不可执行保护的漏洞 12.4 权限级别的切换 12.4.1调用门及其漏洞 12.4.2 sysenter和sysexit指令 第13章 开发windows内核hook 13.1 xp下hook系统调用iocalldriver 13.2 vista下iofcalldriver的跟踪 13.3 vista下inline hook 13.3.1写入跳转指令并拷贝代码 13.3.2实现中继函数 实战篇 实际开发 第14章 反病毒、木马实例开发 14.1 反病毒、木马的设想 14.2 开发内核驱动 14.2.1内核中检查可执行文件 14.2.2在内核中生成设备接口 14.2.3在内核中等待监控进程的响应 14.3 开发监控进程 14.4 本软件进一步展望 第15章 rootkit与hips 15.1 rootkit为何很重要 15.2 rootkit如何逃过检测 15.3 hips如何检测rootkit 第16章 手写指令保护代码 16.1 混淆字符串 16.2 隐藏内核函数 16.3 混淆流程与数据操作 16.3.1混淆函数出口 16.3.2插入有意义的花指令 第17章 用vmprotect保护代码 17.1 安装vmprotect 17.2 使用vmprotect 17.3 查看vmprotect效果 参考文献
总共20多兆,太大了,权限不够,一次上传不了。 第一个包:http://download.csdn.net/source/2517241 入手篇 熟悉汇编   本书的第一部分,将帮助读者消除对汇编的恐惧,熟悉汇编。本部分包括第1~3章。稍显枯燥的是,它们和Windows内核无关,是纯C语言与汇编语言的关系的章节。如果读者已经精通汇编语言,并能顺利阅读汇编代码,请直接跳过本部分。   第1章 汇编指令与C语言 2   1.1 上机建立第一个工程 4   1.1.1 用Visual Studio创建工程 4   1.1.2 用Visual Studio查看汇编代码 5   1.2 简要复习常用的汇编指令 6   1.2.1 堆栈相关指令 6   1.2.2 数据传送指令 7   1.2.3 跳转与比较指令 8   1.3 C函数的参数传递过程 9   第2章 C语言的流程和处理 14   2.1 C语言的循环反汇编 15   2.1.1 for循环 15   2.1.2 do循环 16   2.1.3 while循环 17   2.2 C语言判断与分支的反汇编 18   2.2.1 if-else判断分支 18   2.2.2 switch-case判断分支 19   2.3 C语言的数组与结构 22   2.4 C语言的共用体和枚举类型 24   第3章 练习反汇编C语言程序 26   3.1 算法的反汇编 27   3.1.1 算法反汇编代码分析 27   3.1.2 算法反汇编阅读技巧 28   3.2 发行版的反汇编 29   3.3 汇编反C语言练习 33   基础篇 内核编程   本书的第二部分,是编写Windows内核程序编程方法的基础。本部分包括第4~7章,如果读者对Windows内核编程已经有一定的了解,可以跳过本部分;如果读者从未接触过Windows内核编程,本部分将指导读者开始Windows内核编程,学会使用WDK,并熟悉内核编程的习惯与方法。   第4章 内核字符串与内存 38   4.1 字符串的处理 39   4.1.1 使用字符串结构 39   4.1.2 字符串的初始化 41   4.1.3 字符串的拷贝 42   4.1.4 字符串的连接 42   4.1.5 字符串的打印 43   4.2 内存与链表 45   4.2.1 内存的分配与释放 45   4.2.2 使用LIST_ENTRY 46   4.2.3 使用长长整型数据 49   4.2.4 使用自选锁 50   第5章 文件与注册表操作 52   5.1 文件操作 53   5.1.1 使用OBJECT_ATTRIBUTES 53   5.1.2 打开和关闭文件 54   5.1.3 文件读/写操作 58   5.2 注册表操作 60   5.2.1 注册表键的打开 60   5.2.2 注册表值的读 62   5.2.3 注册表值的写 65   第6章 时间与线程 67   6.1 时间与定时器 68   6.1.1 获得当前滴答数 68   6.1.2 获得当前系统时间 69   6.1.3 使用定时器 70   6.2 线程与事件 73   6.2.1 使用系统线程 73   6.2.2 在线程中睡眠 75   6.2.3 使用同步事件 76   第7章 驱动、设备与请求 79   7.1 驱动与设备 80   7.1.1 驱动入口与驱动对象 80   7.1.2 分发函数和卸载函数 80   7.1.3 设备与符号链接 82   7.1.4 设备的安全创建 83   7.1.5 设备与符号链接的用户相关性 85   7.2 请求处理 86   7.2.1 IRP与IO_STACK_LOCATION 86   7.2.2 打开与关闭请求的处理 88   7.2.3 应用层信息传入 89   7.2.4 驱动层信息传出 91   探索篇 研究内核   本书的第三部分,开始探索Windows内核程序,并尝试阅读反汇编代码作为指引。本部分包括第8~10章。如果读者对Windows内核编程已经有一定的了解,这一部分会比较有趣;如果读者从未接触过Windows内核编程,读者应该先学习第二部分。能自己编写内核程序并不意味着可以读懂内核,虽然反过来是一定成立的。读懂别人编写的没有代码的程序,比自己编写更困难一些,但的确是值得的。   第8章 进入Windows内核 96   8.1 开始Windows内核编程 97   8.1.1 内核编程的环境准备 97   8.1.2 用C语言写一个内核程序 99   8.2 学习用WinDbg进行调试 102   8.2.1 软件的准备 102   8.2.2 设置Windows XP调试执行 103   8.2.3 设置VMWare虚拟机调试 104   8.2.4 设置被调试机为Vista的情况 105   8.2.5 设置Windows内核符号表 106   8.2.6 调试例子diskperf 106   8.3 认识内核代码函数调用方式 107   8.4 尝试反写C内核代码 111   8.5 如何在代码中寻找需要的信息 113   第9章 用C++编写的内核程序 117   9.1 用C++开发内核程序 118   9.1.1 建立一个C++的内核工程 118   9.1.2 使用C接口标准声明 119   9.1.3 使用类静态成员函数 120   9.1.4 实现new操作符 121   9.2 开始阅读一个反汇编的类 122   9.2.1 new操作符的实现 122   9.2.2 构造函数的实现 124   9.3 了解更多的C++特性 126   第10章 继续探索Windows内核 131   10.1 探索Windows已有内核调用 132   10.2 自己实现XP的新调用 135   10.2.1 对照调试结果和数据结构 135   10.2.2 写出C语言的对应代码 137   10.3 没有符号表的情况 138   10.4 64位操作系统下的情况 141   10.4.1 分析64位操作系统的调用 143   10.4.2 深入了解64位内核调用参数传递 145   深入篇 修改内核   这是本书的第四部分。读者已经尝试过探索Windows内核程序,并尝试阅读反汇编代码。那么接下来,必须掌握修改内核的方法。每一个Windows内核程序,都可以看做Windows内核本身的一个“补丁”。有时只需要独立存在,就能起到它的作用;有时却必须对已有的内核二进制代码进行部分修改。本部分包括第11~13章,主要介绍的是内核Hook。   第11章 机器码与反汇编引擎 150   11.1 了解Intel的机器码 151   11.1.1 可执行指令与数据 151   11.1.2 单条指令的组成 152   11.1.3 MOD-REG-R/M的组成 155   11.1.4 其他的组成部分 157   11.2 反汇编引擎XDE32基本数据结构 159   11.3 反汇编引擎XDE32具体实现 162   第12章 CPU权限级与分页机制 166   12.1 Ring0和Ring3权限级 167   12.2 保护模式下的分页内存保护 169   12.3 分页内存不可执行保护 172   12.3.1 不可执行保护原理 172   12.3.2 不可执行保护的漏洞 173   12.4 权限级别的切换 177   12.4.1 调用门及其漏洞 178   12.4.2 sysenter和sysexit指令 181   第13章 开发Windows内核Hook 186   13.1 XP下Hook系统调用IoCallDriver 187   13.2 Vista下IofCallDriver的跟踪 189   13.3 Vista下inline hook 193   13.3.1 写入跳转指令并拷贝代码 193   13.3.2 实现中继函数 196   实战篇 实际开发   实战部分是本书最深入和复杂的一部分,包括第14~17章。为了让前面练习的成果,在实际应用中产生价值,在这部分我们补充更多的理论知识并尝试用它们去做一点什么。这一部分包括指令分析、硬件基础知识、内核Hook的实际开发练习,以及将完成一个用到内核Hook的有趣的实例,这个实例有助于计算机阻挡各种病毒和木马的侵袭。   此外,本部分还包括特殊的一章,涉及如何巧妙地编写代码,来防止被其他不受欢迎的读者阅读。这与本书的主旨完全相反,正所谓物极必反。   第14章 反病毒、木马实例开发 200   14.1 反病毒、木马的设想 201   14.2 开发内核驱动 204   14.2.1内核中检查可执行文件 204   14.2.2 在内核中生成设备接口 208   14.2.3 在内核中等待监控进程的响应 210   14.3 开发监控进程 216   14.4 本软件进一步展望 218   第15章 Rootkit与HIPS 220   15.1 Rootkit为何很重要 222   15.2 Rootkit如何逃过检测 224   15.3 HIPS如何检测Rootkit 234   第16章 手写指令保护代码 237   16.1 混淆字符串 238   16.2 隐藏内核函数 244   16.3 混淆流程与数据操作 251   16.3.1 混淆函数出口 251   16.3.2 插入有意义的花指令 253   第17章 用VMProtect保护代码 258   17.1 安装VMProtect 259   17.2 使用VMProtect 261   17.3 查看VMProtect效果 267   参考文献 270
中文名: 天书夜读-从汇编语言Windows内核编程 作者: 谭文 邵坚磊资源格式: PDF 版本: 扫描版 出版社: 电子工业出版社书号: 9787121073397发行时间: 2008年10月 地区: 大陆 语言: 简体中文 简介: 内容简介:   从貌似天书的汇编代码中,一探Windows底层的核心实现。.   在开发中出现的问题,能从Windows自身找到答案!...   本书从基本的Windows程序与汇编指令出发,深入浅出地讲解了Windows内核编程、调试、阅读,以及自行探索的方法。读者在使用C/C++ 开发Windows程序的基础上,将熟练掌握汇编和C语言的应用,深入了解Windows底层,并掌握阅读Windows内核的基本方法,以及 Windows内核的基本编程方法。   本书适合使用C/C++在Windows编程的读者,尤其适合希望加深自己技术功底的Windows应用程序员、计算机专业的有志于软件开发的大中院校学生;专业的Windows内核程序员,亦可从本书得到超越一般内核程序开发的启发。 目录: 入手篇 熟悉汇编 第1章 汇编指令与C语言 1.1 上机建立第一个工程 1.1.1 用Visual Studio创建工程 1.1.2 用Visual Studio查看汇编代码 1.2 简要复习常用的汇编指令 1.2.1 堆栈相关指令 1.2.2 数据传送指令 1.2.3 跳转与比较指令 1.3 C函数的参数传递过程 第2章 C语言的流程和处理 2.1 C语言的循环反汇编 2.1.1 for循环 2.1.2 do循环 2.1.3 while循环 2.2 C语言判断与分支的反汇编 2.2.1 if-else判断分支 2.2.2 switch-case判断分支 2.3 C语言的数组与结构 2.4 C语言的共用体和枚举类型 第3章 练习反汇编C语言程序 3.1 算法的反汇编 3.1.1 算法反汇编代码分析 3.1.2 算法反汇编阅读技巧 3.2 发行版的反汇编 3.3 汇编反C语言练习 基础篇 内核编程 第4章 内核字符串与内存 4.1 字符串的处理 4.1.1 使用字符串结构 4.1.2 字符串的初始化 4.1.3 字符串的拷贝 4.1.4 字符串的连接 4.1.5 字符串的打印 4.2 内存与链表 4.2.1 内存的分配与释放 4.2.2 使用LIST_ENTRY 4.2.3 使用长长整型数据 4.2.4 使用自选锁 第5章 文件与注册表操作 5.1 文件操作 5.1.1 使用OBJECT_ATTRIBUTES 5.1.2 打开和关闭文件 5.1.3 文件读/写操作 5.2 注册表操作 5.2.1 注册表键的打开 5.2.2 注册表值的读 5.2.3 注册表值的写 第6章 时间与线程 6.1 时间与定时器 6.1.1 获得当前滴答数 6.1.2 获得当前系统时间 6.1.3 使用定时器 6.2 线程与事件 6.2.1 使用系统线程 6.2.2 在线程中睡眠 6.2.3 使用同步事件 第7章 驱动、设备与请求 7.1 驱动与设备 7.1.1 驱动入口与驱动对象 7.1.2 分发函数和卸载函数 7.1.3 设备与符号链接 7.1.4 设备的安全创建 7.1.5 设备与符号链接的用户相关性 7.2 请求处理 7.2.1 IRP与IO_STACK_LOCATION 7.2.2 打开与关闭请求的处理 7.2.3 应用层信息传入 7.2.4 驱动层信息传出 探索篇 研究内核 第8章 进入Windows内核 8.1 开始Windows内核编程 8.1.1 内核编程的环境准备 8.1.2 用C语言写一个内核程序 8.2 学习用WinDbg进行调试 8.2.1 软件的准备 8.2.2 设置Windows XP调试执行 8.2.3 设置VMWare虚拟机调试 8.2.4 设置被调试机为Vista的情况 8.2.5 设置Windows内核符号表 8.2.6 调试例子diskperf 8.3 认识内核代码函数调用方式 8.4 尝试反写C内核代码 8.5 如何在代码中寻找需要的信息 第9章 用C++编写的内核程序 9.1 用C++开发内核程序 9.1.1 建立一个C++的内核工程 9.1.2 使用C接口标准声明 9.1.3 使用类静态成员函数 9.1.4 实现new操作符 9.2 开始阅读一个反汇编的类 9.2.1 new操作符的实现 9.2.2 构造函数的实现 9.3 了解更多的C++特性 第10章 继续探索Windows内核 10.1 探索Windows已有内核调用 10.2 自己实现XP的新调用 10.2.1 对照调试结果和数据结构 10.2.2 写出C语言的对应代码 10.3 没有符号表的情况 10.4 64位操作系统下的情况 10.4.1 分析64位操作系统的调用 10.4.2 深入了解64位内核调用参数传递 深入篇 修改内核11章 机器码与反汇编引擎 11.1 了解Intel的机器码 11.1.1 可执行指令与数据 11.1.2 单条指令的组成 11.1.3 MOD-REG-R/M的组成 11.1.4 其他的组成部分 11.2 反汇编引擎XDE32基本数据结构 11.3 反汇编引擎XDE32具体实现 第12章 CPU权限级与分页机制 12.1 Ring0和Ring3权限级 12.2 保护模式下的分页内存保护 12.3 分页内存不可执行保护 12.3.1 不可执行保护原理 12.3.2 不可执行保护的漏洞 12.4 权限级别的切换 12.4.1 调用门及其漏洞 12.4.2 sysenter和sysexit指令 第13章 开发Windows内核Hook 13.1 XP下Hook系统调用IoCallDriver 13.2 Vista下IofCallDriver的跟踪 13.3 Vista下inline hook 13.3.1 写入跳转指令并拷贝代码 13.3.2 实现中继函数 实战篇 实际开发 第14章 反病毒、木马实例开发 14.1 反病毒、木马的设想 14.2 开发内核驱动 14.2.1内核中检查可执行文件 14.2.2 在内核中生成设备接口 14.2.3 在内核中等待监控进程的响应 14.3 开发监控进程 14.4 本软件进一步展望 第15章 Rootkit与HIPS 15.1 Rootkit为何很重要 15.2 Rootkit如何逃过检测 15.3 HIPS如何检测Rootkit 第16章 手写指令保护代码 16.1 混淆字符串 16.2 隐藏内核函数 16.3 混淆流程与数据操作 16.3.1 混淆函数出口 16.3.2 插入有意义的花指令 第17章 用VMProtect保护代码 17.1 安装VMProtect 17.2 使用VMProtect 17.3 查看VMProtect效果 参考文献
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值