草庐IT

c++ - 我需要帮助开发多态引擎 - 指令依赖树

coder 2024-02-21 原文

我目前正在尝试用 C++ 编写一个多态引擎来玩弄我的一个巧妙的反黑客保持事件检查想法。然而,编写多态引擎被证明是相当困难的——我什至还没有确定我应该如何去做。这个想法是将可执行代码流式传输给用户(即我正在保护的应用程序),偶尔向他们发送一些代码,这些代码在内存镜像上运行一些校验和并将其返回给服务器。问题是我不希望有人简单地劫持或以编程方式破解存活检查;相反,每个都将在服务器上生成,使用简单的代码 stub 并通过多态引擎运行它。每个保持事件检查都会返回一个值,该值取决于数据的校验和,并且随机算法潜入保持事件检查中。如果 stub 返回错误,我就知道存活检查已被篡改。

我必须处理的事情:

*可执行镜像 PDB 文件。 *汇编器和反汇编器引擎,我在它们之间实现了一个接口(interface),允许重新定位代码等...

以下是我正在考虑执行的步骤以及我可能如何执行这些步骤。我在 Windows PE 可执行文件上使用 x86 指令集

我计划采取的步骤(我的问题是第 2 步):

  1. 展开说明

    • 找到像 mov 这样的简单指令,或者推送并用一些指令替换它们,这些指令虽然有更多指令,但可以达到相同的目的。在此步骤中,我还将添加大量垃圾代码。
    • 我打算通过使用数据库中的一系列翻译表来完成这项工作。这应该不是很难做到。
  2. 洗牌

    • 这是我遇到最多麻烦的部分。我需要将代码隔离到函数中。然后我需要建立一系列的指令依赖树,然后我需要根据一个依赖另一个来重新定位它们。我可以通过解析 pdb 文件找到函数,但创建指令依赖树是我完全迷失的棘手部分。
  3. 压缩指令

    • 压缩指令并在此过程中执行一系列不常见和晦涩的指令。而且,就像第一步一样,通过使用代码签名数据库来执行此操作。

再次澄清一下,我需要帮助来执行第 2 步,但我什至不确定我应该如何开始。我尝试制作一些图表,但它们变得非常难以理解。

OH:显然, protected 代码不会是最佳选择 - 但这只是我想在学校玩的一个安全项目。

最佳答案

我认为您所追求的“指令依赖树”是 data flow analysis .这是经典的编译器技术,它为每个代码元素(编程语言中的原始操作)确定从其他代码元素向它传递的信息。完成后,您最终会得到一个图形,其中节点是代码元素(在您的情况下是单独的指令),它们之间的有向弧显示必须流动的信息,以便后面的元素可以执行由“图中较早的"元素。

可以看到some examples of such flow analysis在我的网站上(专注于执行程序分析的工具;此工具可能不适合二进制分析,但示例应该有所帮助)。

编译器书籍中有大量关于进行数据流分析的文献。请参阅任何编译器教科书。

您需要处理许多问题:

  • 解析代码以提取代码元素。您听起来好像已经可以访问所有说明。

  • 确定每个代码元素所需的操作数和产生的值。这对于“ADD 寄存器,寄存器”来说非常简单,但您可能会发现这对于生产 x86 CPU 来说令人望而生畏,因为它具有惊人的大而疯狂的指令集。您必须为 CPU 可能执行的每条指令收集此信息,这几乎意味着所有指令。尽管如此,这只是汗水和大量时间花在查看说明引用手册上。

  • 循环。值可以从一条指令流出,通过其他指令,返回到同一指令,因此数据流可以形成循环(复杂循环有很多循环)。数据流文献将告诉您如何根据计算图中的数据流弧来处理这个问题。我不知道这些对您的保护方案意味着什么。

  • 保守分析:您无法获得理想的数据流,因为实际上您是在分析任意算法(例如,图灵机);指针非常严重地加剧了这个问题,机器代码中充满了指针。因此,当无法确定“x feeds y”时,数据流分析引擎经常做的是简单地假设“x(可能)feed y”。数据流图在概念上从“x(必须)喂y”转变为实用的“x(可能)喂y”类型弧;因此,文献实际上充满了“必须”和“可能”的算法。 同样,文献告诉您进行 [保守] 流分析的许多方法(大多数具有不同程度的保守性;事实上,最保守的数据流分析只是说“每个 x 提供每个 y”!)。我不知道这对您的方案在实践中意味着什么。

有很多人对二进制代码分析感兴趣(例如 NSA),他们对机器指令进行数据流分析并完成指针分析。您可能会发现此演示文稿很有趣:http://research.cs.wisc.edu/wisa/presentations/2002/0114/gogul/gogul.1.14.02.pdf

关于c++ - 我需要帮助开发多态引擎 - 指令依赖树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10670985/

有关c++ - 我需要帮助开发多态引擎 - 指令依赖树的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

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

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

  4. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  5. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  6. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  7. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  8. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  9. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  10. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

随机推荐