自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

蛛丝

编织隐秘的网,困住你我

  • 博客(51)
  • 收藏
  • 关注

翻译 汇编写驱动(三)——字符串问题的补充——string.mac说明部分的译文

我的上一篇文章,提到了masm32/macro/string.mac这个文件里的宏,但是没有说明使用方法,所以我直接把这个文件里的使用说明翻译一下。;; 文本宏的集合;; 作者: Four-F ([email protected]);; 最后更新2004年9月1日;; 欢迎您的改进、建议和修正;; 测试了与 windows.inc v.1.25e的兼容性STRINGA/STRINGW是内部宏。基本上,你不需要使用它们:::::::::::::::::::::::::::::::::::::::::::::::::

2011-03-25 10:13:00 2382 1

原创 汇编写驱动(二)——字符串的一些问题

<br />    刚开始学汇编写驱动时,最开始遇到的问题就是关于字符串的,因此和大家分享一下经验。<br />1.如何用汇编实现KdPrint  <br />    用C写驱动时,估计都比较喜欢用自定义的宏函数KdPrint来替代DbgPrint。用C的宏定义来很简单,但是用汇编的宏指令就要麻烦一点。<br />汇编版的KdPrint<br />KdPrint macro Format,ParamList:VARARG<br />   ifdef Release<br />      EXITM<br /

2011-03-24 17:37:00 1591

原创 汇编写驱动(一)——光速入门

用汇编写windows驱动非常简单,只要有汇编基础和用C写驱动的能力即可。有了这两样基础,我们距离用汇编写驱动,只剩下一层窗户纸,一戳就破。一、准备软件:Radasm        为了快速入门,好的IDE是降低入门难道的有效手段。Radasm是我最为钟爱的一款软件,第一次使用过它,我就果断地将masm32删除了。   RadASM是一款著名的WIN32汇编编辑器,精通win32汇编的人对它应该不会陌生。支持MASM、TASM等多种汇编编译器,提供优秀的IDE,自带一个资源编辑器和一个调试器(OD)。拥有较

2011-03-18 16:55:00 3580

原创 福岛核泄漏必然性的分析

      我作为一个核专业的专业,就给大家简单的说明一下,福岛核电站泄漏事故固然有天灾的缘故,但其背后隐藏着人为设计缺陷的必然性。      一、日本处于环太平洋火山带上,是一个地震高发国家。福岛核电站就位于地震带上。而我国核电站已充分考虑了地质结构的稳定性要求,同时考虑了海啸的影响。  二、福岛核电站在全部失去场内外电源的情况下,就会失去堆芯冷却的全部功能。而我国建设的压水堆核电站即使失去全部厂内外电源,也能通过自带的气动给水泵和蒸汽排放的形式维持对堆芯的冷却。  三、福岛核电站没有安全壳。虽然在200

2011-03-15 13:07:00 3273 5

原创 控制流迷惑——控制流整平

一、控制流整平的作用    学逆向的人都知道,if-else、while、for具有典型的跳转等结构,即使通过多层嵌套、拓展条件等方法,依然可以通过“切片技术”来判断。有了这些依据,就给程序分析带来很多便利。    正是这个原因,为了增加程序逆向的难度,我们得使得这些特征结构变得模糊,并且能让类似“切片技术”这样基于具体语义分析的方法失效,迫使逆向分析人员进行完整的抽象语义分析,斩断所谓的“捷径”。    控制流整平的策略是这样的,它把所有的典型控制流以及其衍生结构“统而为一”,各种控制流的区别只是语义方面

2011-02-24 12:38:00 2392

原创 复杂分支结构逆向

<br />一、           条件分支的逆向基础<br />(1)简单if-else<br />我们知道简单的if-else的跳转结构是这样的。<br />例如:<br />if(i1<x1)<br />     ……;<br />else<br />     ……;<br />在反汇编结果中我们会看到类似下面的结果<br /><br /><br />两点说明::<br />①jxx AAAAAAAA 这句由于false则跳转,因此还原为if代码时,要注意。<br />②jmp BBBBBBBB 这

2011-02-22 12:45:00 1367 1

原创 抗去除花指令(三)——去除检测

