JavaScript反调试技术详解与应用

1 下载量 162 浏览量 更新于2024-08-31 收藏 95KB PDF 举报
"JavaScript反调试技巧的分享,包括检测执行环境、调试工具、代码和流完整性控制以及反模拟等策略,旨在使JavaScript代码更难以被分析。文章通过函数重定义等示例,解释如何隐藏或伪造代码执行信息。" 在JavaScript编程中,反调试是一种重要的安全实践,尤其在防止恶意软件分析和逆向工程时显得尤为重要。本文重点讨论了几种常见的JavaScript反调试技巧,以提高代码的安全性和隐私保护。 首先,检测未知的执行环境是确保代码在预期环境中运行的关键。这通常涉及到检查当前运行环境是否为浏览器,因为JavaScript代码通常设计在浏览器环境中执行。如果代码检测到非预期环境,如Node.js环境或者调试器环境,它可以自我中断或者执行不同逻辑,以避免被恶意利用。 其次,检测调试工具如开发者工具(DevTools)是另一种常见策略。开发者工具通常被用于代码调试,因此检测其是否存在并据此调整代码行为可以防止敏感信息泄露。例如,通过监听`window`对象上的`console`属性变化,可以在检测到`console.log`被调用时,替换或禁用它,以隐藏日志输出。 代码完整性控制和流完整性控制是确保代码未被篡改或插入恶意代码的方法。这些方法通常涉及到校验代码哈希值,或者设置预期的执行顺序。如果检测到代码序列被改变,程序可以停止执行或执行错误路径,以此挫败攻击者。 反模拟技术则是为了防止攻击者使用模拟环境来绕过实际执行环境的限制。例如,通过检测特定硬件特性或浏览器API的行为,可以判断是否在真实用户环境中运行,如果发现异常,可以采取应对措施。 函数重定义是本文介绍的一个具体反调试技术实例。它演示了如何通过重新定义`console.log`来隐藏或伪造输出信息,以此干扰调试者对程序状态的理解。这种技术可以扩展到其他内置函数或自定义函数,以实现更加复杂的隐藏策略。 JavaScript反调试技巧的运用能有效地提高代码的安全性,但同时也应注意到,过度的反调试可能会对正常的开发和维护工作造成困扰。因此,在实际应用中,平衡安全与可用性是至关重要的。开发者需要根据项目需求和风险评估来决定采用哪些反调试策略。
2018-12-06 上传
## Features ### Anti-debugging attacks - IsDebuggerPresent - CheckRemoteDebuggerPresent - Process Environement Block (BeingDebugged) - Process Environement Block (NtGlobalFlag) - ProcessHeap (Flags) - ProcessHeap (ForceFlags) - NtQueryInformationProcess (ProcessDebugPort) - NtQueryInformationProcess (ProcessDebugFlags) - NtQueryInformationProcess (ProcessDebugObject) - NtSetInformationThread (HideThreadFromDebugger) - NtQueryObject (ObjectTypeInformation) - NtQueryObject (ObjectAllTypesInformation) - CloseHanlde (NtClose) Invalide Handle - SetHandleInformation (Protected Handle) - UnhandledExceptionFilter - OutputDebugString (GetLastError()) - Hardware Breakpoints (SEH / GetThreadContext) - Software Breakpoints (INT3 / 0xCC) - Memory Breakpoints (PAGE_GUARD) - Interrupt 0x2d - Interrupt 1 - Parent Process (Explorer.exe) - SeDebugPrivilege (Csrss.exe) - NtYieldExecution / SwitchToThread - TLS callbacks ### Anti-Dumping - Erase PE header from memory - SizeOfImage ### Timing Attacks [Anti-Sandbox] - RDTSC (with CPUID to force a VM Exit) - RDTSC (Locky version with GetProcessHeap & CloseHandle) - Sleep -> SleepEx -> NtDelayExecution - Sleep (in a loop a small delay) - Sleep and check if time was accelerated (GetTickCount) - SetTimer (Standard Windows Timers) - timeSetEvent (Multimedia Timers) - WaitForSingleObject -> WaitForSingleObjectEx -> NtWaitForSingleObject - WaitForMultipleObjects -> WaitForMultipleObjectsEx -> NtWaitForMultipleObjects (todo) - IcmpSendEcho (CCleaner Malware) - CreateWaitableTimer (todo) - CreateTimerQueueTimer (todo) - Big crypto loops (todo) ### Human Interaction / Generic [Anti-Sandbox] - Mouse movement - Total Physical memory (GlobalMemoryStatusEx) - Disk size using DeviceIoControl (IOCTL_DISK_GET_LENGTH_INFO) - Disk size using GetDiskFreeSpaceEx (TotalNumberOfBytes) - Mouse (Single click / Double click) (todo) - DialogBox (todo) - Scrolling (todo) - Execution after reboot (todo) - Count of processors (Win32/Tinba - Win32/Dyre) - Sandbox k