我们都知道冲击波发现OEP的原理是,利用一些编程语言编译的程序的开始的一段代码是相对固定的,其中包括了GetCommandLineA、GetModuleHandle、GetVersion这几个函数的调用,这样在这几个函数进行拦截,通过对比拦截后的地址附近的代码特征可以发现OEP。
但是目前的壳通过把这些函数的结果提前在壳中取出来,当程序调用这些函数时,不再通过API调用这些函数,这样避开了拦载这些函数得到OEP的方法。
通过比较壳隐藏的这些函数,可以发现象GetCommandLineA、GetEnvironmentStringsW这样的函数,返回的是一个指针,在程序中会对这个指针指向的内容进行读,如果拦截对这些函数的调用,返回一个无效指针,这样当程序读数据时,会发生异常,这样异常地址就在程序OEP的附近了。
当然如果壳在提前在调用这些API时加个防范(实际试探一下地址是否可读),那么这个想法也没有用了。
瞎侃一下了。走人。。