近期在搞一个给c#软件的加壳的工具,实际上就是用c++给c#裹上一层,没有什么技术含量,忽悠一下初级破解者,自己用,找点儿安慰罢了哦。
只要思路是,把c#的exe A.exe,加密一下,作为 c++ B.exe的资源文件,用户运行B.exe以后,B从资源文件里面读出A,解密,用户Native引导 .net的程序运行。
具体方法见 (采用Native 引导方式的.Net加密保护http://www.chinaz.com/program/2008/0208/22778_2.shtml)
程序实现以后调试了几个demo的exe,可以正常运行,但是遇到我真正要保护的那个 exe,就报出异常来了。ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment ,因为我的程序里面使用了webbrowser,而webbrowser 只能在STAThread 中运行,本来的程序运行是没有问题的,因为我确实是在main函数上加了STAThread这个属性的,猜想这个属性就是给.net loader用的,而自己写的这个loader 没有去处理这个属性,所以程序不是以STAThread运行了。几经周折,终于找到了在 C++中设置 STAThread 的方法:
MTA调用 CoInitializeEx(NULL, COINIT_MULTITHREADED)
STA 调用CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)
调用CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)要在CorBindToRuntimeEx执行前,要不然设置不会成功。