当前位置:首页 > 开发教程 > .net教程 >

键入与迁移安全的代码验证,64位操作系统

时间:2016-06-02 16:06 来源:互联网 作者:源码搜藏 收藏

在安全的代码,并从32位到64位与案例研究.NET应用程序的迁移研究。 下载Pointer1.zip - 30 KB 定义 从[2]我们已经定义如下: 托管代码 是简单的码,提供足够的信息,让.NET公共语言运行时(CLR)提供一套核心服务,包括: 代码自我介绍,并通过数据的元数据 在安全的代码,并从32位到64位与案例研究.NET应用程序的迁移研究。
  • 下载Pointer1.zip - 30 KB

定义

从[2]我们已经定义如下:

托管代码是简单的“码”,提供足够的信息,让.NET公共语言运行时(CLR)提供一套核心服务,包括:

  1. 代码自我介绍,并通过数据的元数据
  2. 堆栈行走
  3. 安全
  4. 垃圾收集
  5. 即时编译

更多细节可以在可见[2]

安全的代码只使用管理的数据-code,也没有无法核实数据类型或不支持的数据类型转换/强制操作(即非歧视工会或结构/接口指针)。C#,Visual Basic .NET中,并使用/ clr编译的Visual C ++代码:安全产生安全的代码。

不安全的代码被允许进行这样的底层操作的声明和对工作的指针,指针和整型之间执行转换,并采取变量的地址-code。这样的操作允许与底层操作系统交互,访问内存映射设备,或实现一个时间关键算法。本机代码是不安全的。

背景

如果.NET应用程序是100%安全的代码,很容易让你迁移.NET应用程序的32位机和64位系统上运行。Visual Studio内部的2015年,你可以编译它通过在项目属性选项卡设置目标值为anycpu。[6]

100%的托管代码是一个大问题。这是很难保持代码100%的托管代码。

在下列情况下,我们计划使用PEVerify.exe来验证它们是否安全的代码。

PEVerify.exe工具

PEVerify.exe [10]是确定一个工具,编译生成的MSIL代码和相关的元数据类型满足安全要求是否。我们将使用这个工具来测试这里的例子类型安全的烦躁。

测试所有下列情况下,我们使用PEVerify格式为:peverify / MD / IL文件名.exe

案例分析

不重新发明轮子,我使用斯科特Hanselman的[4]的例子来验证类型安全使用指针类型。

using System;
using System.Runtime.InteropServices;
 
namespace TestGetSystemInfo
{
    public class WinApi
    {
        [DllImport("kernel32.dll")]
        public static extern void GetSystemInfo([MarshalAs(UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);
 
        [StructLayout(LayoutKind.Sequential)]
        public struct SYSTEM_INFO
        {
            internal _PROCESSOR_INFO_UNION uProcessorInfo;
            public uint dwPageSize;
            public IntPtr lpMinimumApplicationAddress;
            
            //test int type causes problem on 64-bit OS
            //after change to IntPtr everything is good
            public int lpMaximumApplicationAddress;
            
            public IntPtr dwActiveProcessorMask;
            public uint dwNumberOfProcessors;
            public uint dwProcessorType;
            public uint dwAllocationGranularity;
            public ushort dwProcessorLevel;
            public ushort dwProcessorRevision;
        }
 
        [StructLayout(LayoutKind.Explicit)]
        public struct _PROCESSOR_INFO_UNION
        {
            [FieldOffset(0)]
            internal uint dwOemId;
            [FieldOffset(0)]
            internal ushort wProcessorArchitecture;
            [FieldOffset(2)]
            internal ushort wReserved;
        }
    }
 
    public class Program
    {
        public static void Main(string[] args)
        {
            WinApi.SYSTEM_INFO sysinfo = new WinApi.SYSTEM_INFO();
            WinApi.GetSystemInfo(ref sysinfo);
            Console.WriteLine("dwProcessorType ={0}", sysinfo.dwProcessorType.ToString());
            Console.WriteLine("dwPageSize      ={0}", sysinfo.dwPageSize.ToString());
            Console.WriteLine("lpMaximumApplicationAddress ={0}", sysinfo.lpMaximumApplicationAddress.ToString());
        }
    }
}

测试结果如下:

  1. 当语句是公众诠释lpMaximumApplicationAddress; 编译它瞄准32位。使用PEVerify其结果是“在所有pointer1.exe类和方法验证”。这意味着类型安全的。当在32位上运行,运行状况良好。
  2. 当语句是公众诠释lpMaximumApplicationAddress; 编译它瞄准64位。使用PEVerify其结果是“在所有pointer1.exe类和方法验证”。这意味着类型安全的。当在64位上运行,对lpMaximumApplicationAddress的价值得到的问题。

  3. 当语句是公众的IntPtr lpMaximumApplicationAddress; 编译它瞄准32位。使用PEVerify其结果是“在所有pointer1.exe类和方法验证”。这意味着输入safe.When在32位上运行,效果很好。

  4. 当语句是公众的IntPtr lpMaximumApplicationAddress; 编译它瞄准64位。使用PEVerify其结果是“在所有pointer1.exe类和方法验证”。这意味着类型安全的。当在64位上运行,效果很好。

  5. 当语句是公众的IntPtr lpMaximumApplicationAddress; 编译它的目标值为anycpu。使用PEVerify其结果是“在所有pointer1.exe类和方法验证”。这意味着类型安全的。当两个32位和64位操作系统上运行它,一切运作良好。

IntPtr的类型

从[7]我们知道的IntPtr是一个特定于平台的类型来表示一个指针或句柄。

一个更明确的说法是[6]:IntPtr的是“本机(特定于平台)大小的整数。” 它的内部表示为void *,但公开为整数。每当你需要存储一个非托管指针,并且不希望使用不安全的代码,你可以使用它。IntPtr.Zero实际上是NULL(空指针)。

兴趣点

虽然所有这些sceanarios的,PEVerify.exe结果表明他们是类型安全组件,但我们仍然看到问题,运行这些可执行文件时。因此,迁移从32位到64位我们的.NET应用程序,我们需要回顾源代码来解决这些整数指针。我们不能完全依赖于PEVerify.exe。


.net教程阅读排行

最新文章