首页
社区
课程
招聘
《C++反汇编与逆向分析技术揭秘》勘误
发表于: 2011-10-19 01:26 111203

《C++反汇编与逆向分析技术揭秘》勘误

2011-10-19 01:26
111203
第一次勘误(2011-10-19 01:26:46)
第二次勘误(2011-10-19 18:56:24)
第三次勘误(2011-10-20 23:34:53)
第四次勘误(2011-10-24 21:13:11)
第五次勘误(2011-11-02 19:27:08)
第六次勘误(2011-11-25 12:41:51)
第七次勘误(2011-11-28 15:59:22)
第八次勘误(2012-02-03 16:40:38)
第九次勘误(2012-03-14 20:19:53)
第十次勘误(2012-03-19 00:24:28)
第十一次勘误(2012-03-24 23:08:47)
第十二次勘误(2012-04-20 00:36:02)
第十三次勘误(2014-08-11 05:59:19)

第一章
P9 代码清单1-1上一行 "通过制作SGI文件...",修改为"通过制作SIG文件..."(谢谢网友爱鸟的指正)

第二章
P18 2.1.1小节中的第二段第五行
书中为:"高数据位对高地址,低数据位对低地址"  
修改为"低数据位排放在内存的低端,高数据位排放在内存的高端"  
P23 第4行 "得到的值为:1.2516582,四舍五入之后为1.3。"
修改为"得到的值为:1.2999999523162841796875,四舍五入之后为1.3。"(感谢网友hexiaomin的指正)
P26 代码清单2-5 倒数第二、三条注释分别修改为  "使用eax保存长整型数据的低4字节,用于返回。" 、"使用edx保存长整型数据的高4字节,用于返回"
P30 2.5.1小节中“向后数4个字节到0x0014FF6C处。将0x0012FF68~0x0014FF6C中的数据按整型存储方式解释。”
修改为“向后数4个字节到0x0012FF6C处。将0x0012FF68~0x0012FF6C中的数据按整型存储方式解释。”(感谢网友fxliutm的指正)
P34 代码清单2-8 “nVarTpye”修改为“nVarType”
P36 2.6.1  代码清单2-10
“#define NUMBER_ONE1”
修改为“#define NUMBER_ONE 1” (感谢网友fishyuule的指正)
P37 代码清单2-12中关于004010B8处的注释:
"; 将地址ebp-4赋值给4字节数据5"
修改为:"; 将地址ebp-4赋值为4字节数据5"(感谢网友二玉的指正)

第三章
P44页,第十行,Enty-Point,应该改成Entry-Point(感谢网友lord的指正)

第四章
P49常量传播 - P50常量折叠 共5处main中的printf函数 "printf("nVarOne = %d \r\n", nVar);"修改为"printf("nVar = %d \r\n", nVar);"
P68 11行"解方程得:o=2^n/c=2^3/38E38E39h=8.999999......"
修改为"解方程得:o=2^n/c=2^33/38E38E39h=8.999999......"(感谢网友孟贤的指正)
P80 "MagicNumber的计算过程在c2文件偏移OX5FACE处"
修改为"MagicNumber的计算过程在c2文件偏移0x5FACE处"(字母O修改为数字0,感谢网友lord的指正)
P104 倒数第13行,“; 对dl做有符号法”,改为“; 对dl做有符号乘法”(感谢网友fxliutm的指正)
P106
; 将edx于0x80000001做位与操作,此操作只会保留下edx的最高位与最低位
; 此操作会影响标记位SF,当edx为负数情况下,则会修改SF标记位
and     edx, 80000001h
; 判断SF标记位为0则跳转到标记loc_4010BF处,edx为负数跳转(这里应该是edx为正数跳转)
jns     short loc_4010BF
; 以下为edx为负数的处理代码
; edx减等于1,由于之前操作会是edx只保留最低于最高位。
; 这里对edx减1操作,结果必然为0x80000000(或者0x7fffffff,当edx为偶数时)
dec     edx
; 对edx与0xFFFFFFFE做位或运算,除最低位外全部置1
; 此时的edx值只有1种可能:0xFFFFFFFE(应该是存在两种可能,另一种是edx为偶数时,其值为0xfffffff)
or      edx, 0FFFFFFFEh
; 对edx加1后,变为0xFFFFFFFF为-1(或者为0,当edx为偶数时)
inc     edx
; 地址标号								
; 这里为IDA标注引用此标号处
loc_4010BF:                             ; CODE XREF: _main+B8 j

