这类加密保护方式属于整体程序集的加密保护.这个方法首要解决的问题就是 native code 和 .Net Code如何交互.这里介绍三种实现方式. Www^
1. C++/CLI 实现.
这个比较简单了,会C++/CLI一下子就能完成了.
Loader是由C++/CLI实现的.运行时通过解码程序集通过反射载入然后运行.
| void InvokeAssemblyResource() { try
|
2. 利用C#导出Com接口和native code交互.Loader由C#和native code两部分组成.
C#部分代码
中国
| public interface IInvokeAssembly { void LoadAndExecute(byte[] pBuf); }; public class CInvokeAssembly : IInvokeAssembly { public CInvokeAssembly() { } public void LoadAndExecute(byte[] pBuf) { try { Assembly asm = Assembly.Load(pBuf); asm.EntryPoint.Invoke(null,null); } catch(Exception ex) { MessageBox.Show(ex.Message); } } } |
这里导出的 IInvokeAssembly 接口,将在native code中使用.
Www^
native code 部分
Www_Chinaz_com
| void InvokeAssemblyResource() { IInvokeAssemblyPtr pInvoker; //COM Pointer to the .Net Interface if(FAILED(pInvoker.CreateInstance(CLSID_CInvokeAssembly))) HRSRC hRC = FindResource(NULL,MAKEINTRESOURCE(IDR_EMBEDDED_ASSEMBLY),"RT_EMBEDDED_ASSEMBLY"); Www.zhuye123.com SAFEARRAY* pSA = NULL; 站长.站 if(NULL !=(pSA = SafeArrayCreateVector(VT_UI1, 0, dwSize))) Www^ if(FAILED(SafeArrayAccessData(pSA,&pBuf))) memcpy(pBuf, hAsm, dwSize); 中.国.站长站 UnlockResource(hRes); 中国站长.站 SafeArrayUnaccessData(pSA); 中国站长.站 pInvoker->LoadAndExecute(pSA); //Invoke the Reflection to load and Execute our Byte[] 中国站长_站,为中文网站提供动力 if(pSA) SafeArrayDestroy(pSA); |
这里还有一个问题,loader是两部分.加密的程序集可以作为资源签入到native code loader中.但是C#部分怎么处理?一个比较隐蔽的方式是,在安装程序时将它安装到gac中. 中.国.