Created the Monday 18 March 2019. Updated 3 years, 6 months ago.

This is typical timing function which is used to measure time needed to execute some function/instruction set. If the difference is more than fixed threshold, the process exits.

GetTickCount reads from the KUSER_SHARED_DATA page. This page is mapped read-only into the user mode range of the virtual address and read-write in the kernel range. The system clock tick updates the system time, which is stored directly in this page.

ZwGetTickCount is used the same way as GetTickCount. Using KiGetTickCount is faster than calling ZwGetTickCount, but slightly slower than reading from the KUSER_SHARED_DATA page directly.

Technique Identifier


Technique Tag


Code Snippets

bool IsDebugged(DWORD dwNativeElapsed)
    DWORD dwStart = GetTickCount();
    // ... some work
    return (GetTickCount() - dwStart) > dwNativeElapsed;

Detection Rules

    name: check for time delay via GetTickCount
    namespace: anti-analysis/anti-debugging/debugger-detection
    scope: function
      - Anti-Behavioral Analysis::Debugger Detection::Timing/Delay Check GetTickCount [B0001.032]
      - Practical Malware Analysis Lab 16-03.exe_:0x4013d0
    - and:
      - count(api(kernel32.GetTickCount)): 2 or more

Additional Resources

External Links

Subscribe to our Newsletter

The information entered into this form is mandatory. It will be subjected to computer processing. It is processed by computer in order to support our users and readers. The recipients of the data will be :

According to the Data Protection Act of January 6th, 1978, you have at any time, a right of access to and rectification of all of your personal data. If you wish to exercise this right and gain access to your personal data, please write to Thomas Roccia at

You may also oppose, for legitimate reasons, the processing of your personal data.