带有蹦床功能的 ASM 代码钩子/补丁

逆向工程 拆卸 C++ C 汇编
2021-06-10 03:35:22

我坚持制作(我学习的小自我任务)那件事: 在此处输入图片说明

基本上它应该类似于 Themida 或 VMProtect(进行突变、虚拟化等),但就我而言, 我想在指针之间获取 ASM 代码,对其进行混淆等,并将其写入某个 DLL。在原始应用程序中,我们有一个修补过的蹦床,由我们的“disasm 工具”功能生成......嗯,有什么例子吗?=)

也许保护软件代码或类似的东西不是一个好主意,我只是为了学习而这样做。我知道 ASM 指针在理论上是如何工作的。例如,我可以使用 Olly 手动完成所有这些操作,但是如何像 VMProtect、Enigma 或 Themida“编译器工具”那样以编程方式执行此操作?从来没有尝试过自己制作这样的东西。并没有找到任何例子,因为那是“神秘”级别的编程,而且在开源上也很难找到这种东西=(

所以问题:

1)如何在编译的应用程序中以编程方式搜索ASM指针?

2)如何以编程方式在 2 个 ASM 指针之间“剪切”和解除代码?

3)如何以编程方式将它们粘贴回(编辑后)?

2个回答

1)如果通过指针你的意思是“模式”或“水印”,我想到的第一件事就是BlackMagic(阅读FindPattern函数)

2)

  • 程序是具有特定结构(PE 文件格式)的文件,因此您必须将其作为数组读取,因为您要做的就是用范围替换字节
  • 在获得开始偏移量和结束偏移量(分别是“开始”和“结束”的地址)后,您可以反汇编它们之间的字节,例如可以使用DistormOlly disasm(这个可以重新组装您的代码)
  • 原始代码应该替换为类似的东西(不要忘记替换剩余的字节)
push offset dllName    
call LoadLibraryA    ; load the dll

push offset FunctionName     
push eax  
call GetProcAddress   ; obtain the address of the moved function

call/jmp eax ; call or jump to the moved function

3) 此时,反汇编的代码应该已经被混淆/加密了,并且由于它将被移动到另一个 dll 它应该在那里(在 dll 内)应该被编译回来,您可以选择手动组装它(在内存上)使用(例如)Olly disasm(您的程序应该手动生成一个需要大量工作的dll)或使用(例如)MASM32 编译它(到磁盘)

注意事项:

  • 您应该检查移动函数内的地址是否未在其他地方调用/引用
  • 如果存在重定位(即程序没有固定的映像库),则应在运行时更新被移动函数引用的地址(例如:由解密例程修补)
  • 您应该了解更多有关 PE 结构的信息,因为您必须在项目中处理很多问题。
  • 这是一些提示,而不是唯一的方法

答案是 LLVM。它允许加载程序集并对其进行操作。如果您拥有想要保护的程序的源代码,那就更容易了,因为您将能够通过 LLVM 编译它并拥有更高级别的代码操作。参见LLVM pass有一个在编译过程中修改二进制代码的例子