-
-
[注意]《加密与解密》第三版书上发现的一些问题
-
发表于: 2011-4-22 11:21 5534
-
这是我学习过程中的一些疑问,接受拍砖。
第410页
“这里用到了一个小伎俩,为了尽量完整地对堆进行扫描,此处用死循环一直向下搜索内存,知道内存地址无效时,SEH会捕获错误,……”
这里不是SEH吧,上面的代码中用到了try {} catch (...) {} 明显是C++异常处理。SEH和C++异常处理还是不同的,这样的细节还是要注意一下。
第410页
IsDebugHeap函数我实际测试时发现真是个死循环,程序没有退出来,当然调试的话,可以看到异常的提示(调试状态下异常发给调试器了吧),这里我很是不解,为什么实际运行程序还会出现死循环呢?异常没有发生???
第415页
我认为根据CheckRemoteDebuggerPresent反汇编结果写出来的那个C语言版本有错误啊。首先,pbDebuggerPresent = hProcess这里不好,要强制转换。
最重要的是,pbDebuggerPresent = hProcess这里错了,应该是*pbDebuggerPresent = (BOOL)hProcess。可以仔细看看那段汇编代码。
实际上如果hProcess用GetCurrentProcess()来得到的话,hProcess是-1.当然因为这里是个BOOL值,所以直接放入-1和1都没区别了。但是那语句还是错了的。前面esi得到的是pBool,而后面用的是DS:[ESI]来操作的。如果按书上来进行测试的话,结果就虚无缥缈了。
如果我讲的不对,欢迎大家指教。
P.S. 本版块似乎很少有人来往,不知道这个帖子有木有人看呀
第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. 本版块似乎很少有人来往,不知道这个帖子有木有人看呀
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: