Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 您最喜欢的反调试技巧是什么?_Debugging_Assembly_X86_Reverse Engineering - Fatal编程技术网

Debugging 您最喜欢的反调试技巧是什么?

Debugging 您最喜欢的反调试技巧是什么?,debugging,assembly,x86,reverse-engineering,Debugging,Assembly,X86,Reverse Engineering,在我以前的雇主,我们使用了一个第三方组件,它基本上只是一个DLL和一个头文件。该特定模块在Win32中处理打印。然而,制造该组件的公司破产了,因此我无法报告我发现的错误 所以我决定自己修复这个bug并启动调试器。我惊讶地发现反调试代码几乎无处不在,通常的是debuggerpresent,但引起我注意的是: ; some twiddling with xor ; and data, result in eax jmp eax mov eax, 0x310fac

在我以前的雇主,我们使用了一个第三方组件,它基本上只是一个DLL和一个头文件。该特定模块在Win32中处理打印。然而,制造该组件的公司破产了,因此我无法报告我发现的错误

所以我决定自己修复这个bug并启动调试器。我惊讶地发现反调试代码几乎无处不在,通常的
是debuggerpresent
,但引起我注意的是:

    ; some twiddling with xor 
    ; and data, result in eax 
    jmp eax 
    mov eax, 0x310fac09 
    ; rest of code here 
乍一看,我只是跳过了被称为两次的例行程序,然后事情就变得一团糟。过了一会儿,我意识到比特旋转的结果总是一样的,即jmp eax总是直接跳入
mov eax,0x310fac09
指令。 我仔细分析了字节,它就是,
0f31
rdtsc
指令,用于测量DLL中某些调用之间的时间


因此,我向So提出的问题是:您最喜欢的反调试技巧是什么?

通过调试器删除程序集是一个有用的技巧。当然,把代码放回去要困难得多

我是许多RCE社区的成员,我也参与过黑客攻击和破解。从我的时代起,我就意识到这些脆弱的伎俩通常是不稳定的,而且是徒劳的。大多数通用的反调试技巧都是特定于操作系统的,根本不是“可移植的”

在前面的示例中,您可能正在使用内联汇编和
函数
\uu declspec
,在x64体系结构上编译时,MSVC不支持这两种功能。当然,仍然有办法实施上述伎俩,但任何人只要逆转足够长的时间,就可以在几分钟内发现并击败这一伎俩


因此,一般来说,我建议不要在使用
IsDebuggerPresent
API进行检测之外使用反调试技巧。相反,我建议您编写存根和/或虚拟机代码。我编写了自己的虚拟机代码,多年来一直在改进它,老实说,这是迄今为止我在保护代码方面做出的最好决定。

我赞同虚拟机的建议。我实现了一个mipsi模拟器,它(现在)可以执行用mipsel-elf-gcc生成的二进制文件。再加上代码/数据加密功能(AES或您选择的任何其他算法)、自模拟功能(因此您可以使用嵌套模拟器),您就拥有了相当好的代码模糊器


选择MIPS I的好处在于:1)它易于实现;2)我可以用C编写代码,在桌面上调试,完成后只需交叉编译就可以了。无需调试自定义操作码或手动为自定义VM编写代码。

我最喜欢的技巧是为晦涩难懂的微处理器编写简单的指令仿真器


复制保护和一些核心功能将为微处理器编译(GCC在这里是一个很大的帮助),并作为二进制blob链接到程序中

这背后的思想是,拷贝保护在普通x86代码中不存在,因此不能被反汇编。您也不能删除整个仿真器,因为这将从程序中删除核心功能

破解该程序的唯一机会是对微处理器仿真器的功能进行反向工程

我使用MIPS32进行仿真,因为它非常容易仿真(只需要500行简单的C代码)。为了让事情变得更加模糊,我没有使用原始的MIPS32操作码。相反,每个操作码都有自己的地址

复制保护的二进制文件看起来像垃圾数据


强烈推荐!用了6个多月才出现漏洞(这是一个游戏项目)。

最现代的模糊处理方法似乎是虚拟机

基本上,您可以获取目标代码的一部分,并将其转换为您自己的字节码格式。然后添加一个小型虚拟机来运行此代码。正确调试此代码的唯一方法是为VM的指令格式编写仿真器或反汇编程序。当然,你也需要考虑性能。太多的字节码会使程序比本机代码运行得慢

大多数老把戏现在都没用了:

  • Isdebuggerpresent:非常跛脚且易于修补
  • 其他调试器/断点检测
  • Ring0的东西:用户不喜欢安装驱动程序,你可能会破坏他们系统上的一些东西等等
  • 所有人都知道的其他琐碎的东西,或者使您的软件不稳定的东西。请记住,即使一个漏洞使您的程序不稳定,但它仍然有效,这种不稳定将归咎于您
如果你真的想自己编写VM解决方案(有好的程序出售),不要只使用一种指令格式。使其具有多态性,以便可以使代码的不同部分具有不同的格式。这样,您的所有代码都不会因为只编写一个仿真器/反汇编程序而被破坏。例如,一些人提供的MIPS解决方案似乎很容易被破坏,因为MIPS指令格式有很好的文档记录,像IDA这样的分析工具已经可以分解代码了


< /P> < P>在我看来,在一个貌似正统但实际上隐藏了一条真正的指令指令的中间跳跃是我的最爱。不管怎么说,它们对人类来说很容易被发现,但自动化工具经常会把它弄糟


同时,替换堆栈上的返回地址也会很浪费时间。

我更希望人们编写的软件是可靠的、可靠的,并且能够实现广告中所宣传的功能。他们还以合理的价格和合理的许可证出售它

我知道我已经浪费了太多的时间与供应商打交道,这些供应商拥有复杂的许可计划,只会给客户和供应商带来问题。我