8.9 RDTSC时钟检测反调试
RDTSC时钟检测同样可实现反调试检测,使用时钟检测方法是利用rdtsc汇编指令,它返回至系统重新启动以来的时钟数,并且将其作为一个64位的值存入EDX:EAX寄存器中,通过运行两次rdstc指令,然后计算出他们之间的差值,即可判定对方是否在调试我们的程序。
可以利用时钟检测技术来检测程序是否被调试器附加,其实现基本思路如下:
- 获取当前时间戳 T1,即通过执行 rdtsc 指令获取当前 CPU 时钟计数器的值。
- 执行一段代码,例如随机生成一个数字或者MessageBox等,使得程序中断一些时间,防止被调试器单步跟踪。
- 获取当前时间戳 T2,即通过再次执行 rdtsc 指令获取当前 CPU 时钟计数器的值。
- 计算时间戳之差,即 T2-T1,如果该差值较小,则表明程序正在被调试器跟踪。
#include <Windows.h>
#include <stdio.h>
BOOL IsDebug()
{
int Debug = 0;
__asm
{
rdtsc // 调用时钟
xor ecx, ecx
add ecx, eax // 将eax与ecx相加
rdtsc // 再次调用时钟
sub eax, ecx // 两次结果做差值
mov Debug, eax
}
printf("打印差值: %d \n", Debug);
if (Debug >= 21)
{
return TRUE;
}
return FALSE;
}
int main(int argc, char * argv[])
{
if (IsDebug())
{
printf("[-] 进程正在被调试 \n");
}
system("pause");
return 0;
}
8.9 RDTSC时钟检测反调试的更多相关文章
- C/C++ 程序反调试的方法
C/C++ 要实现程序反调试有多种方法,BeingDebugged,NtGlobalFlag,ProcessHeap,CheckRemoteDebuggerPresent,STARTUPINFO,Is ...
- Delphi 19种反调试检测法
//使用IsDebuggerPresent这个API来检测是否被调试function FD_IsDebuggerPresent(): Boolean;beginif IsDebuggerPresent ...
- 手动绕过百度加固Debug.isDebuggerConnected反调试的方法
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78237571 1.调用Debug.isDebuggerConnected函数这种反 ...
- 反调试技术常用API,用来对付检测od和自动退出程序
在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己.为了了解如何破解反调试技术 ...
- 反调试——7——CRC检测
反调试--7--CRC检测 CRC32: CRC的全称是循环冗余校验,作用是为了检测数据的完整性. CRC32的检测原理: 程序被编译后,代码段是固定的,因为已经被写死了. 我们在调试程序的时候,打断 ...
- 反调试——11——检测TF标志寄存器
反调试--11--检测TF标志寄存器 在intel的x86寄存器中有一种叫标志寄存器: 标志寄存器中的TF(Trap Flag)位,CPU在执行完一条指令后,如果检测到标志寄存器的TF位为1,则会产生 ...
- Android反调试笔记
1)代码执行时间检测 通过取系统时间,检测关键代码执行耗时,检测单步调试,类似函数有:time,gettimeofday,clock_gettime. 也可以直接使用汇编指令RDTSC读取,但测试AR ...
- Windows反调试技术(下)
OD的DBGHELP模块 检测DBGHELP模块,此模块是用来加载调试符号的,所以一般加载此模块的进程的进程就是调试器.绕过方法也很简单,将DBGHELP.DLL改名. #include <Wi ...
- WinDbg调试流程的学习及对TP反调试的探索
基础知识推荐阅读<软件调试>的第十八章 内核调试引擎 我在里直接总结一下内核调试引擎的几个关键标志位,也是TP进行反调试检测的关键位. KdPitchDebugger : Boolean ...
- 基于TLS的反调试技术
TLS(Thread Local Storage 线程局部存储) 一个进程中的每个线程在访问同一个线程局部存储时,访问到的都是独立的绑定于该线程的数据块.在PEB(进程环境块)中TLS存储槽共64个( ...
随机推荐
- 【辅助工具】SVN使用
1.在对应路径下右键SVN checkout 2.输入对应的网址.用户名.密码 3.提交右键选择SVN commit.覆盖选择SVN update 4.编辑的时候右键TortoiseSVN-get l ...
- 同步时间,为什么我选 Chrony 而不是 NTP ?
初识 chrony chrony 是网络时间协议(Network Time Protocol )的通用实现 它不但可以提供保持系统时间与 NTP 时钟服务器同步的服务,还能作为 NTP 服务器对其他服 ...
- C 与 C++ 区别
C 与 C++ 区别 本文介绍 C 与 C++ 之间重要的或者容易忽略的区别.尽管 C++ 几乎是 C 的超集,C/C++ 代码混用一般也没什么问题,但是了解 C/C++ 间比较重要区别可以避免碰到一 ...
- Codeforce:1300B. Assigning to Classes (math)
解题思路 题目说的意思是,给一个2n个数的数组,注意n为奇数,将这个数组平均分为2份,假设为c1和c2. c1和c2是奇数个元素的数组,比如数组[1,2,3],那么中位数就是2. 那么如何求得中位数差 ...
- 密集计算场景下的 JNI 实战
作者:vivo 互联网服务器团队- Wei Qianzi.Li Haoxuan 在 Java 发展历程中,JNI 一直都是一个不可或缺的角色,但是在实际的项目开发中,JNI 这项技术应用的很少.在笔者 ...
- springboot 实现接收前端发来的图片和视频以及在页面上展示图片和视频
springboot 实现接收前端发来的图片和视频以及在页面上展示图片和视频 一.效果: 1.上传图片 2.显示上传的图片 3.上传的视频 4.显示上传的视频 二.代码 没依赖特殊的包,引入sprin ...
- Ubuntu 18.04安装arm-linux-gcc交叉编译器的两种方法(附下载地址)
方法一: 我们都知道Ubuntu有一个专门用来安装软件的工具apt,我们可以用它来全自动安装arm-linux-gcc. 此方法安装的是最新版的,但是此方法需要FQ,否则99%会失败,这就是为 ...
- PostMan——安装使用教程(图文详解)
https://blog.csdn.net/m0_61843874/article/details/123324727 postman使用教程1-安装与使用: https://www.cnblogs. ...
- 用线性二次模型建模大型数据中心,基于 MPC 进行冷却控制
目录 一个总述 reviews 0 abstract 1 intro 2 related work 3 DC cooling(问题定义) 4 MPC(method) 4.1 Model structu ...
- Skywalking 的使用
本文为博主原创,未经允许不得转载: 官网:http://skywalking.apache.org/下载:http://skywalking.apache.org/downloads/Github:h ...