以上代码注释描叙有误,详见括弧内的更正。其实这里是个有符号数求模,原注释过于冗余,应作出如下更正:
; 优化后的求模运算,等价于edx = edx%2,详见前文中对取模运算的讲解
and     edx, 80000001h
jns     short loc_4010BF
dec     edx
or      edx, 0FFFFFFFEh
inc     edx
loc_4010BF:


P80,第八行,最后的取整符号有误:

(感谢网友kaoyange的指正)

第五章
P117 总结:  标号IF_ELSE_END修改为 ELSE_IF_END
P123页中,代码清单5-12里
; 将加1后的变量放回
0040111C   mov    dword ptr [ebp-8],edx
修改为:
; 将减1后的变量放回
0040111C   mov    dword ptr [ebp-8],edx(感谢网友踏雪xp的指正)

P130页,代码清单5-16里:
; 地址0x0040E02F为索引表首地址,查看图5-5
修改为:
; 地址0x0040E02F为索引表首地址,查看图5-7

代码清单5-16里:
; 地址0x0040E013为case语句块地址表首地址。查看图5-5
修改为:
; 地址0x0040E013为case语句块地址表首地址。查看图5-8
(以上感谢网友zpsemo的指正)

P146 代码清单5-26 第一行注释中 "for循环..."修改为"do循环..."

第七章
P169 代码清单7-3 第一行注释中 "全局变量的..."修改为"局部静态变量的..."

第八章
P181 代码清单8-3 反汇编代码提示中的"Hello World"应修改为"Hello Worl"(感谢网友zpsemo的指正)

P183 C++源码对照的GetLen中repne scasb的注释部分:
; 执行该指令后,而ecx中保存了字符串长度的补码
修改为:
; 执行该指令后,而包含了字符串长度相关信息,详细讲解见下文。(感谢网友迪文的指正)

P184 第7行:
neg(ecx(终值))+1=Len+2
修改为:
not(ecx(终值))+1=Len+2 (感谢网友迪文的指正)

P193 图8-8 上方那行"使用下标4也将会..."修改为"使用下标5也将会..."
     图8-8的标识"VC 8.0中使用数组下标为负数的..."修改为  "VC 6.0中使用数组下标越界访问"

第九章
P209 如以下代码所示中的 结构体定义关键字 Struct修改为 struct
P215 第一段中"所有成员函数都有一个隐藏参数..."修改为  "所有成员函数(非静态成员函数)都有一个隐藏参数"
P227 "还可以在函数调用过程中避免复制..."修改为  "还可以在函数调用过程中避免复制对象的过程,提升程序运行的效率。"

第十章
P248 代码清单10-9  0040F6D7处的指令"push ffset @ILT+60..."修改为"push offset @ILT+60..."
P251 代码清单10-11 0040170C处的注释"获取堆空间的首地址"修改为"获取第一个对象的首地址"

第十一章
P260 第二段倒数第三句 "this的地址赋值为虚表首地址时..."修改为"this的地址初始化为虚表首地址时..."

