网站首页 | 我的主页 | 讨论交流 | 所有用户 | 联系合作
登录 | 注册 | 在线情况 | 搜索
百度通告:欢迎您的光临
  您当前的位置:首页.NET编程 → 详细文章
采用Native 引导方式的.Net加密保护
2
收藏它
绝妙女王    在2008-4-2 3:18:00 发布说:
[ 角色: 注册用户 / 等级:旅长 / 发主题数:2049 / 积分:6167 / 经验值:4101 ] [ 加为好友 | 发送信息 ]

这类加密保护方式属于整体程序集的加密保护.这个方法首要解决的问题就是 native code 和 .Net Code如何交互.这里介绍三种实现方式. Www^

1. C++/CLI 实现.
这个比较简单了,会C++/CLI一下子就能完成了.
Loader是由C++/CLI实现的.运行时通过解码程序集通过反射载入然后运行.

void InvokeAssemblyResource()
{

try
{
byte[] pBuf = GetDecryptedResource();
Assembly^ asm = Assembly::Load(pBuf);
asm->EntryPoint->Invoke(nullptr,nullptr);
}
catch(Exception^ ex)
{
MessageBox::Show(ex->Message);
} 站长.站


}

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__com

void InvokeAssemblyResource()
{
IInvokeAssemblyPtr pInvoker; //COM Pointer to the .Net Interface

if(FAILED(pInvoker.CreateInstance(CLSID_CInvokeAssembly)))
{
MessageBox(NULL,_T("Unable to Create Invoke Assembly Object !!"),_T("Error"),MB_OK|MB_ICONERROR);
return;
}

HRSRC hRC = FindResource(NULL,MAKEINTRESOURCE(IDR_EMBEDDED_ASSEMBLY),"RT_EMBEDDED_ASSEMBLY");
HGLOBAL hRes = LoadResource(NULL,hRC);
DWORD dwSize = SizeofResource(NULL,hRC);

SAFEARRAY* pSA = NULL; 站长.站

if(NULL !=(pSA = SafeArrayCreateVector(VT_UI1, 0, dwSize)))
{
LPVOID pBuf = NULL;

Www^

if(FAILED(SafeArrayAccessData(pSA,&pBuf)))
MessageBox(NULL,_T("Unable to Access SafeArray Data"), _T("Error"),MB_OK|MB_ICONERROR);
else
{
LPVOID hAsm = LockResource(hRes);

memcpy(pBuf, hAsm, dwSize);

UnlockResource(hRes);

SafeArrayUnaccessData(pSA);
}

pInvoker->LoadAndExecute(pSA); //Invoke the Reflection to load and Execute our Byte[]
}
else
MessageBox(NULL,_T("Unable to Allocate Memory"),_T("Memory Allocate Error"),MB_OK|MB_ICONERROR);

中国站长_站,为中文网站提供动力

if(pSA) SafeArrayDestroy(pSA);
}

Www~~com

这里还有一个问题,loader是两部分.加密的程序集可以作为资源签入到native code loader中.但是C#部分怎么处理?一个比较隐蔽的方式是,在安装程序时将它安装到gac中. 中.国.

共2页: 上一页 1 [2] 下一页

哪些人投了票
 

发表评论
    
 
  分享这篇文章...
复制这个链接发送给朋友>
70个读过此条>>
将该文章加入收藏夹
  你可能对下面文章也感兴趣...
 相关图片视频
Powered by baidutong 苏ICP备08014821号
本站内容部分来自网络,如有异议,请速联系解决,QQ:610826315 QQ讨论群:40684175
Copyright © 2008-2009 baidutong.com All rights reserved.