jjzjj

c++ - 了解 C/C++ 中 Windows/MSVC 的一些反调试内联汇编

coder 2024-06-09 原文

我正在尝试了解 https://github.com/nemesisqp/al-khaser/blob/0f74c40dde8ba060807e031271f81457a187fa08/DebuggerDetection.cpp#L603 中的一些反调试器功能


__asm {
    mov eax, fs:[30h]
    mov al, [eax + 2h]
    mov IsDbg, al
}

功能相同

__asm mov IsDbg, [fs:[0x30] + 0x2]

如果不是,为什么不呢?

此外,如何将其转换为纯 C/C++?如何获取线程信息(特别是 fs:[30h])?


BOOL Int2DCheck()
{
    // The Int2DCheck function will check to see if a debugger
    // is attached to the current process. It does this by setting up
    // SEH and using the Int 2D instruction which will only cause an
    // exception if there is no debugger. Also when used in OllyDBG
    // it will skip a byte in the disassembly and will create

    __try
    {
        __asm
        {
            int 2dh
            xor eax, eax
            add eax, 2
        }
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        return false;
    }

    return true;
}

一样

__try
{
    __asm
    {
        xor eax, eax
        int 0x2d
        inc eax
    }
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
    return false;
}

如果不是,为什么不呢?

最佳答案

这两种技术都比较古老。我认为它们在 2000 年代初期就已在使用,如果不是在 90 年代后期的话。


第一个使用 Thread-Information Block (TIB) 的事实对于 Windows 进程,驻留在 fs:[0](至少和 WinXP 一样晚......从那以后我就没再看过了)。

TIB 中的偏移量 0x30 是指向 Process Environment Block (PEB) 的指针.从该链接中,我们看到 PEB 中的偏移量 0x2 是“正在调试”标志。这是 API 调用 IsDebuggerPresent 读取的值。


第二个例子演示了两种检测机制:

This answer详细介绍了 int 0x2d 在 Windows 上的功能。目前,我们只注意到它是 Windows 内置调试​​支持的一部分。

更简单的机制是这样的:Windows 中的结构化异常处理会捕获基于语言的异常无法捕获的内容,因为它挂接到操作系统的异常处理框架,而不是语言运行时的。

所以 int 0x2d 会产生错误;任何存在的调试器都会处理该错误,并且由于此中断用于调试,因此调试器将像往常一样返回到控制流。因此,不会调用结构化异常处理机制……因此永远不会达到“捕获”,并且函数的返回值会因此改变。通过告诉调试器将异常传递给程序,此方法被后来的 SEH 感知调试器轻而易举地击败,在这种情况下 SEH 将触发。

另一种机制基于 Windows 处理 int 0x2d 的方式的细节,OllyDbg 显然没有完美地模拟它(曾经是非凡的调试器,但现在已经不复存在了恶意软件)。我个人并不熟悉这种方法,所以我会引导您查看链接的答案。

就上下文而言,反调试器技术的早期是对特别流行的调试工具的研究。在您从中挖掘这些技术的任何文档中,您无疑还会看到专门用于检测 NuMega Softice 的技术——可能是第一个 Windows 内核调试器(大约 NT 4.0)。派生我的句柄的指令序列被用作检测此调试器的方法。

感谢您的记忆之旅 ;)

关于c++ - 了解 C/C++ 中 Windows/MSVC 的一些反调试内联汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52087716/

有关c++ - 了解 C/C++ 中 Windows/MSVC 的一些反调试内联汇编的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  4. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  5. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  6. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  7. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  8. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  9. ruby - 找一些句子 - 2

    我想找到在某些文本中找到一些(让它是两个)句子的好方法。什么会更好-使用正则表达式或拆分方法?你的想法?应JeremyStein的要求-有一些例子示例:输入:ThefirstthingtodoistocreatetheCommentmodel.We’llcreatethisinthenormalway,butwithonesmalldifference.IfwewerejustcreatingcommentsforanArticlewe’dhaveanintegerfieldcalledarticle_idinthemodeltostoretheforeignkey,butinthis

  10. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

随机推荐