NATIVE应用程序详细之2 NATIVE应用程序的优势和劣势

来源:互联网 发布:java内存泄漏解决方法 编辑:程序博客网 时间:2024/06/04 08:28

上一部分我们简单了解了什么是native应用程序

现在来看看它的优势和劣势

优势:

(1)内存使用和大小:因为native应用程序并不需要加载90多个DLL到内存中去,因此其使用的内存是很小的

(2)速度 :native api比WIN32对应的函数要更快(通常会快很多),尽管实际上很多时间都被消耗在WIN32 API的封装上,这些包括修改、兼容性选项,和其他的代码部分,这些都会在执行真正的Native 调用前执行。如果你知道如何去做而且希望它运行得更快,native是一个很好的方法。同样的,因为不需要加载那90多个DLL,kernel32不需要到csrss和smss做lpc注册,因此启动也是非常快速和直接的

(3)熟悉程度和特性 我们知道,native 应用程序并没有古怪的入口点或者奇怪的hack,就象读命令行一样简单使用,事实上,在后面我们将提到,native应用程序和console程序一样启动与_main函数,通过一组简单的char*[]队列来接受命令行参数和环境变量,就象一个典型的win32 console程序一样,一些特性例如缓冲区溢出保护(/GS),Safe SEH(/SAFESEH),hotpathing(/HOTPATCH),以及其他的特性都被支持

(4)丰富:Native API非常丰富,它们提供的特性和功能性要远远超越WIN32函数所能达到的程度。这并不是说WIN32无法做到native api那样的更困难和更复杂的工作,而是win32太过简单而无法进行某些,举个例子,win32函数中,无法远程注入一个section到一个进程中,因为MapViewOfFileEx不提供进程句柄接口,而Native api则可以实现这个功能

(5)安全:当然,我们知道没有什么是“真正”安全的,但是Native应用程序有这样一个特点:人们对于native api不是十分熟悉,他们需要花费更多的时间才能理解你的代码,而更重要的是,无法使用一个用户模式的debugger来调试native 应用程序,只有SoftIce和使用内核模式远程连接的WinDbg才可以对其进行调试,这足以让那些废物脚本小子去死了,再说一遍,这并不意味着Native 应用程序是“不可调试的,安全的”。只是它更模糊更难被破解

(6).同内核模式的连接:因为native应用程序只使用native API,这些函数在内核模式仍然可用,这样,一个native程序只需少量修改就可修改为内核驱动,而WIN32程序则需要几乎重写所有代码

(7)运行在独立于子系统的环境中:因为native应用程序并不依赖与任何子系统,它运行于一个正常应用永远无法再次得到的环境中,比如autochk.exe,它运行与任何子系统加载之前,并负责显示'press any key to scan your hard disk"信息,并扫描你的硬盘是否有错误。在这个模式运行允许你显示信息到启动屏幕上,以及很多增强特性

(8)标准性.不象win32函数有一个正常版本,一个"Ex"版本,以及经常有一个"扩展其他功能"的版本,以及经常返回0,1,-1或一些随机的数值来表示成功,并且要使用SetLastError来设置返回错误。在native应用程序中,这些垃圾都是不存在的。所有的Native API都有统一的标准,所有都返回NTSTAUS(除非明确表示会返回一个特定的值),NTSTAUS是一个标准的错误码定义,而且使用它们时你也不需要考虑该死的Ex版本

 

以下是NATIVE 程序的一些劣势:

(1)和win32开发的差异较大:如果你以前从来没有进行过过native api或内核驱动的相关开发,你可能需要学习所有的API相关知识。当然,他们的名字是相似的,但是他们的标志经常是完全不同的。而且他们的返回值,很可能使你感到迷惑

(2).缺少文档 ,虽然所有的Rtl*函数都是有文档的,数百个其他的native api仍是无文档的

(3)缺少商业价值。虽然native程序如此美好,但是建议你不要在商业产品中使用Native api或着使用native应用程序,native api是可能改变的,虽然它们通常没有改变,但是他们很可能变得不再有用,不要拿你的客户的钱冒险

(4)没有GUI,及输入/输出接口:没有"native控制台程序",你无法简单地从用户那里接受到输入或显示些什么到屏幕上,因为那些接口都无法再使用(控制台API都是Win32 API)

原创粉丝点击