P262 代码中
===========================================================
; 调用函数的实现代码内
pop     ecx                      ; this指针的还原,非Debug编译选项组可能无此代码
mov      eax, dword ptr [ecx]     ; 取出首地址前4字节数据
; 向对象首地址处写入4字节数据,查看并确认此4字节数据是否为函数地址表的首地址
mov    dword ptr [reg], XXXXXXXXh
===========================================================
修改为:
===========================================================
; 调用函数的实现代码内
mov      reg, this     ; 某寄存器得到对象首地址
; 向对象首地址处写入4字节数据,查看并确认此4字节数据是否为函数地址表的首地址
mov    dword ptr [reg], XXXXXXXXh
===========================================================

P262 第四段第二行"而且在构造函数中虚表指针没有指向虚表的首地址"  中修改为“而且在构造函数执行前虚表指针没有指向虚表的首地址”

第十二章
P269 第四段第三行 "销售员拿出一款“江斯丹顿牌某系列某型号的..." ,修改为“劳斯丹顿牌某系列某型号的..."
P276代码清单12-5,“virtual void ShowSpeak(){ // 纯虚函数,后面会讲到”,修改为“virtual void ShowSpeak(){ // 这里使用纯虚函数更好,相关知识点后面会讲到”(谢谢网友superzxt的指正)
P295 代码清单12-9下一段中第三行"后调整了父类CSofa的大小...",大小,修改为"后调整了父类CSofa的长度..."
P297 第三段“转换父类指针时,需要跳转到对象的首地址。”,修改为“转换父类指针时,需要调整到对象的首地址。”(感谢网友qqbwz的指正)
P298 标题"12.3 虚基类" 虚基类修改为抽象类
     本小节中所有的"虚基类"  需修改为  "抽象类" 、 "CVirtualBase"  需修改为  "CAbstractBase"

第十三章
P340 倒数第一段第一行"首先观察00401180处的注释(上面代码中以下画线)..." 上面代码中以下画线  需修改为  “上面代码中下划线所示”

因此带来的不便,请大家多多包涵,在此谢过。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (58)
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
2
钱老师真负责,什么时候来北京签字售书阿
2011-10-19 01:36
0
雪    币: 21
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
P36 2.6.1  常量的定义  代码部分宏定义
#define NUMBER_ONE1
应该为#define NUMBER_ONE 1
2011-10-19 09:46
0
雪    币: 2503
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
厉害 多多学习学习!!
2011-10-19 09:49
0
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
第5章 流程控制语句的识别   第123页中,代码清单5-12里
00401119   sub edx, 1
;将加1后的变量放回          此处应该改为减1
2011-10-19 10:24
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
其实我每次看到看雪论坛书刊板块的时候都能看到书中勘误的时候我就很纳闷,为什么当时印刷之前就没好好打印,每次出书以后才能发现错误呢。 纳闷,真的很纳闷。。。
2011-10-19 11:47
0
雪    币: 1829
活跃值: (1372)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
7
有些地方是修改描述,觉得修改后可能更容易使读者理解。
有些地方是各类错误,属于作者自身原因导致。虽然作者也梦想本书完美无错,可惜能力有限,只得以勘误的方式尽力弥补了。
2011-10-19 13:32
0
雪    币: 422
活跃值: (115)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
这个嘛,好像还没有哪本书敢说自己1点错误都没有吧。
做为作者肯定也希望能够写出完美无误,尽善尽美的作品。不过这是理想状态啊。
好比自己写程序一样,没有人敢保证完美,一点BUG也没有,就连微软、苹果也不行。

勘误,如同修复程序的BUG一样。
2011-10-19 15:47
0
雪    币: 1829
活跃值: (1372)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=踏雪xp;1011075]第5章 流程控制语句的识别   第123页中,代码清单5-12里
00401119   sub edx, 1
;将加1后的变量放回          此处应该改为减1吧[/QUOTE]

