反调试

0xCC检测

软件断点的原理:调试器在对应设置断点的位置上修改该地址的字节为0xCC。若是关键位置检测到该指令,可以判断进程处于调试状态。

0xCC既可以是INT 3指令,也可以是其他指令的操作数。

API断点

API断点一般下在API的首地址处或函数返回地址处。检查这些易被下端的地址首字节是否为0xCC就可以判断程序是否正在被调试

检验代码(以MessageBoxA函数为例):

#include <Windows.h>
#include<iostream>
using namespace std;
int main() {FARPROC addr = GetProcAddress(LoadLibrary(L"user32.dll"), "MessageBoxA");byte byteaddr = *(byte*)addr;MessageBoxA(NULL, "context", "title", MB_OK);if (byteaddr == 0xCC){printf("检测到调试");}else {printf("无调试");}return 0;
}

检验方式(x32dbg中):加载文件–>查看符号–>点击原程序所在的模块–>在调用函数窗口搜索MessageBoxA函数–>下断点。之后进行调试。会输出“检测到调试”

出现的问题:验证MessageBoxW函数时,所用代码:

int main() {PBYTE byteaddr = (PBYTE)MessageBoxW;MessageBoxW(NULL, L"context", 0, MB_OK);if (*byteaddr == 0xCC){printf("检测到调试");}else {printf("无调试");}return 0;
}

在OD里调试时,关键汇编语句:

003C1054 | 803E CC                  | cmp byte ptr ds:[esi],CC
003C1057 | B9 18213C00              | mov ecx,project1.3C2118
003C105C | B8 28213C00              | mov eax,project1.3C2128
003C1061 | 0F44C1                   | cmove eax,ecx
003C1064 | 50                       | push eax
003C1065 | E8 A6FFFFFF              | call <project1._printf>

其中,cmove语句的用法:

;如果eax和ebx相等,则会将edx复制到ecx
cmp eax,abx
cmove ecx,edx;相当于:
cmp eax,ebx
jne skipmov ecx,edx
skip:

出问题的点:给MessageBoxW函数下断之后进行调试,调试到下面这个语句(即与0xCC比较)的时候,byte ptr ds:[esi]=8B,并不等于0xCC。按理说 值不等于0xCC,应该返回“未检查到调试”,但是继续调试,打印出来的内容还是检测到调试。

也就是过程上出了问题,但是结果还是正确的。==稍微有点难以接受=。(希望找到解决办法的同学可以指点一二

003C1054 | 803E CC                  | cmp byte ptr ds:[esi],CC  ;[esi] = 8B

把断点去掉,调试,输出的内容是“无调试”。

反反调试:

在需要下断点的API函数的中间部位下断点。

反调试方法---0xCC检测--检验API断点实现反调试相关推荐

  1. linux vc 调试方法,VC实现【API钩取】【调试法】附加调试器

    最近在学习逆向核心,在论坛也发了几篇帖子说说自己的经验,帮助自己巩固知识,也方便了大家. 如果帖子中有什么疏漏甚至不对的地方,请大牛们指出,我会积极改正的! 废话不多说,还是我[Miss丿小沫],上教 ...

  2. 揭秘python的5种最佳调试方法_揭秘 IPython 的 5 种最佳调试方法-阿里云开发者社区...

    云栖号:https://yqh.aliyun.com 第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 一个好的集成开发环境(IDE)附带的调试器是 ...

  3. Python断点调试方法

    转自:http://www.ibm.com/developerworks/cn/linux/l-cn-pythondebugger/ Python 代码调试技巧 Debug 对于任何开发人员都是一项非 ...

  4. python单步调试的方法_python断点调试方法

    pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等.pdb 提供了 ...

  5. stm32 MDK debug调试方法

    MDK debug调试方法 使用仿真器进行在线调试 ⭐基础调试方法 调试环境的配置 调试界面介绍 执行操纵栏 断点 挂起 调试窗口介绍 call stack windows watch windows ...

  6. 2019-11-29-dotnet-代码调试方法

    title author date CreateTime categories dotnet 代码调试方法 lindexi 2019-11-29 8:50:0 +0800 2019-6-5 9:4:4 ...

  7. 2019-10-28-dotnet-代码调试方法

    title author date CreateTime categories dotnet 代码调试方法 lindexi 2019-10-28 08:50:11 +0800 2019-6-5 9:4 ...

  8. Cordova的调试方法

    Cordova APP调试方法 对于基于Cordova的跨平台APP开发的调试,相对比较困难.有基于chrome浏览器(在线/离线).weinre.Android Studio,以及基于Visual ...

  9. 【Xcode使用技巧】Xcode调试方法

    这里记录一下自己学习到的一些Xcode调试的方法.这些调试方法可以让我们使用Xcode编写代码进行调试时用起来更顺心应手. Xcode的调试方法包括运行时设置断点,打印到控制台,手写命令打印等. 1. ...

最新文章

  1. BCP BIA DRP 灾后业务连续性方案简述
  2. 移动APP开发使用什么样的原型设计工具比较合适?
  3. 数学——Euler方法求解微分方程详解(python3)
  4. 程序员的800字作文
  5. systrace html空白,Android性能优化之Systrace工具介绍(一) _ Systrace生成的trace.html打开空白或者打不开的解决办法...
  6. Java开发知识体系!我用2个月的时间破茧成蝶
  7. python progressbar 倒计时_Python使用progressbar模块实现的显示进度条功能
  8. 局域网屏幕监控软件_如何用局域网桌面监控软件进行局域网电脑桌面监控?
  9. JavaWeb学习DAY2—Java web的创建
  10. opensips脚本格式
  11. 职场知识:什么是软件程序员?它是做什么的?
  12. Delete出错分析总结(个人总结很到位) 0x0000007ff64426f87e(ucrtbased.dll)处(处于dataa.exe中)引发的异常:
  13. 解决 dyld: Library not loaded:Reason: image not found
  14. php 前端 java培训哪个好,php培训、前端培训、java培训哪个好
  15. 【APS】90张专业PPT学习高级计划与排程(APS)
  16. 埋石图根点lisp代码_速腾矿图 用户手册.pdf
  17. VR头显中的一朵奇葩,FaceDisplay使用三屏交互
  18. 打开Flutter动画的另一种姿势——Flare
  19. cocos2d-x 中添加显示文字的三种方式 LabelTTF 、LabelBMFont 和 LabelAtlas
  20. Linux 磁盘分区挂载

热门文章

  1. Python判断字符串是否为数字
  2. win2003 sp2跟卡巴冲突蓝屏解决方法
  3. win10家庭版升级专业版出现0x80070422错误
  4. 信息茧房时代,产品经理如何升级打怪
  5. ffmpeg对包含封面的音频转m3u8格式视频时,m3u8列表只有一个,无法分割成多个ts文件
  6. 2019常州市程序设计小能手题目-跳马
  7. ios端无法播放mp3音频 ffmpeg mp3 转aac
  8. 生成式模型和判别式模型
  9. 在易车等网上买车需要注意什么
  10. PLSQL中文显示乱码,真正有效的解决方案(无需修改注册表 )