打包器问题研究及解决方案:Justin技术解析
1. Justin的工作机制
Justin在处理二进制文件时,会对堆中的页面进行跟踪,即便堆在不断增长也能持续追踪。当文件被映射到进程的地址空间时,映射区域同样会被跟踪。
在某些情况下,解包器会将输出存于文件中,随后从该文件生成一个新进程。此时,Justin不会检测到执行异常,因为生成的代码是通过进程创建机制而非跳转指令调用的。不过,标准的AV扫描器在该解包后的二进制文件启动时能够对其进行检测。
有些打包器在重新创建嵌入式二进制文件后,会分叉出一个新进程,并在新进程中跳转到嵌入式二进制文件。由于进程的页面状态跟踪并不一定会传播到其创建的所有其他进程,这种逃避技术有一定效果。但Justin通过跟踪进程及其所有子进程的页面保护状态,能够有效应对这种情况。
部分解包器包含反模拟技术,试图判断自身是否在模拟器中运行或被监控。Justin对页面保护属性的修改方式可能与这些解包器的意图不同,有时会触发其反模拟技术,导致程序终止。例如,一个解包器通过传递一个本应可写但被Justin标记为不可写的缓冲区作为系统调用参数来检测页面是否可写。当内核尝试写入该缓冲区时,会发生内核级保护异常,程序终止。Justin无法处理这种内核级异常,因为它不会传递到用户级别。为解决此问题,Justin会拦截该内核级保护异常,适当修改页面保护属性以允许程序继续运行,并在系统调用返回前将属性改回。
当Justin检测到解包结束时,会将控制转移指令的目标地址视为嵌入式二进制文件的入口点。然而,一些打包器会通过用跳转指令(如Y)替换主入口点的前几条指令来混淆原始入口点,跳转指令指向一段单独的代码,其中包含原始入口点指令和跳转回Y之后指令
超级会员免费看
订阅专栏 解锁全文
72

被折叠的 条评论
为什么被折叠?



