c++ - 反调试 - 用于 int 3 断点检测的计算函数内存占用

标签 c++ windows visual-studio

我正在研究本文中列出的一些简单的反调试措施 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 上运行,对于平台特定的答案或任何可以以某种方式自动化该过程的东西,我感到非常高兴。

最佳答案

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

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

  • 鸡生蛋问题:您需要在编译后获取散列值,但实际上在您的代码中使用它来比较实际散列值与预期散列值。
  • 这可能会对性能产生较大影响,具体取决于您进行检查的频率和代码部分(包括库代码)的大小。另外,如果您在应用程序空闲时进行检查,Windows 将不得不调入代码的所有部分,即使它们此时没有执行,即使不需要,也有效地将整个程序锁定在内存中。
  • 您可能会遇到对其他进程进行低级别修改的安全软件和其他工具的问题。像这样的一些工具会直接在内存中覆盖/ Hook 您的部分代码,以执行额外的安全功能。

如果你仍然想走这条路,你可以使用 VirtualQuery 和代码中任意位置的指针(例如 &main)来获取代码部分的边界,然后全部阅读并使用哈希算法,例如 Murmurhash (这非常快)创建一个散列并将其与存储的值进行比较。

为了解决鸡生蛋还是蛋生鸡的问题,例如,您可以从程序的运行拷贝中获取散列(使用某种“ secret ”命令行开关,或者通过使用读取内存另一个程序,您可以从中使用 OpenProcessVirtualQueryExReadProcessMemory 来完成这项工作)并将其存储在不属于哈希的位置,例如您的数据部分或资源。如果您使用后者,您甚至可以在文件中设置正确的散列而无需重新编译。

关于c++ - 反调试 - 用于 int 3 断点检测的计算函数内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36577344/

相关文章:

c++ - 如何根据 C++ 中的数据类型打印 OpenCv 矩阵?

c++ - 硬件扫码转ascii字符

c# 到 c++ 字典到 unordered_map 结果

c# - VSIX newtonsoft 不在包中 (VS>15.5) 抑制包

reactjs - 我无法通过 native 运行窗口还原NuGet软件包

c++ - Visual Studio 2019 "C1001 internal compiler error"仅在发行版中

Mac 上的 C++ 内存清理

c++ - C++ 计算器中的整数限制

c++ - hpp 和 cpp 文件添加到库时出现链接器错误

windows - Windows 内存管理器用于确定何时开始将页面交换到磁盘的阈值是多少?