建议不要再浪费时间做这种无谓的实验了。
DllMain entry point (Windows)
When the system starts or terminates a process or thread, it calls the entry-point function for each loaded DLL using the first thread of the process. The system also calls the entry-point function for a DLL when it is loaded or unloaded using the LoadLibrary and FreeLibrary functions.
先不说被保护的Dll,就算是一个无壳Dll,设想下面这种最基本、普通的场景:
Dll里的函数需要一块内存,保存这个Dll生命期间要用的数据。通常为方便,内存的请求和释放放在DllMain里。
LoadLibrary时,系统调用一次DllMain,这里你可以进行一些初始化的工作,比如申请内存,保存指针/句柄。
FreeLibrary时,系统再次调用DllMain,这次你得到清理的机会,释放内存、关闭句柄等等。
显然,FreeLibrary后,好多东西都不存在了,还要去访问,必定出问题。
对一个加壳的Dll,从DllEntry到DllMain/OEP之间的壳代码几乎可以肯定会有动态内存分配,用于保存VM运行时的数据,或者一些校验、标志信息,甚至VM的代码。
所以VMP的运行异常;SE的也时好时坏,不稳定,这个方案就没有实际意义了。
就好比一个婚姻,如果注定是要离的,那干吗要结呢!既然结了(LoadLibrary),就不要离(FreeLibrary),这样 Everybody Happy!
如果既想“在一起”,又不愿意“结”,就只能造成“事实”:自己实现LoadLibrary的过程。
无非就是把PE文件,展开成PE映像,应该可以找到现成的源代码,稳定性没什么好耽心的,而且与Dll是否加壳毫无关系。