首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 8.9 RDTSC时钟检测反调试

    RDTSC时钟检测同样可实现反调试检测,使用时钟检测方法是利用rdtsc汇编指令,它返回至系统重新启动以来的时钟数,并且将其作为一个64位的值存入EDX:EAX寄存器中,通过运行两次rdstc指令,然后计算出他们之间的差值 可以利用时钟检测技术来检测程序是否被调试器附加,其实现基本思路如下:获取当前时间戳 T1,即通过执行 rdtsc 指令获取当前 CPU 时钟计数器的值。 获取当前时间戳 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 // 再次调用时钟

    50540编辑于 2023-09-27
  • 8.9 RDTSC时钟检测反调试

    RDTSC时钟检测同样可实现反调试检测,使用时钟检测方法是利用rdtsc汇编指令,它返回至系统重新启动以来的时钟数,并且将其作为一个64位的值存入EDX:EAX寄存器中,通过运行两次rdstc指令,然后计算出他们之间的差值 可以利用时钟检测技术来检测程序是否被调试器附加,其实现基本思路如下: 获取当前时间戳 T1,即通过执行 rdtsc 指令获取当前 CPU 时钟计数器的值。 获取当前时间戳 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

    49010编辑于 2023-10-11
  • 来自专栏皮振伟的专栏

    [x86][gcc]PAUSE指令在Skylake上引起的性能问题

    (void) { unsigned long low, high; asm volatile("rdtsc" : "=a" (low), "=d" (high) ); return (); elapsed = finish - start - rdtsc_cycles; printf("total = %ld, average = %ld\n", (); finish = rdtsc(); finish = rdtsc(); finish = rdtsc(); finish = rdtsc(); finish = rdtsc(); finish = rdtsc(); finish = rdtsc(); finish = rdtsc(); finish = rdtsc(); long rdtsc_cycles = benchrdtsc(); bench(10, rdtsc_cycles); return 0; } 在5118上执行的结果是120,在E5

    2.5K40发布于 2018-12-17
  • 来自专栏mazhen.tech

    GCC 为龙芯 CPU的预定义宏

    例如RocksDB 对于获取当前时间,在 x86 平台上,会用到 Time Stamp Counter (TSC) 寄存器,使用 RDTSC 指令提取 TSC 中值。 We want this to be fast, so we // expose the implementation as RDTSC. static inline tokutime_t toku_time_now (void) { #if defined(__x86_64__) || defined(__i386__) uint32_t lo, hi; __asm__ __volatile__("rdtsc 在暂时不知道龙芯是否支持RDTSC的情况下,只能给出通用的实现,以后再查龙芯的CPU手册进行优化。

    87210编辑于 2023-11-24
  • 来自专栏技术杂记

    反作弊如何检测系统仿真(3)

    rdtsc;cpuid;rdtsc组合类似,IET散度测试使用计数器来分析两条指令,计算平均执行时间,然后比较两条指令的结果。 我们还限制了VMX / SVM指令的执行,并追溯了RDTSC和CPUID的所有执行。结果有些令人失望。 BattlEye程序 RDTSC / CPUID / RDTSC BattlEye采用的方法是使用rdtsc;cpuid;rdtsc组合的标准定时攻击。

    8.4K380发布于 2021-01-05
  • 来自专栏python3

    windows xp sp3 AMD双核

    by compensating for those applications that bypass the Windows API for timing by directly using the RDTSC Applications that rely on RDTSC do not benefit from the logic in the operating system to properly account 翻译:AMD双核心优化可以帮助改善一些P C游戏的视频性能补偿对于那些应用程序绕过W indowsAPI的时间为直接使用rdtsc(阅读时间戳记柜)的指示。. 应用依赖于rdtsc不利于从逻辑的作业系统,妥善帐户的影响,电源管理机制上的速度,其中一个处理器核心的时间戳计数器(台糖)递增。

    1.3K30发布于 2020-01-09
  • 来自专栏锦鲤安全

    规避检测(共五章):第五章

    3.1 RDTSC(使用 CPUID 强制虚拟机退出) BOOL rdtsc_diff_vmexit() { ULONGLONG tsc1 = 0; ULONGLONG tsc2 = 0 (); __cpuid(cpuInfo, 0); tsc2 = __rdtsc(); // Get the delta of the two RDTSC FALSE : TRUE; } 3.2 RDTSC(带有 GetProcessHeap 和 CloseHandle 的锁定版本) #define LODWORD(_qw) ((DWORD)(_qw )) BOOL rdtsc_diff_locky() { ULONGLONG tsc1; ULONGLONG tsc2; ULONGLONG tsc3; DWORD i (); tsc2 = __rdtsc(); CloseHandle(0); tsc3 = __rdtsc();

    92120编辑于 2023-11-20
  • 来自专栏FreeBuf

    初步分析勒索软件ZEPTO

    拿到WSF样本后,使用记事本打开,JS脚本已经被加密, 尝试使用几种decode解密失败后,费事麻烦,直接祭出加料的VirtualBox,这里并没有使用Vmware,主要是Lokcy家族使用了RDTSC RDTSC反虚拟技术通过运行一段特定代码,然后比较这段代码在虚拟机和真实主机之中的相对运行时间,以此来判断是否处于虚拟机之中。 这段代码我们可以通过RDTSC指令来实现,RDTSC指令是用于将计算机启动以来的CPU运行周期数存放到EDX:EAX里面,其中EDX是高位,而EAX是低位。

    1.1K70发布于 2018-02-08
  • 来自专栏虚拟化云计算

    时钟也能虚拟化吗

    虚拟化下的时钟 1.TSC Guest中使用rdtsc指令读取TSC时,会因为EXIT_REASON_RDTSC导致VM Exit。

    4.1K90发布于 2018-04-08
  • 来自专栏kayden

    反调试技术

    } 2、Timing Check 调试必然要耗费更多时间,故可以通过计算运行时间来判断是否处于调试状态,有两种: 用CPU的计数器(Counter) 用系统的实际时间(Time) 一个例子:基于RDTSC Time Stamp Counter,读取时间戳计数器) #include "stdio.h" #include "windows.h" #include "tchar.h" void DynAD_RDTSC () { DWORD dwDelta = 0; printf("Timing Check (RDTSC method)"); __asm { pushad / / 第一次执行RDTSC rdtsc // 将结果TSC放入栈 push edx push eax // 用于消耗时间的循环 xor eax, eax mov ecx, 0x3e8 _LOOP_START: inc eax loop _LOOP_START // 第二次执行RDTSC rdtsc // 在栈中输入第一次求得的

    1.7K10编辑于 2022-09-29
  • 来自专栏FreeBuf

    如何使用TinyTracer跟踪API调用

    功能介绍 1、支持跟踪API调用,其中包括参数和选择的目标函数; 2、选择的指令,包括RDTSC、CPUID、INT; 3、内联系统调用,包括参数和选择的syscall; 4、支持在被跟踪模块的各个部分之间切换 (可以帮助找到封装模块的OEP); 5、支持基于RDTSC绕过反跟踪机制; 工具要求 Intel PIN Visual Studio(Windows) g++、make(Linux) 工具下载

    1.6K10编辑于 2023-12-06
  • 来自专栏《C++与 AI:个人经验分享合集》

    《C++实现不依赖操作系统的高精度定时器》

    在 x86 架构上,可以使用汇编语言中的 rdtsc 指令来读取时钟周期计数器。 cpp 复制 #include inline unsigned long long getCycleCount() { unsigned int lo, hi; asm volatile(“rdtsc ” : “=a”(lo), “=d”(hi)); return ((unsigned long long)hi << 32) | lo; } 这个函数使用内联汇编语言调用 rdtsc 指令,将时钟周期计数器的值读取到

    72010编辑于 2024-12-09
  • 来自专栏小伍同学的小窝

    浅谈VMware环境去虚拟化

    FALSE; } else { return TRUE; } } //通过时间差检测 BOOL CheckVMWareTmp() { __asm { rdtsc //RDTSC指令将计算机启动以来的CPU运行周期数存放到EDX:EAX里面,其中EDX是高位,而EAX是低位。 xchg ebx, eax //测试此条指令运行时间 rdtsc sub eax, ebx //时间差 cmp eax, 0xFF jg detected } return

    9.5K20编辑于 2021-12-13
  • 来自专栏高性能架构

    一文看懂DPDK

    在x86-64下使用RDTSC指令,直接从寄存器读取,需要输入2个参数,比较常见的实现: static inline uint64_t rte_rdtsc(void) { uint32_t lo, hi; __asm__ __volatile__ ( "rdtsc" : "=a"(lo), "=d"(hi) unsigned long long)hi) << 32); } 这么写逻辑没错,但是还不够极致,还涉及到2次位运算才能得到结果,我们看看DPDK是怎么实现: static inline uint64_t rte_rdtsc { uint64_t tsc_64; struct { uint32_t lo_32; uint32_t hi_32; }; } tsc; asm volatile("rdtsc

    70.5K3743发布于 2018-08-29
  • 来自专栏GPUS开发者

    CUDA优化的冷知识 5 | 似是而非的计时方法

    然后在任何一个平台上, 均不建议使用__rdtsc()或者clock()函数进行计时. 这里要重要说一下。 此外, 今天的两个被拒绝的工具中(clock & __rdtsc), 后者也存在一处或者多处问题, 因此也不能用. rdtsc主要是存在时基漂移(在后期的CPU和主板中逐渐的解决了), 不能跨核心同步,

    1.2K10发布于 2021-01-06
  • 来自专栏LINUX阅码场

    绝对干货!初学者也能看懂的DPDK解析

    在x86-64下使用RDTSC指令,直接从寄存器读取,需要输入2个参数,比较常见的实现: static inline uint64_t rte_rdtsc(void) { uint32_t lo, hi; __asm__ __volatile__ ( "rdtsc" : "=a"(lo), "=d"(hi) unsigned long long)hi) << 32); } 这么写逻辑没错,但是还不够极致,还涉及到2次位运算才能得到结果,我们看看DPDK是怎么实现: static inline uint64_t rte_rdtsc { uint32_t lo_32; uint32_t hi_32; }; } tsc; asm volatile("rdtsc

    2.6K21发布于 2019-07-30
  • 来自专栏技术杂记

    反作弊如何检测系统仿真(4)

    RDTSC / CPUID / RDTSC EasyAntiCheat还使用标准定时攻击,使它们可以通过适当的TSC仿真(在前面的小节中进行了描述)被规避。

    2K140发布于 2021-01-05
  • 来自专栏技术杂记

    反作弊如何检测系统仿真(2)

    RDTSC / CPUID / RDTSC 如果您已经进行了性能分析,或者为防恶意软件而进行了沙箱检测(或更可疑的目的),则可能已经使用或遇到了这种计时检查。 我们知道,定时攻击通过直接使用IA32_TIMESTAMP_COUNTERMSR或内部函数两次查询时间戳计数器__rdtsc。通常情况下,两者之间会有说明。 从第一个追踪rdtsc第二条指令,将平均周期计数添加到仿真计数器。尽管可以使用MTF,但是没有使用TSC偏移或其他功能-尽管您可以利用MTF。

    19.2K420发布于 2020-12-03
  • 来自专栏三丰SanFeng

    程序运算性能测量

    并可通过指令“rdtsc”将其写入edx:eax。所以,我们可以在代码中插入这样的语句。 #define rdtscll_64(val) do {\ unsigned int __a,__d; \ __asm__ __volatile__("rdtsc" : "=a" (__a), "=d" vector> #include <stdint.h> #define rdtscll_64(val) do {\ unsigned int __a,__d; \ __asm__ __volatile__("rdtsc

    1.4K50发布于 2018-01-16
  • 来自专栏python3

    Ring0和Ring3权限级

    ,并不写回 wbinvd:缓冲无效,并写回 invlpg:无效TLB入口 hlt:停止处理器 rdmsr:读模式指定寄存器 wrmsr:写模式指定寄存器 rdpmc:读取性能监控计数器 rdtsc :读取时间戳计数器     最后2条指令rdpmc和rdtsc,在cr4的位4(PCE)和位2(TSD)被设置的情况下可以同时被R0层和R3层调用。

    2.3K10发布于 2020-01-08
领券