我认为当封隔器从不同的部分运行时,很容易找到 OEP。有很多技巧,例如运行跟踪直到您遇到代码段,或者中断对 IAT 的写入,并在最后一次写入 IAT 后在代码段上放置一个 bp。
但是在原始代码代码段中运行的打包程序代码呢?有什么提示和技巧可以找到 OEP,因为打包程序从同一部分运行,并跳转到同一部分的 OEP?
我认为当封隔器从不同的部分运行时,很容易找到 OEP。有很多技巧,例如运行跟踪直到您遇到代码段,或者中断对 IAT 的写入,并在最后一次写入 IAT 后在代码段上放置一个 bp。
但是在原始代码代码段中运行的打包程序代码呢?有什么提示和技巧可以找到 OEP,因为打包程序从同一部分运行,并跳转到同一部分的 OEP?
通常寻找寄存器清除(pushad/popad)然后跳转。在免疫中使用诸如 mona.py 之类的东西,您可以扫描进程的地址空间以查找类似的指令序列。请记住,这些东西是特定于打包机的,因此它可能不适用于所有这些。
您还可以使用某种 DBI 或内存监控工具在该部分的内存停止修改时(当程序完成解包时)中断和转储。我以前使用英特尔的 PIN 做过类似的事情。
您可以在LoadLibrary和GetProcAddress API 函数上放置断点。这是一个很好的方法,因为大多数打包程序使用这些函数来加载所需的库并修复导入表。根据我的个人经验,导入修复主要在解包过程的最后完成。
在您确定导入已修复后,可能会有一个小的解密例程来解密 OEP 并跳转到它。但是,正如上面的答案中提到的,这是特定于打包程序的,它可能不适用于所有人。