窗口 – 为什么这个代码使我能够检测到一个调试器?
发布时间:2020-12-13 20:21:53 所属栏目:Windows 来源:网络整理
导读:为什么以下汇编代码是反调试工具? l1:call l3l2:;some codel3:mov al,0c3hmov edi,offset l3or ecx,-1rep stosb 我知道C3h是RETN,我知道stob根据edi的偏移量将值写入al中作为操作码,并且由于rep而对ecx时间进行了修改. 我也知道,如果他们以英特尔架构预先获
为什么以下汇编代码是反调试工具?
l1: call l3 l2: ;some code l3: mov al,0c3h mov edi,offset l3 or ecx,-1 rep stosb 我知道C3h是RETN,我知道stob根据edi的偏移量将值写入al中作为操作码,并且由于rep而对ecx时间进行了修改. 我也知道,如果他们以英特尔架构预先获得原始格式,那么这个事实就是这样的. 如果我们以调试模式运行程序,则预取是不相关的,并且l2标签将运行(因为它是单步的),否则如果没有调试器,它将在l1和l3之间乒乓,我对吗?
当程序被调试(即单步)时,每个步骤刷新预取队列(发生中断时).然而,当正常执行,不会发生代表stosb.旧的处理器没有刷新它,即使有内存写入缓存区域,以支持自修改代码,除了rep movs和rep stosb. (IIRC最终在i7处理器中固定.)
这就是为什么如果有一个调试器(单步)代码将正确执行,并且代表stosb被替换为ret l2将会被执行.当没有调试器代表stosb将继续,因为ecx是最大的可能,它将最终写在某处,它不应该写,并将发生异常. 这种反调试技术在this paper中有描述. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 我可以在Windows命令行的后台运行GUI程序吗?
- Windows – 如何从同一网络中的另一台计算机访问本地主机?
- Windows Mobile 6.5手势和C#2.0应用程序
- windows-8 – Windows 8是否编译JavaScript?
- windows – 将2008 R2服务器转换为hyper-v主机时,是否可以暂
- windows – 如何在文件夹中的所有文件中执行文本替换?
- windows-8 – 选择Windows运行时组件与可移植代码库
- Win2008 Server配置PHP环境 Win2008 Server配置
- Windows服务命令RPC错误(sc.exe或psservice)
- windows-phone-7 – 如何处理HTTP 412(前提条件失败) – 设