众所周知 crc代码检验无论如何都会读取当前程序固定的代码段,以此我们只需通过内存断点即可回溯关键代码位置。而内存断点本质就是修改内存页属性让其不可读
/
不可写
不可执行,以此让其触发异常,走调试事件。
而本程序当我设置内存断点后未断下并且正常崩溃,我认为可能程序在读取内存前通过VirtualQueryEx 和 VirtualQuery获取内存页属性(该程序未加载驱动,未检测相关api代码)验证后却无效,而后我又猜测有可能通过VirtualProtect重新设置了内存页属性后读取,依然无效。那是否通过创建子进程等方式读取被保护的进程内存呢?通过相关ark工具显示未存在子进程。后又更换调试器无果,至此GG....
万般无奈之下通过看雪搜索到了 [相关的解决办法](https:
bbs.pediy.com
thread
-
262651.htm
) 通过ReadProcesMemory这种方式不会在访问断点断下
那为什么不会被断下呢?一开始我以为是MmCopyVirtualMemory这个函数在作怪但通过ida跟踪发现其本质上只调用了memcpy来否则内存
那这样就一定会触发异常进入异常分发,而后进入调试事件分发,由此问题一定是调试器的,所以我拿出了我的控制台调试器
哈哈 果然是x64dbg/od 等调试器忽略了这类异常,至于为什么这些调试器要忽略我就不清楚了...难道是因为该异常发生于0环导致调试器无法处理吗?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!