2010年2月24日星期三

IssueVision 学习 5/n 使用非托管代码

在Issuevison中,保存在本地的DataSet中的内容,使用了非托管代码DPAPI加密用户资料。这两个函数存在于Crypt32.dll库中,是CryptAPI的一部分。对于非托管的代码,.net中使用的方法如下:

  平台调用依赖于元数据在运行时查找导出的函数并封送其参数。下图显示了这一过程。对非托管 DLL 函数的“平台调用”调用过程



当“平台调用”调用非托管函数时,它将依次执行以下操作: 1. 查找包含该函数的 DLL。2. 将该 DLL 加载到内存中。3. 查找函数在内存中的地址并将其参数推到堆栈上,以封送所需的数据。4. 将控制权转移给非托管函数。平台调用会向托管调用方引发由非托管函数生成的异常。使用非托管DLL代码的步骤:1. 确定函数的名称和函数所在的DLL的名称。例如,如果指定 User32.dll 中的 MessageBox 函数,需要标识该函数 (MessageBox) 及其位置(User32.dll、User32 或 user32)。2. 创建用于容纳 DLL 函数的类。在托管代码中创建要使用的非托管函数的原型。 例如声明非托管MessageBox的函数原型如下:


public class Win32 {

     [DllImport("user32.dll", CharSet=CharSet.Auto)]    

     public static extern int MessageBox(int hWnd, String text,                       String caption, uint type);

 } 

3. 使用非托管代码

public class HelloWorld {

    public static void Main() {

        Win32.MessageBox(0, "Hello World", "Platform Invoke Sample", 0);   

 }


   Issuevison中使用非托管代码DPAPI,加密用户资料。该该接口一共有两个函数,他们提供了系统级的数据保护服务。这两个函数存在于Crypt32.dll库中,是CryptAPI的一部分,但使用起来要比其他的CryptAPI函数简单得多。DPAPI和系统帐户联系仍然十分紧密,他会自动使用当前用户的系统登录口令作为加解密的口令,这样一来同一台机器的所有程序都可以解密其他程序加密的数据。为了防止这一点,函数提供了pOptionalEntropy参数,使我们有机会使用自己的口令。如果提供了pOptionalEntropy参数,DPAPI将使用当前用户系统登录口令和我们提供的额外保护口令的组合进行加解密操作。如果你不想使用额外口令保护,则可设置该参数为NULL。因为DPAPI使用用户帐户联系的,所以一台机器上加密的数据,一般不能在另一台机器上解密

发表评论