任何技术都有被攻破的一天,没有包打天下的方法。再强的花指令也是有可能被清除的,这时我们也要想办法应对。所以我们经常需要检测花指令是否被清除,加以应对。一、花指令被清除后的痕迹    我们来看一下,下面一段简单花指令被清除后的结果:代码:  jmp @F   byte 08eH@@:   ret清除后:二、检测        从上文我们可以看到,花指令被替换指令NOP,这样就不必重构代码,就能够使代码正常运行。显然,我们只要NOP就行了。举例:.386.model stdcall,flatoption cas

2011-02-19 09:23:00 2145

原创 抗去除花指令(二)——有创意的花指令

一、概述“jmp/call/ret+垃圾数据”这样的花指令已经是相当“老掉牙”了,OD的插件对付它们基本是“秒杀”,所以本文想说点“有点创意”的花指令,至少能对付OD的插件。二、创意的核心[2.1]花指令因何被发现“jmp/call/ret+垃圾数据”的方法之所以容易被检测,原因是“意图太明显”,具体说任何一种检测手段,都是基于以下两点:①检测跳转结构的固定形态特征,当然这不是绝对的,如果检测机制没能预见到这种形态特征,此点可以忽略,本文后边会提到一些这样的情况。②用可靠的方法直接证明,垃圾数据部分在任何情

2011-02-18 19:51:00 3680

原创 抗去除花指令(一)——花指令基础

<br />    入门知识,高手勿读<br />一、概述<br />花指令是对抗反汇编的有效手段之一,正常代码添加了花指令之后,可以破坏静态反汇编的过程,使反汇编的结果出现错误。错误的反汇编结果会造成破解者的分析工作大量增加,进而使之不能理解程序的结构和算法,也就很难破解程序,从而达到病毒或软件保护的目的。<br /> <br />二、花指令分类<br />[2.1]可执行式花指令<br />顾名思义,可执行式花指令指的是能够正常运行的但又不改变原始程序逻辑性的一组无用指令。这类花指令有如下特点:①可以正

2011-02-18 19:21:00 7124 9

原创 使用CloseHandle对抗调试器

      我最近调试程序才发觉,CloseHandle这个函数的一个怪异的行为。我突然想到可以利用这个行为来欺骗或者对抗调试器。    这个怪异的行为是这样的,调用CloseHandle释放一个无效句柄,如果进程在调试器之外,那么函数返回FALSE,而GetLastError得到ERROR_INVALID_HANDLE;但是如果进程在调试器内,那么系统将抛出异常C0000008H。一、首先说如何得到一个无效句柄呢?方法一:一个句柄释放多次次    这个方法看似没问题,但实际有很大的隐患。因为新创建的内核对

2010-12-30 14:54:00 2239 1

原创 你可能不了解的汇编(中)

1.ret结束程序和ExitProcess的区别可以试试写一个多线程的程序(例如使用mciSendCommand之类函数播放音频文件),然后在主线程中使用ret指令返回,如果其他线程没有结束的话就程序不会退出.如果某个线程使用ret指令返回,Windows会自动替它调用ExitThread函数,而如果这是进程的最后一个线程的话,ExitThread函数又会自动去调用ExitProcess函数,这样进程就终止了

2010-12-30 11:08:00 1202 1

原创 你可能不了解的汇编(上)

收集一些不太常用32位汇编知识,欢迎大家分享、指教。1.从PUSH开始谈新指令   你应该知道push、pushad、pushfd这三条指令,但是大部分人不知道还有pushd、pushw、pusha、pushf这四条指令;对应的还有popa、popf,但没有popd、popw。你不知道或不熟悉的指令还有很多很多,比如①xadd   交换并相加②bswap指令指定的32位寄存器的字节次序变反③④cmpxchg比较并交换⑤cmpxchg8八字节比较并交换.....2.模块伪指令  初学写32位汇编的大概都以为,

2010-12-12 20:11:00 6795 10

原创 微软没那么邪恶

