anti debug - 用于 int 3 断点检测的计算函数内存占用

Posted

技术标签:

【中文标题】anti debug - 用于 int 3 断点检测的计算函数内存占用【英文标题】:anti debug - calc function memory footprint for int 3 breakpoint detection 【发布时间】:2016-04-12 15:11:56 【问题描述】:

我正在研究本文中列出的一些简单的反调试措施 http://www.codeproject.com/Articles/30815/An-Anti-Reverse-Engineering-Guide#BpMem

我已经对给定函数中的 int 3 断点实现了简单检查,因此如果在 thisIsADummyFunction 中的任何位置设置了断点,则函数 testForInt3Breakpoints 会返回 true。

int thisIsADummyFunction()

    int i = rand();
    ++i;  
    return i;


bool testForInt3Breakpoints()
  
    bool breakPointPresent = false;
    unsigned char* memPtr = reinterpret_cast<unsigned char*>( thisIsADummyFunction );

    auto size = 0x16; //this value determined by manual inspection of compiled code

    for ( size_t i = 0; i < size; i++ ) 
        if ( memPtr[ i ] == 0xCC )            //see if byte equals int 3 instruction
            breakPointPresent = true;
            break;            
        
    
    return breakPointPresent;

上面的函数对我来说适用于那个特定的函数,但我希望能够监视多个函数,而不必每次都检查编译的代码。

我的问题是有什么方法可以获取函数的内存占用,以便知道要监控哪些内存?

我知道在运行时没有通用的跨平台方法: How to get the length of a function in bytes?

但我在 windows x64 和 Visual Studio 2015 上运行,并且非常高兴获得特定于平台的答案或任何可以以某种方式自动化该过程的东西。

【问题讨论】:

您的代码会产生误报。如果你真的想检查int 3 操作码,你必须解析指令。 0xCC 可以是除int 3 之外的操作码的一部分(例如,立即数)。此外,调试器拥有改变世界的全部力量。它可以通过注入 0xCC 序列来暂停线程、跳过代码或设置断点。这确实是一种非常幼稚的挫败攻击的尝试。 与其扫描 0xCC,不如生成代码的哈希值,然后比较差异。这也有利于检测其他代码修改攻击。 简而言之,没有一个好的方法可以做到这一点。另见:***.com/questions/4156585/… 【参考方案1】:

正如上面的 cmets 所述,对于这个特定的问题描述没有很好的解决方案,尤其是不能与扫描 0xCC 结合使用,因为它是一个有效字节,即使没有断点,它迟早会出现在你的代码中设置。

如前所述,更好的方法是散列整个代码部分。但是,这样做有以下缺点:

先有后继的问题:您需要在编译后获取散列值,但实际上在代码中使用它来比较实际散列值与预期值。 根据您执行检查的频率以及您的代码段(包括库代码)有多大,这可能会对性能产生更大的影响。此外,如果您在应用程序空闲时进行检查,Windows 将不得不在代码的所有部分中分页,即使它们目前没有执行,从而有效地将您的整个程序锁定在内存中,即使它不是必需的。 您可能会遇到安全软件和其他工具对其他进程进行低级别修改的问题。像这样的一些工具会直接在内存中覆盖/挂钩部分代码,以执行额外的安全功能。

如果你仍然想走这条路,你可以使用VirtualQuery在代码中的任意位置使用指针(例如&amp;main)来获取代码段的边界,然后阅读所有内容并使用哈希算法,例如像 Murmurhash 一样(非常快)来创建一个哈希并将其与存储的值进行比较。

要解决那里的先有后有的问题,例如,您可以从程序的运行副本中获取哈希(使用某种“秘密”命令行开关,或者通过使用读取内存)另一个您使用OpenProcessVirtualQueryExReadProcessMemory 完成工作的程序)并将其存储在不属于哈希的位置,例如您的数据部分或资源。如果你使用后者,你甚至可以在文件中设置正确的哈希,而无需重新编译。

【讨论】:

以上是关于anti debug - 用于 int 3 断点检测的计算函数内存占用的主要内容,如果未能解决你的问题,请参考以下文章

[原创]VMProject 3.x 3.5: 2021年绕过anti-debugging的最新配置, 解决“a debugger has been found“的问题.

[原创]VMProject 3.x 3.5: 2021年绕过anti-debugging的最新配置, 解决“a debugger has been found“的问题.

day04(Debug基础知识练习)

使用 INT 3 (0xCC) 软件断点时,即使已修补指令,调试器如何保证正确性?

Idea断点调试(debug)详解

AndroidStudio(Debug)调试