我一直坚持要(做点小小的学习工作)做那个事情:


基本上应该是Themida或VMProtect之类的东西(进行突变,虚拟化等),但是就我而言,
我想在指针之间获取ASM代码,对其进行混淆处理,然后将其写入某些DLL。在原始应用程序上,
我们有一个由我们的“ disasm工具”功能生成的跳床……嗯,有什么例子可以做到吗? =)

也许保护软件代码或类似的东西不是一个好主意,我只是为了学习而已。我知道ASM指针在理论上是如何工作的。例如,我可以使用Olly手动完成所有操作,但是如何像VMProtect,Enigma或Themida一样通过编程方式做到这一点?从来没有尝试过自己做这样的事情。并没有找到任何示例,因为那是编程的“ arcane”级别,而且在开源== << />
也很难找到这样的东西: /> 1)如何在已编译的应用程序中以编程方式搜索ASM指针?

2)如何以编程方式在2个ASM指针之间“剪切”并破坏代码?

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

评论

这很难理解。

我不了解蹦床功能。但是我对与Easyhook挂钩几乎一无所知。链接:easyhook.github.io

检查rewolf开源虚拟器github.com/rwfpl/rewolf-x86-virtualizer

哦,谢谢,这正是我所需要的。找到了std :: vector > scanForMarkers(BYTE * data,DWORD length)和其他有用的东西。 ;)

@HappyDay:请在答案框中发布答案,不要将其添加到问题正文或评论中。但请确保它是一个实际的答案,而不仅仅是“看起来像它的东西”。

#1 楼

1)如果用指针表示“模式”或“水印”,我首先想到的是BlackMagic(阅读FindPattern函数)

2)


程序是具有特定结构(PE文件格式)的文件,因此您必须将其读取为数组,因为您要做的就是在获得起始偏移量和结束偏移量后用范围替换字节
(分别是“ Begin”和“ End”的地址),您可以反汇编它们之间的字节,例如可以使用Distorm或Olly 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结构的更多信息,因为您必须在项目中对其进行大量处理。
这是一些提示,而不是唯一的方法


#2 楼

答案是LLVM。它允许加载程序集并对其进行操作。如果您拥有要保护的程序源代码,那么它将更加容易,因为您将能够通过LLVM对其进行编译,并具有更高级别的代码操作。请参阅LLVM通过,那里有一个在编译期间修改二进制代码的示例