Shell 自动插入校验和保护

Shell 自动插入校验和保护,shell,assembly,checksum,Shell,Assembly,Checksum,作为我项目的一部分,我必须插入部分代码(称为校验和保护)以保护某些函数。这个过程必须是自动化的,即我需要编写一个脚本来在程序集中插入这些防护装置。我确实随身带着警卫模板,我不知道如何继续 如何编写一个shell脚本,将代码插入由C中的源文件生成的程序集文件中 编辑: 这是我正在努力实现的文件。 cerias.purdue.edu/assets/pdf/bibtex_archive/2001-49.pdf 作者提到他们已经修改了二进制文件以插入防护,但这似乎很难。因此,我考虑修改汇编代码 以下是一

作为我项目的一部分,我必须插入部分代码(称为校验和保护)以保护某些函数。这个过程必须是自动化的,即我需要编写一个脚本来在程序集中插入这些防护装置。我确实随身带着警卫模板,我不知道如何继续

如何编写一个shell脚本,将代码插入由C中的源文件生成的程序集文件中

编辑:

这是我正在努力实现的文件。 cerias.purdue.edu/assets/pdf/bibtex_archive/2001-49.pdf 作者提到他们已经修改了二进制文件以插入防护,但这似乎很难。因此,我考虑修改汇编代码

以下是一个保护模板:

guard:
      add ebp, -checksum
      mov eax, client_addr

for:
      cmp eax, client_end
      jg end
      mov ebx, dword[eax]
      add ebp, ebx
      add eax, 4
      jmp for
end:
其中client_addr和client_end分别标记要保护的代码的开始和结束

我意识到我对这篇论文的理解还不完整,我还不清楚各种问题,但我正在努力弄清楚

如何将各种函数(用于保护)作为shellscript的输入

  • 我可以用字符串形式给出函数的名称
  • 我可以给出函数的起始地址和结束地址(使用gdb找到)
  • 但是在插入校验和保护之后,地址会发生变化,所以我认为给出名称是一个更好的主意。 是这样吗

    我对SO还不熟悉,因此仍然需要学习很多关于发布问题的正确方法。
    但是谢谢你的帮助和指导。

    自动完成这项工作可能是一个真正的挑战,尽管我认为这是不可能的

    在结构化语言中,比较容易找到(例如,通过解析和计算C中的花括号)函数的开始或结束位置,因此应该插入函数的序言和尾声

    在汇编程序中,这是不可能的-标签不一定是函数的开始,“ret”不一定是结束

    最好的办法是为开场白和尾声构建自己的宏,并手动插入它们

    你问题中的一些微弱暗示让我认为你正在使用的汇编代码可能是由C编译器生成的——在这种情况下,通过分析发出的asm代码,你是否可以重新构造C函数边界,这实际上是可能的

    澄清后编辑:

    我不太明白为什么这需要在汇编程序中完成,为什么需要在编译后生成的.asm文件中完成-C可以很好地完成,并且(简单的)保护代码片段可以简单地由宏注入(可能使用内联汇编)。总而言之,如果你在原始资料中这样做,会更容易。而且,对于由编译器生成的asm源代码,您还需要访问C(或其他)源代码


    在另一条评论中,您说“他们正在修改二进制文件本身并添加保护。”-将某些内容插入二进制文件是一项相当复杂的任务-您正在将代码移动到更高的地址,需要首先找到该代码段的所有调用方,然后调整地址。甚至病毒程序员也不会这样做:)。它们用jsr指令替换现有代码,将其放入二进制文件末尾的“背包”中。我认为链接文章中的图片有点误导。

    如果校验和保护的意思是保护函数免受堆栈溢出攻击,那么这通常被称为堆栈金丝雀。这里有一个实现示例(针对C),您描述了一个任务,但没有提出任何问题。你需要回去找给你这个任务的人。并向他提出挑战,正如前面所说,这是一种对管理层来说可能听起来合理的特征。事实并非如此。问“你是什么意思”是你的工作,不是我们的。你的意思是当你使用
    -fstack-protector-strong
    时像gcc插入一样?只写和读一个哨兵值;它不会对任何内容进行校验和。你到底在做什么校验和/校验/哈希?@PeterCordes我在对代码的一部分,即指令进行校验和。我将遍历函数以进行保护,每次获取一条指令并将其(操作码)存储在寄存器中,然后在其上应用函数(XOR、ADD等)以获得值(键)。现在,如果有人篡改代码,值将与“key”不同。因此,我知道它被篡改了。问题是,我需要从用户那里获取要保护的函数的输入,然后执行脚本在适当的位置插入校验和保护。这就是我试图实现的文件。是的,要保护的代码是C代码。我对这个问题做了一些修改。你能看看吗?我对如何获取要保护的函数的输入(到我的shell脚本)有疑问?我在问题中提到了我试图实现的文件。他们正在修改二进制文件本身并添加保护。在汇编中这样做不是更容易吗?你能建议我应该使用什么样的混淆技术来防止我的保护模板被分解二进制文件的攻击者轻易识别吗?