基于反调试加载

基于SEH异常

什么是SEH

SEH(Structured Exception Handling,结构化异常处理)是Windows操作系统中的一种错误处理和异常处理机制。SEH提供了一种强大、灵活且通用的方法来处理异常,它使得开发者能够为应用程序中发生的运行时错误和异常编写自定义的处理代码

SEH的工作原理是在程序中建立一个异常处理函数链。每个异常处理函数都负责处理特定的异常。当程序运行时遇到异常,操作系统会沿着异常处理函数链寻找适当的处理函数。如果找到合适的异常处理函数,系统将调用该函数并处理异常。如果没有找到合适的处理函数,系统将终止程序

image-20240215165923897

在C++中,可以使用_try_except_finally关键字来实现SEH异常处理。_try块包含可能引发异常的代码;_except块包含处理异常的代码;而_finally块包含在任何情况下都应执行的代码,无论是否发生异常

SEH的一个重要特点是它与语言无关,因此可以在C、C++等语言中使用。然而,C++提供了另一种异常处理机制:C++异常处理(trycatchthrow关键字)。C++异常处理机制更符合C++语言的面向对象特性,通常在C++程序中更为常用。然而,在某些情况下,SEH仍然具有独特的优势,例如在处理特定的Windows异常或与C代码交互时

实现代码

这种方式加载shellcode的一个好处就是在调试器环境下和正常运行环境下表现不同。当程序在调试器中运行时,调试器会接管异常处理,从而使得程序在除零异常处停止,而不会执行shellcode。这使得恶意代码的执行在调试环境下被阻止,为分析和调试带来困难

基于TLS机制

什么是TLS

线程局部存储(Thread Local Storage,TLS)是一种将数据与特定执行线程关联的机制。当在一个线程内部的各个函数调用之间共享数据,但不让其他线程访问时,可以使用TLS

TLS回调函数

TLS提供了一个回调函数,在线程初始化和终止时会被调用,这个回调函数会在程序入口点(即main函数)之前执行,调试器通常会在主函数入口点设置断点,因此TLS回调函数经常被用作反调试手段

TLS回调函数允许我们编写并执行任意代码。TLS有两种类型:静态TLS和动态TLS。静态TLS将TLS相关数据硬编码在PE(Portable Executable)文件中,而动态TLS在运行时分配和管理TLS数据。

静态TLS是将TLS相关数据硬编码在PE(Portable Executable,可执行文件)中。静态TLS存储在PE头的IMAGE_DATA_DIRECTORY DataDirectory[9]位置,可以通过该位置找到TLS目录的详细信息

通过在TLS回调函数中加载和执行shellcode,我们可以在程序的正常执行流之前运行这段代码。这种方法可以绕过调试器设置的断点,增加分析和调试的难度

TLS回调函数遵循特殊的编写约定,与DLL主函数类似。回调函数使用以下类型定义:

实现代码

这段代码的核心目的是在程序启动时,通过TLS回调函数来执行Shellcode,而不是在主函数中执行

最后更新于