此文收集了一些大家对微软的常见误解,并予以解释,本人并非受雇于利益相关团体,立场虽属主观,但绝无利益驱使误解1:windows源代码是非公开的,微软作为美国政府的看门狗,其中一定隐藏了不可告人的东西   首先,windows是半公开,微软在win98时代就陆续开始向各国政府,公开其源代码,但不向各国民众公开,政府可以派遣专家参与代码的交流,目前中国政府也已经在此范围内,有书为证。请参见《Windows操作系统原理》(第二版 陈向群著)误解2:Windows迟早会被Linux所淘汰   不知道那个网友处于义愤

2010-11-27 22:19:00 18053 247

原创 关于PE病毒编写的学习(十一)——空隙覆盖病毒的实现方法

这类病毒名字很多,选这个名字主要是它比较形象说明其感染方式,即将病毒代码分成多份,分别注入到程序各节由于对齐产生的空白中。1.核心——病毒描述表  将病毒代码分割成多份,分别注入到未知地址的区域内,却能完整运行。这看似神奇,其实实现方法却很简单———建立病毒分割描述表病毒分割描述表举例(汇编):Virus_Distribution struct;病毒片段描述符   Code_Base     dword  0;该病毒片段的起始地址   Code_Length  dword  0;该病毒片段的长度Virus_

2010-11-27 17:00:00 2020 3

原创 病毒败于我手(一)——病毒样本的存放和管理(2010年11月1日更新)

  巧妇难为无米之炊,学习击败病毒,得先有病毒样本。样本多了,就可能由于自己的误操作或管理的不恰当,会给自己和别人造成麻烦。因此,在这里说点自己的经验。1.去掉拓展名:存放时的病毒,应去掉其拓展名,防止由于手误使其双击启动。2.加密隐藏存储:好奇心谁都有,电脑总有借别人的时候,即使是无意间地拷贝、使用,也是不好的。3.千万不要使用U盘作存储介质:一方面,U盘这种东西,别人在不经你允许的情况下,借去暂时用用也无可厚非                                            另一方

2010-10-30 14:05:00 9382 46

原创 关于PE病毒编写的学习(十)——追加病毒的编写(下)

  原本这一篇应该和上一篇同时发,但是我的原来代码写得很烂,而且由于我的目标是编写一个“追加病毒”框架,代码又要具备良好的模块特征。这两天改来改去,已经头脑混乱了,所以还是先发文章把原来的代码挂上,有时间再改,我会配上说明。  另外提一句,我把一个bug写再AddSection这个函数里,很多教学码也故意写这个错误,这个错误本意是修改由于PE文件头的修改使“xx值”应适当变化,实际写入的是空位置,这个值不应该变化,这个画蛇添足的行为会导致被感染文件出现一个对齐问题的错误,使系统认为它不是一个有效文件。自己独

2010-10-30 13:22:00 2667 2

原创 关于PE病毒编写的学习(九)——追加病毒的编写(上)

  OK,兑现我的承诺,从本章开始讲述“追加病毒”的编写方法。我们将实现一个只弹出对话框的良性病毒,但是考虑到这个代码可能造成的危害,我会在感染模块中写入一个小Bug。不过,对于大家的学习是毫无影响的。  回到正题,先介绍一下“追加病毒”,在DOS时代中,这种病毒相当常见。由于.com文件的入口点是固定的,而且我们知道DOS平台程序可以随意使用中断,因此追加病毒只要将病毒代码追加到宿主文件尾,然后修改入口点代码成“jmp [病毒入口点]”,病毒执行完成后,再jmp到宿主程序。  到了win32平台下,这种方

2010-10-27 11:24:00 1820

原创 病毒败于我手(零)——前言

<br />  有感于杀毒软件普遍对病毒“治本不治标”的行为,痛恨它们所谓“病毒已清除”,但机器仍然卡的要命。目前杀毒软件最大的问题是,清除病毒文件,却并不专门治愈这种病毒已造成的损伤。<br />  因此,这个系列文章的目标是这样的,通过我的文章发表,来抛砖引玉,大家共同讨论,最终建立一个方案,它能够针对每一个病毒行为,自动产生针对性的治愈方案。<br />  这个过程将分成三个阶段:<br />  1、首先学习人工分析“病毒行为”的方法。<br /> <br />  2、学习用手工方法,治愈“病毒行为”

