前言
本次是该系列的的第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