反调试方法---0xCC检测--检验API断点实现反调试
反调试
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断点实现反调试相关推荐
- linux vc 调试方法,VC实现【API钩取】【调试法】附加调试器
最近在学习逆向核心,在论坛也发了几篇帖子说说自己的经验,帮助自己巩固知识,也方便了大家. 如果帖子中有什么疏漏甚至不对的地方,请大牛们指出,我会积极改正的! 废话不多说,还是我[Miss丿小沫],上教 ...
- 揭秘python的5种最佳调试方法_揭秘 IPython 的 5 种最佳调试方法-阿里云开发者社区...
云栖号:https://yqh.aliyun.com 第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 一个好的集成开发环境(IDE)附带的调试器是 ...
- Python断点调试方法
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-pythondebugger/ Python 代码调试技巧 Debug 对于任何开发人员都是一项非 ...
- python单步调试的方法_python断点调试方法
pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等.pdb 提供了 ...
- stm32 MDK debug调试方法
MDK debug调试方法 使用仿真器进行在线调试 ⭐基础调试方法 调试环境的配置 调试界面介绍 执行操纵栏 断点 挂起 调试窗口介绍 call stack windows watch windows ...
- 2019-11-29-dotnet-代码调试方法
title author date CreateTime categories dotnet 代码调试方法 lindexi 2019-11-29 8:50:0 +0800 2019-6-5 9:4:4 ...
- 2019-10-28-dotnet-代码调试方法
title author date CreateTime categories dotnet 代码调试方法 lindexi 2019-10-28 08:50:11 +0800 2019-6-5 9:4 ...
- Cordova的调试方法
Cordova APP调试方法 对于基于Cordova的跨平台APP开发的调试,相对比较困难.有基于chrome浏览器(在线/离线).weinre.Android Studio,以及基于Visual ...
- 【Xcode使用技巧】Xcode调试方法
这里记录一下自己学习到的一些Xcode调试的方法.这些调试方法可以让我们使用Xcode编写代码进行调试时用起来更顺心应手. Xcode的调试方法包括运行时设置断点,打印到控制台,手写命令打印等. 1. ...
最新文章
- BCP BIA DRP 灾后业务连续性方案简述
- 移动APP开发使用什么样的原型设计工具比较合适?
- 数学——Euler方法求解微分方程详解(python3)
- 程序员的800字作文
- systrace html空白,Android性能优化之Systrace工具介绍(一) _ Systrace生成的trace.html打开空白或者打不开的解决办法...
- Java开发知识体系!我用2个月的时间破茧成蝶
- python progressbar 倒计时_Python使用progressbar模块实现的显示进度条功能
- 局域网屏幕监控软件_如何用局域网桌面监控软件进行局域网电脑桌面监控?
- JavaWeb学习DAY2—Java web的创建
- opensips脚本格式
- 职场知识:什么是软件程序员?它是做什么的?
- Delete出错分析总结(个人总结很到位) 0x0000007ff64426f87e(ucrtbased.dll)处(处于dataa.exe中)引发的异常:
- 解决 dyld: Library not loaded:Reason: image not found
- php 前端 java培训哪个好,php培训、前端培训、java培训哪个好
- 【APS】90张专业PPT学习高级计划与排程(APS)
- 埋石图根点lisp代码_速腾矿图 用户手册.pdf
- VR头显中的一朵奇葩,FaceDisplay使用三屏交互
- 打开Flutter动画的另一种姿势——Flare
- cocos2d-x 中添加显示文字的三种方式 LabelTTF 、LabelBMFont 和 LabelAtlas
- Linux 磁盘分区挂载