2010-10-27 10:22:00 1879 7

原创 关于PE病毒编写的学习(八)——定位API的N种方法(2010年10月25更新)

由于大部分的文件感染型病毒框架都不可以像“前置病毒”那样拥有自己的输入表,因此需要自行定位API说一千道一万,想要定位API,大方向是要定位Kernel32.dll的基地址。总结所以这些方法,可以分为是四个小方向,它们又产生很多变种。一、定位kernel32.dll基地址的方法(1)硬编码方式    由于kernel32.dll的基地址在相同版本windows下,基本上它的位置是固定的。这种方法在早期的PE病毒中很常见,现在已经很少使用了。(2)利用程序初始化时,首先寄存器或堆栈中保留的kernel32.d

2010-10-08 22:28:00 2145 1

原创 关于PE病毒编写的学习(六)——关于PE文件结构操作的程序编写

  对PE文件结构的各个值定义和作用,这里不提了,网上资源很多,百度一下就好了。所以,本章只说一下,作为代码编写者对PE文件结构操作的方法和技巧。还是通过改进代码,来体会一下吧。  你应该记得前面的BOOL IsPEFile(HANDLE hFIle) 这个函数吧,它的作用是判断文件是否为PE格式文件。它把文件句柄作为参数,虽然许多函数需要文件句柄这个参数,但是作为对PE文件结构操作的函数,这样做是不恰当的,因为如果这样做就要频繁的使用SetFilePointer()、ReadFile()、WriteFil

2010-10-06 22:10:00 1976

原创 关于PE病毒编写的学习(五)——病毒如何做标记和记录信息

1.做标记和记录信息的区别   做标记:它是为了其它病毒识别自己,而在固定或符合一定规则的位置上记录的符号信息。   记录信息:它是为了病毒本身正确运行,而存储的某些信息,比如解密程序的随机密匙、所感染宿主文件的某些信息2.那些地方可以做标记和记录信息   (1)可标记的位置       1/程序入口区域和尾部区域;并非一定是开头和结尾,比如              VirusStart:                    ...                    jmp $+3         

2010-09-20 22:38:00 1550

原创 关于PE病毒编写的学习(四)——关于历遍磁盘的讨论

