selph
selph
发布于 2022-03-20 / 323 阅读
0
0

《xchg rax,rax》片段分析0x18--比对时间戳

前言

本次是该系列的的第0x18篇,咕了好久了,终于考完试了,今天回来开始更新啦!本篇内容介绍了使用汇编获取时间戳,并进行比对的操作,这种方式可用来进行反调试


实验环境:

  • Windows10 + VS2022 + masm

0x18

代码片段链接:xorpd | xchg rax,rax 0x18

rdtsc
shl      rdx,0x20
or       rax,rdx
mov      rcx,rax

rdtsc
shl      rdx,0x20
or       rax,rdx

cmp      rcx,rax

代码分析

rdtsc命令:读取当前处理器的时间戳计数器到EDX:EAX,edx载入高32位,eax载入低32位,如果处理器是64位的,则rdx和rax的高32位会清空

这里执行了两遍同样的代码进行对比,获取两个时间戳进行对比,印象中有一种反调试技术就是使用时间戳的,通过判断函数执行前后的时间判断是否被调试

分析代码:

.code
main proc
   
    rdtsc               ;读取时间戳计数器到RDX:RAX
    shl      rdx,020h   ;左移0x20位
    or       rax,rdx    ;高低位or
    mov      rcx,rax    ;rcx = rax

    rdtsc               ;再次读取时间戳
    shl      rdx,020h   ;左移0x20
    or       rax,rdx    ;高低位or

    cmp      rcx,rax    ;求两次时间差
    
    sub rax,rcx         ;如果进入调试了,这个时间会很大,如果没进入调试
    					;这个时间就会很小,可以用来反调试

    ret
main ENDP
END

评论