感谢网友"踏雪xp"的指正,已收录。
2011-10-19 18:58
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
10
顶钱老师
2011-10-19 19:05
0
雪    币: 5279
活跃值: (3659)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
11
嗯,错误不少,我等第二次印刷,应该能等上吧
2011-10-20 16:07
0
雪    币: 106
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我是觉得有些地方怪怪的....
2011-10-20 16:11
0
雪    币: 1829
活跃值: (1372)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
13
已经记录,感谢网友fishyuule的指正。
2011-10-20 23:44
0
雪    币: 414
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
p68 11行;解方程得:o=2^n/c=2^3/38E38E39h=8.999999......
应该是33
2011-10-25 19:17
0
雪    币: 108
活跃值: (56)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
15
   一本长达400-500百页的书,几个错误是难于避免的, 难点是作者写书要站在尽可能所有读者的角度考虑并描述问题, 看的出作者对广大读者负责的,要不然在这里干嘛.最后,这书写的很有技术含量,看的也不累,比较容易懂, 有兴趣一起学的一起留言
2011-10-25 23:02
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
前几天刚买了本,现在正学习着呢,不错哦
2011-10-27 13:41
0
雪    币: 59
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
钱老师讲课非常棒, 感觉书上的知识在课堂都有讲解、演示、、顶钱老师
2011-10-30 00:15
0
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
来,我也发现一处问题:
95页,编译器使用的优化技巧->减少变量一段,原文如下:
x = i * 2;
y = j * 2;
if (x > y)  //其后再也没有引用x、y
{
......
}
这时对x、y的比较等价于对i、j的比较,可以去掉x、y,直接生成if(i > j)。

问题比较隐蔽,那就是发生乘法溢出时,i > j与x > y二者并不完全等价。例如 i = 0x80000000, j = 1时,x = i * 2,y = j * 2,计算后x == 0(最高位溢出),而y == 2,此时i > j与x > y表达式结果不相同。

p.s.:钱老师很久没来北京了啊!!
2011-11-2 20:57
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢,非常有用。
2011-11-7 17:07
0
雪    币: 60
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
第86页的条件跳转指令表中JAE的原本说明是“大于则跳转”,应该是“大于等于则跳转”吧,还有JGE原有的说明是“不大于等于则跳转”,应该是“大于等于则跳转”,,,不知道有没有说错,,,
2011-11-11 22:12
0
雪    币: 60
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
,,,第128页那里的“(MAX-MIN)*1字节 = 索引表大小”,应该是“(MAX-MIN+1)*1字节 = 索引表大小”吧,,,
还有130页代码清单5-16第17行(应该没数错吧),“;地址0x0040E02F为索引表的首地址,查看图5-5”应该是“查看图5-7”才对,再往下数5行的那个“查看图5-5”应该是“查看图5-8”,看的时候觉得怪怪的,,,
最近一直在看这本书,觉得挺不错的,讲得很透彻,,,支持钱老大。。。
2011-11-12 17:20
0
雪    币: 391
活跃值: (135)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
22
第266页

第二段“那么,atexit函数......”中有一句话,“注意,在IDA的环境下,C的调用约定是在函数名前加上下划线"_"。”

建议将这句话修改为,“注意,在IDA的环境下(中),显示的是经过编译器改编的函数名称(使用C调用方式的函数的名称改编,是在其函数名的前面加上下划线"_")。”
2011-11-15 16:45
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
23
帮qqbwz转发的:
http://bbs.pediy.com/showthread.php?t=145649

书中297页(第12章从内存角度看继承与多重继承)介绍单继承类与多重继承类的不同点时,有这句话“转换父类指针时,需要跳转到对象的首地址”。根据我的理解“跳转”应该改为“调整”才能表达正确的意思。如果我的理解有误,请指正。
2012-1-19 08:47
0
雪    币: 1829
活跃值: (1372)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
24
已修改。
感谢网友qqbwz的指正,以及版主loongzyd的关心。
2012-2-3 16:42
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
36页 图2-12下面的文字说在图2-12中常量字符串的首地址为0x00423FA8  可是图上画的是0x0012FF7C    感觉下面的字是对的这个图配错了
2012-2-7 19:31
0
游客
登录 | 注册 方可回帖
返回
//