《天书夜读-从汇编语言到Windows内核编程》 思考题参考答案

学习C/C++快有两年了,现在想系统学习下逆向工程(反汇编),找来找去最终选定了 《天书夜读-从汇编语言到Windows内核编程》 这本书,看了两章感觉很不错,决定深入学习下去。可是课后的思考题没有答案,下面是我自己练习过程中自写的代码(答案),提供给网友们参考,有不对之处还请指正,谢谢!

第二章C语言的流程和处理 (2.2思考题)

// pritices1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"



int myfunction(int a,int b)
{
	int d = a+b;
	int i,c;
	i=1;
	c=0;
	while(c< 100)
	{
		c = c+i;
	}
	switch(c)
	{
	case 0:
		d=1;
		d =c;
		break;
	case 1:
		d=c;
		break;
	default:
		d=0;
	}
	return d;
}
int _tmain(int argc, _TCHAR* argv[])
{

	int retval=myfunction(3,4);
	return 0;
}


 第三章  3.3(汇编反C语言练习)

00401000 push ecx                                  F
00401001 mov ecx,dword ptr [esp+10h]               D            ecx=b
00401005 mov edx,dword ptr [esp+8]                 D            edx=a
00401009 push ebx                                  F
0040100A mov ebx,dword ptr [esp+18h]               D            ebx=d
0040100E push esi                                  F
0040100F mov esi,dword ptr [esp+14h]               D            esi=c
00401013 push ebp                                  F            
00401014 xor eax,eax                               C            eax=0
00401016 push edi                                  F
00401017 jmp myfunction+20h (004020h)              C        
00401019 lea esp,[esp]                             C
00401020 mov edi,dword ptr [esi+8]                 D           edi=c[2]
00401023 imul edi,dowrd ptr [edx+eax*8+4]          D           edi*=a+eax*8+4  <=> edi=c[2]*a[eax*2+1]
00401028 mov ebp,dowrd ptr [esi]                   D           ebp=c[0]
0040102A imul ebp,dword ptr [edx+eax*8]            D           ebp*=a+eax*8    <=> ebp=c[0]*a[eax*2]
0040102E add edi,ebp                               D           edi=edi+ebp     <=> edi=c[2]*a[eax*2+1]+c[0]*a[eax*2]
00401030 mov dword ptr [ecx],edi                   D           b[0]=edi        <=> b[0]=c[2]*a[eax*2+1]+c[0]*a[eax*2]
00401032 mov edi,dword ptr [esi+0ch]               D           edi=c[3]
00401035 imul edi,dword,ptr [edx+eax*8+4]          D           edi*=a[eax*2+1] <=> edi=c[3]*a[eax*2+1]
0040103A mov ebp,dword ptr [esi+4]                 D           ebp=c[1]
0040103D imul ebp,dword ptr [edx+eax*8]            D           ebp*=a[eax*2]   <=> ebp=c[1]*a[eax*2]
00401041 add edi,ebp                               D           edi=edi+ebp     <=> edi=c[3]*a[eax*2+1]+c[1]*a[eax*2]
00401043 mov ebp,dword ptr [ecx]                   D           ebp=b[0]
00401045 add ebp,edi                               D           ebp=ebp+edi     <=> ebp=b[0]+c[3]*a[eax*2+1]+c[1]*a[eax*2]    
00401047 add ebx,ebp                               D           ebx=ebx+ebp     <=> ebx=d+b[0]+c[3]*a[eax*2+1]+c[1]*a[eax*2]
00401049 mov dword ptr [ecx+4],edi                 D           b[1]=edi        <=>b[1]=c[3]*a[eax*2+1]+c[1]*a[eax*2]
0040104C inc eax                                   C           eax++
0040104D add ecx,8                                 D           ecx=ecx+8
00401050 cmp eax,2                                 C 
00401053 jl myfunction+20h(401020h)                C
for(i=0;i<2;i++)
{
  b[i]=c[2]*a[i*2+1]+c[0]*a[i*2]
  b[i+2]=c[3]*a[i*2+1]+c[1]*a[i*2]
}
switch(d[0]+b[0]+i)
{
   case 100:
     printf("cnt is 110");
   case 110:
     printf("cnt is 110");
  default:
     printf("nothing");
}
return d[0]+b[0]+i;
00401055 call rand(401138h)                        C           
0040105A add ebx,eax                               D           d=d+eax
0040105C cmp ebx,64h                               C
0040105F pop edi                                   F
00401060 pop ebp                                   F
00401061 je myfunction+7Bh(40107Bh)                C
00401063 cmp ebx,6Eh                               C
00401066 je myfunction+88h(401088h)                C
00401068 push offset string "nothing" (40711h)     F
0040106D call printf (402207h)                     C
00401072 add esp,4                                 C
00401075 pop esi
00401076 mov eax,ebx
00401078 pop ebx
00401079 pop ecx
0040107A ret
0040107B push offset string "cnt is 110" (4070FCh)
00401080 call printf (401107h)
00401085 add esp,4
00401088 push offset string "cnt is 110" (4070FCh)
0040108D call printf (401107h)
00401092 add esp,4
00401095 pop esi
00401096 mov eax,ebx
00401098 pop ecx
0040109A ret

我反汇编出来的代码,和书中并非完全一样

// tl17.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdlib.h>

int myfunction(int a[],int b[],int c[],int d)
{
	int i,r,h;
	i=0;
	for(i=0;i<2;i++)
	{
	
		b[i]=c[2]*a[i*2+1]+c[0]*a[i*2];
		b[i+1]=c[3]*a[i*2+1]+c[1]*a[i*2];
	}
	r=rand();
	h=r+d+b[i]+c[3]*a[i*2+1]+c[1]*a[i*2];

	switch(h)
	{
	case 100:
		printf("cnt is 110");
	case 110:
		printf("cnt is 110");
	default:
		printf("nothing");
	}
  return h;
}
int _tmain(int argc, _TCHAR* argv[])
{
	int a[3],b[3],c[3],d;
	d=5;
	myfunction(a,b,c,d);
	return 0;
}



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

总共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
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值