首页
社区
课程
招聘
[注意]《加密与解密》第三版书上发现的一些问题
2011-4-22 11:21 5455

[注意]《加密与解密》第三版书上发现的一些问题

2011-4-22 11:21
5455
这是我学习过程中的一些疑问,接受拍砖。
第410页
“这里用到了一个小伎俩,为了尽量完整地对堆进行扫描,此处用死循环一直向下搜索内存,知道内存地址无效时,SEH会捕获错误,……”

这里不是SEH吧,上面的代码中用到了try {} catch (...) {} 明显是C++异常处理。SEH和C++异常处理还是不同的,这样的细节还是要注意一下。

第410页
IsDebugHeap函数我实际测试时发现真是个死循环,程序没有退出来,当然调试的话,可以看到异常的提示(调试状态下异常发给调试器了吧),这里我很是不解,为什么实际运行程序还会出现死循环呢?异常没有发生???

第415页
我认为根据CheckRemoteDebuggerPresent反汇编结果写出来的那个C语言版本有错误啊。首先,pbDebuggerPresent = hProcess这里不好,要强制转换。
最重要的是,pbDebuggerPresent = hProcess这里错了,应该是*pbDebuggerPresent = (BOOL)hProcess。可以仔细看看那段汇编代码。

7C85AA2E    8B75 0C         MOV ESI,DWORD PTR SS:[EBP+C]	; esi = pBool
7C85AA31    85F6            TEST ESI,ESI					; esi == 0?


7C85AA54    33C0            XOR EAX,EAX						; eax = 0
7C85AA56    3945 08         CMP DWORD PTR SS:[EBP+8],EAX	; hProcess == 0 ?
7C85AA59    0F95C0          SETNE AL						; hProcess != 0 --> al = 1 (else al = 0)
7C85AA5C    8906            MOV DWORD PTR DS:[ESI],EAX		; *pBool = eax
7C85AA5E    33C0            XOR EAX,EAX						; eax = 0
7C85AA60    40              INC EAX							; eax = 1


实际上如果hProcess用GetCurrentProcess()来得到的话,hProcess是-1.当然因为这里是个BOOL值,所以直接放入-1和1都没区别了。但是那语句还是错了的。前面esi得到的是pBool,而后面用的是DS:[ESI]来操作的。如果按书上来进行测试的话,结果就虚无缥缈了。

如果我讲的不对,欢迎大家指教。
P.S. 本版块似乎很少有人来往,不知道这个帖子有木有人看呀

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回