在上一章中的“前置病毒”中,由于它只是一个测试病毒,因此该病毒只是搜索病毒文件所在文件夹的exe文件。显然,为了让它具有更好传染性,能够历遍整个磁盘或某些重要文件夹的特性,是十分重要的。回到正题,让我们来改进原来的代码首先,在原来的代码中,只要结尾是“.exe”就判断为"可执行程序",这种方法在大多数情况下是正确的,但是如果程序经过压缩或加密后,某些行为会出错。因此,更加详细的文件类型检查很多时是必要的,参考代码如下:BOOL IsExeFile(HANDLE hFile){ IMAGE_DOS_HEADE

2010-09-19 13:20:00 1835 7

原创 关于PE病毒编写的学习(三)

历史上,在windows95发布后,用高级语言编写的外壳病毒,经过简单地改造编译,就能从DOS平台迁移到windows平台上。并且在这当中很多“前置病毒”,仅仅需要重新编译。另外之所以用“前置病毒”作为第一分析样本,理由如下:1.它具有基本病毒功能模块,这些模块在文件型病毒中是通用的2.其框架结构,所需病毒技巧极少3.拓展方便,通过不断地加入新功能,循序渐进的学习各种病毒技巧4.加载新模块方便,适合测试其它病毒的某些功能模块那么何谓“前置病毒”?DWORD dwVirusSize=40960;HANDLE

2010-09-10 20:18:00 2411 1

转载 代码逆向(八)——除法与取模运算的识别与优化原理

<br />1.9.1、除法与倒数相乘<br />    何为倒数相乘?很简单,编译器世界中倒数相乘的中心思想其实就是用乘法来代替除法运算。它的原理很简单,就是将被除数乘以除数的倒数,其公式为x/y = x*(1/y),我们拿10/2作为例子,我可以得出以下推论:<br /><br />由 公式x/y = x*(1/y) 可得 10/2 = 10*(1/2) = 10*0.5<br /><br />    编译器也正是由这个公式才得以将除法转换为除法,但是编译器为什么要这样做呢?原因同样很简单,因为乘法的运

2010-09-07 12:53:00 5883 2

原创 关于PE病毒编写的学习(二)

这篇说一下,PE病毒需要那些技术积累,以及这些技术的学习方法和重点是什么。1.先说汇编吧      其实我说的汇编关于两个方面:汇编语言设计 和 微机原理      汇编语言设计,它也是两方面: 常规教材讲的 和 病毒的技巧      常规教材上讲的基本都得学会,最基本的8086/8088肯定都得会,各种书籍视频很丰富,学起来不难。80x86也是必须得学,建议看一下《80x86汇编语言程序设计》(杨季文著,清华大学出版),这本书的后半本写的很精彩,至于罗云杉的那本,明白意思就行了,因为使用Radasm,简化

2010-08-31 13:40:00 3394 3

原创 关于PE病毒编写的学习

首先声明,因为害怕被封号,我肯定不会展示正确完整病毒代码,但是会介绍可行的学习方法。网上有很多关于介绍PE病毒编写的帖子,但基本上都是分析源码FunLove和《计算机病毒分析与对抗》中PE病毒的代码翻版。事实上这两个代码是用于原理展示,前者根本通不过编译,后者编译后并不能正确运行,虽然有部分帖子对其做了修改,受到正统汇编教材代码的影响,导致其修改方法是错误的。关于病毒编写充满了各种各样的迷信和谬论,因此在学习的过程中,我走了不少弯路,让我来一一说明:误区1:PE病毒一定要用汇编来写,其生成文件小,效率高,病

2010-08-30 22:32:00 3764 4

原创 ASCII压缩算法实现

<br />#include <stdio.h><br />#include<string.h><br />#include<stdlib.h><br />//压缩函数,采用开解循环提高效率<br />void ASCII_Compress(char *dest,char *src)<br />{ <br />     dest[0]=src[0];<br />     dest[1]=src[1];<br />     dest[2]=src[2];<br />     dest[3]=src[3];<b

2010-08-25 21:24:00 2733 2

原创 better c/c++ code(三)——开解循环

当循环次数可以预知时,若是这时要求运行效率时,可以采用开解循环。void ASCII_Compress(char *dest,char *src)     void ASCII_Compress(char *dest,char *src){                                                                        {     dest[0]=src[0];                                           

2010-08-21 20:13:00 1406 4

原创 数据逆向(四)——结构体识别

<br />结构体<br />       struct是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。它的实现方法上和数组是一样的,即每一个成员的访问是直接寻址方式。唯一的区别是,为了提高访问效率,成员无论类型为何,编译器将它们按照4字节对齐。<br /> <br />eg:struct test<br />       {<br />            char str;<br />            int i;<br />        };<br />       test

2010-08-12 20:13:00 2214 2

转载 代码逆向(七)——乘法的识别与优化原理

<br /> 那么如果让我们来做乘法的优化,我们会怎么做呢?很显然位移是必须要被利用的,但是除此之外微软的编译器还利用了lea指令,但是乘法的优化是非常多变的,本小节的目的是让各位读者再看见某一块指令时知道“哦!这是乘法...”就可以了。<br />    我们先看看简单的位移优化,经过笔者的总结,当乘数为2的次方,且大于8时编译器才会使用此优化,让我们看看优化前与优化后的效果:<br />源码:<br />      int nNum = 16;<br />  printf("%p",nNum*argc)

2010-08-12 10:21:00 1480

转载 代码逆向(六)——加法与减法的识别与优化原理

<br />加法的优化相对来说比较简单,只有3种优化方案,下面我们就以一个简单的例子来说明这三个问题,先看源码:<br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br />  int nNum, nA = 8;<br />  nNum = argc + nA;      // 形式1<br />  printf("%d/r/n",nNum);<br />  nNum = argc + 9;       // 形式2<br />  printf("

2010-08-12 10:18:00 1287

转载 代码逆向(五)——switch-case识别技巧提高

<br />我们前面为各位读者分别介绍了转成if-esle与利用跳转表两种优化模式,但是在最后我隐含着提出了一个问题,既如果我们的switch-case分支两个数之差大于50甚至更多的时候,那么我们此时是否仍需要利用跳转表来解决问题呢?很显然我们不能这样做,假如我们遇到如下这段代码:<br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br />    switch (argc)<br />    {<br />    case 0:<br />  

2010-08-12 10:16:00 3553

转载 代码逆向(四)——switch-case识别技巧初探

<br /><br />    我们先看一段代码:<br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br />    int nNum = 2;<br />    switch (nNum)<br />    {<br />    case 0:<br />        printf("nNum=0");<br />        break;<br />    case 1:<br />        printf("nNum=1");<br

2010-08-12 10:13:00 2078

转载 代码逆向(三)——循环分支的识别技巧

<br />“嘿!为什么要先学这里,不应该是for循环吗?”<br />    相信很多读者都会产生以上疑问,要的就是这种效果!就让我们带着这个疑问开始这一节的学习,先看源码:<br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br />    int nNum = 26;<br />    printf("Mom! I can sing my ABC!/r/n");<br /><br />    // 听!小Baby开始唱ABC了……<br />

2010-08-12 10:11:00 1193

转载 代码逆向(二)——if-else分支的识别技巧

<br />if-else分支几乎是所有人学习C语言后第一个接触的知识点,那么我们学习逆向理所当然也应该从这里开始了。其实关于if-else分支我们在上一节已经接触过了,这一节我们将详细的探讨有关于if-else分支的识别与编译器可能使用的优化方案。<br /><br />     在学习逆向的时候,我们要始终记住我们是在与编译器打交道,其次也要注重总结前辈们的经验,我个人大致将if-else分支的逆向分为4种状态,下面我将为大家一一讲解。<br /><br />1.3.1、以常量为判断条件的简单if-el

2010-08-12 09:50:00 2281

转载 代码逆向(一)——寻找main函数入口

<br />逆向的第一步是什么?这要问你学习C语言的第一步是什么,很自然的,逆向的第一步当然也是大名鼎鼎“HelloWorld!”了。但是也不要因此就误认为这一节会很简单,如果你是第一次接触逆向的话,那么这一节还是有些难度的。<br /><br />      好的,让我们先写一个世界上最出名的程序:<br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br />    printf("Hello World!/r/n");<br />    ret

2010-08-12 09:23:00 12865 6

原创 数据逆向(三)——识别字符串与数组

字符串    在C语言中,字符串是由字符组成,单字符不是字符串,至少有两个字符组成,且结尾字符是'/0'。    例如:"ABCD" 内存中实际储存结构是 41H 42H 43H 44H 00H    字符串的寻址,依靠首字节进行寄存器相对寻址方式:    例如:访问"ABCD"中的第二字节,byte ptr [ebx+1]    正是因为字符串的首字节索引的寻址方式,因此字符串往往要与指针配合。在C语言中常见的,    例如:char *str=“ABCD”;//mov [xxxx],offset str

2010-08-11 13:24:00 1103

原创 数据逆向(二)——区分常量、变量、指针

         做数据分析是这是最先应该区分数据是常量、变量,还是指针。      作为二进制数据本身不会标记自己是什么,但是编译器将全局变量、静态变量和常量统一储存在一起,因为它们的实现方式是一样的,只是全局变量

2010-08-10 17:33:00 1407

原创 数据逆向(一)——开篇

<br />       许多人将软件逆向工程看做代码逆向工程,然而软件被看做是“软件=代码+数据”。那么对等的就应存在“数据逆向工程”,虽然数据逆向工程与代码逆向工程有交叉部分,但是它们各有侧重。代码逆向工程主要利用反汇编分析代码的执行流程。数据逆向工程重点在于数据结构和数据内容。<br />       二进制文件的数据可以逆向,却不可能反汇编,因为数据连续的静静地躺在栈区和数据段,但为了分析数据,我们又不得不利用代码反汇编,通过代码意图推理出数据结构。<br /> <br />分析方法<br />  

2010-08-10 17:24:00 2742

转载 C++实现机制(三)——虚函数表

<br />      C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 <br /> <br />      虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来

2010-08-09 19:20:00 1260 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除