欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

Linux/Unix平台可执行文件格式分析

时间:2023-04-24 08:31:12 其他范文 收藏本文 下载本文

下面是小编帮大家整理的Linux/Unix平台可执行文件格式分析,本文共7篇,希望对大家的学习与工作有所帮助。

Linux/Unix平台可执行文件格式分析

篇1:自适应分析平台:Hadapt

Hadapt 是个自适应分析平台,为 Apache Hadoop 开源项目带来了 SQL 实现,Hadoop 非常健壮,并且可伸缩。所以通过其合并了关联数据存储的混合存储层,Hadapt 允许进行基于 SQL 大数据集的交互分析,

通过 Hadapt 交互式的查询;可以自定义分析的 Hadapt Development Kit? (HDK) 和 Tableau 软件集成,Hadapt 2.0 成为了 Hadoop 工业上第一个交互式应用程序。

项目主页:www.open-open.com/lib/view/home/1394439578786

篇2:高质量外链平台分析

我们常用的外链平台主要有:论坛、分类信息网、问答平台、软文投稿等等,下面就逐一分析一下这些获取高质量外链的方法,

首先说一下论坛发外链。网站外链全部来源于论坛,而且外链内容页都是一些很老套的东西,被了很多遍的东西,这样的外链不仅算不上高质量的外链,往往还是导致网站被k或者降权,既然很多论坛都给我们提供很好的做外链途径,我们就应该好好的利用这些平台多做一些高质量的外链,给网站留下一个高权重的外部链接。

在分类信息网上面发外链往往原创性更高,外链的质量得到了保证,但是成功率较低,需要站长们不断的去尝试,发掘一些容易带连接的网站和相对应的模块。

问答类平台:这种平台的特点具有权重高、流量大的特点,链接加上去之后不单单是一条高质量的外链,还能够通过这条链接给网站带来大量流量,可以说是一箭双雕之计,最吸引眼球的就是百度知道,想当初多少人每天在知道平台上努力过,想要在上面留下自己的网站链接,但是现实是残酷的,如今想要在百度知道上加上自己的网站链接几乎是不可能,但是除了百度知道外文明还有搜搜问问、天涯问答、雅虎问答等等一系列的平台可以去发链接,有心的站长不妨去试试,一定会取得很好的效果。

在百度相关产品上加链接,上面说到的百度知道就是典型的百度产品,但是除了百度知道之外还有百度百科、、百度经验等等一系列的产品都是高权重外链的研发地,这些平台的外链和百度知道一样拥有高权重而且能够给网站带来直接流量,但是都是一些相对严格的平台,需要站长们去尝试去总结,找到在这些平台上面加链接的方法,

博客外链也是我们常常说到的外链平台之一,但是想要博客外链发挥作用就需要先养一个高权重的博客,一般的刚注册的博客都是不收录的,需要养一段时间之后才会有收录,需要我们每天去给博客发内容,时间久了,博客的权重就上来了,在博客上留下的链接权重也上来了,一个高权重的博客平台就孕育而生。

最后我想重点强调一下软文投稿,这个是站长们很不愿意去做的一件事情但是效果却是最好的一种做外链方法,由于软文投稿要求文章质量很高,所以很多站长都不愿意去写高质量的文章来投稿,有的站长也是试了一两次没有成功就放弃了,对于软文投稿外链的好处我想只有经历过了之后才会明白,记得我之前也喜欢去投稿,但是偶然的一次机会投稿通过了,然后文章被20几个网站转载,都是一些高权重的网站,而且权重也有所提升,于是我就爱上了软文投稿,现在我几乎是每天都会抽时间去写一篇原创文章投稿。所以坚持原创,是我们站长的必经之路。但原创,肚子里面的没有墨水怎么办,就好比写作文,一天还挤不出几个字怎么办?笔者的体会是首先要坚持大量阅读并记忆一些seo文章和知识点,当你读的多了之后,就会明白,seo的原创文章也没有那么难,关键是思路的分析与自己独到的见解。要具有可读性,具有一定的价值,才能被分享,被转载。

篇3:移动网络安全平台设计分析论文

1.1管理系统功能架构

对于移动网络安全管理平台,应具备统一用户、单点登录、集中审计、集中授权、集中认证、用户集中管理六个主要的功能模块。在进行开发设计时,建议基于JAVA平台,通过J2EE技术来实现各个功能板块之间的架构。

①在安全管控平台中,提供一个统一的入口实现身份验证,并为相关工作人员提供一个WEB登录页面,按照不同工作人员的身份验证显示不同的维护管理页面,并提供相应的管理功能。

②在设计过程中,要充分地考虑到数据核心业务层,把其作为整个系统的基础核心,在整个数据组成中包含了身份数据、授权策略数据、日志数据以及相关的资源数据等等,利用授权管理以及资源认证等形式,提供相关的安全审计管理工作以及相应的服务工具。

③在进行设计过程中,管理系统要能实现用户资源系统之间形成数据交互,并能够提供多个方面的接口。

1.2需要实现的具体功能分析

在整个管理系统中,整个管控平台要能够实现对所有自然人的账号统一管理,并且利用身份管理的模式,解决传统模式中共享账号所存在的问题,有效地实现实名制操作。此外,通过身份认证以及访问入口,每个用户都能够分配到相应的网络资源,需要通过授权的'合法用户才能够对其进行访问,同时安全管理平台在进行设计时,要能够有效地对所有维护操作进行记录,并把其所有操作进行储存,有效地防止了非法以及违规操作,实现操作审计功能。

1.3数据处理管理及系统性能管理

在进行移动网络安全平台设计时,要实现相关数据备份和恢复管理功能,有效地对所有的账号口令集中管理,增强平台的稳定性以及可靠性。在系统管理模块中,通过系统自身配置以及相应的数据备份或恢复来实现数据处理,同时也可以采用手工方式来进行数据备份与恢复。此外,在设计管控平台时,要能够实现对各个模块进行性能监控,并且生成相应的报表,这个报表可以提供给管理人员进行有效地分析,及时地调整不同模块的负载情况。

1.4日志集中管理和审计系统设计

在设计移动网络安全管控平台时,应考虑展现层能够通过多元化的形式生成报表,让管理人员能够从不同的角度来对整个系统的运行状态进行监控,通过日志集中管理与审计系统,对多个方面的日志来源形成有效的审计,同时,利用日志集中管理与审计系统,实现与其它系统的互联,把相关的信息传送于其它平台中进行有效的分析。

篇4:移动网络安全平台设计分析论文

2.1提升系统安全

移动网络管控平台设计完成后,把相应的业务系统进行接入,并实现对所有系统进行操作的有效监管,让整个移动网络信息安全事件的触发率有明显的下降,有效地提高各个系统的运行安全。但在使用过程中,采用绕行登录的形式,来避免使用管控平台。

2.2实施强制性网络阻断

对于一个新的系统应用,需要有一定时间的推广。在这个过程中,可以采用强制性网络阻断来实现消除绕行登录的可能性,开展阻断工作时,把整个工作分为系统侧与终端侧并同步进行。通过修改防火墙ACL策略强制性阻断终端地址,只提供管控平台地址的访问权限,同时,应该及时地把没有与管控平台进行连接的设备进行修改,实现能够与平台联通。

2.3解决管控平台的时延问题

经过多方面的分析与研究发现,造成管控平台时延问题的最大原因,是由于堡垒机性能负荷较高的问题。在许多时间单用户登录已经完全占用了堡垒主机的内存,要解决这个问题应该需要针对堡垒机进行扩容,让其所负载的资源能够实现分配。

2.4解决管控平台的审计问题

对于当前移动网络管控平台的相关操作基本可以实现全量记录,但是对于审计工作而言,存在着非常大的工作量。在这样的一个大工作量的影响下,审计工作的准确率势必会受到影响。比如:在利用windows设备进行登录维护时,进行对其操作的日志记录方式只能够以录像的形式。如果登录时间为5h,也就意味着审计工作人员需要5h的时间来对其进行日志审计。这样的一种工作状态,很容易导致在审计过程中出现违规的问题发生。所以在应用管控平台时,应该及时地解决管控平台审计问题。

3结语

总而言之,关于移动网络安全平台的设计,不仅需要实现相应的功能,同时还需要针对如何提高审计工作效率的问题来进行深入地分析。相信通过设计人员的不断完善,能够提高了整个系统的准确性与稳定性,实现管控平台的使用率的提升。

篇5:Linux/Unix平台可执行文件格式分析

简介:本文讨论了 UNIX/LINUX平台下三种主要的可执行文件格式:a.out( assembler and link editor output 汇编器和链接编辑器的输出)、COFF (Common Object File Format 通用对象文件格式)、ELF(Executable and Linking Format 可执行和链接格式),首先是对可执行文件格式的一个综述, 并通过描述 ELF 文件加载过程以揭示可执行文件内容与加载运行操作之间的关 系。随后依此讨论了此三种文件格式,并着重讨论 ELF 文件的动态连接机制, 其间也穿插了对各种文件格式优缺点的评价。最后对三种可执行文件格式有一个 简单总结,并提出作者对可文件格式评价的一些感想。

可执行文件格式综述

相对于其它文件类型,可执行文件可能是一个操作系统中最重要的文件类型 ,因为它们是完成操作的真正执行者。可执行文件的大小、运行速度、资源占用 情况以及可扩展性、可移植性等与文件格式的定义和文件加载过程紧密相关。研 究可执行文件的格式对编写高性能程序和一些 技术的运用都是非常有意义的 。

不管何种可执行文件格式,一些基本的要素是必须的,显而易见的,文件中 应包含代码和数据。因为文件可能引用外部文件定义的符号(变量和函数),因 此重定位信息和符号信息也是需要的。一些辅助信息是可选的,如调试信息、硬 件信息等。基本上任意一种可执行文件格式都是按区间保存上述信息,称为段( Segment)或节(Section)。不同的文件格式中段和节的含义可能有细微区别, 但根据上下文关系可以很清楚的理解,这不是关键问题。最后,可执行文件通常 都有一个文件头部以描述本文件的总体结构。

相对可执行文件有三个重要的概念:编译(compile)、连接(link,也可称 为链接、联接)、加载(load)。源程序文件被编译成目标文件,多个目标文件 被连接成一个最终的可执行文件,可执行文件被加载到内存中运行。因为本文重 点是讨论可执行文件格式,因此加载过程也相对重点讨论。下面是LINUX平台下 ELF文件加载过程的一个简单描述。

1:内核首先读ELF文件的头部,然后根据头部的数据指示分别读入各种数据 结构,找到标记为可加载(loadable)的段,并调用函数 mmap把段内容加载 到内存中。在加载之前,内核把段的标记直接传递给 mmap(),段的标记指示该 段在内存中是否可读、可写,可执行。显然,文本段是只读可执行,而数据段是 可读可写。这种方式是利用了现代操作系统和处理器对内存的保护功能。著名的 Shellcode(参考资料 17)的编写技巧则是突破此保护功能的一个实际例子。

2:内核分析出ELF文件标记为 PT_INTERP 的段中所对应的动态连接器名称, 并加载动态连接器。现代 LINUX 系统的动态连接器通常是 /lib/ld-linux.so.2 ,相关细节在后面有详细描述。

3:内核在新进程的堆栈中设置一些标记-值对,以指示动态连接器的相关操 作。

4:内核把控制传递给动态连接器。

5:动态连接器检查程序对外部文件(共享库)的依赖性,并在需要时对其进 行加载。

6:动态连接器对程序的外部引用进行重定位,通俗的讲,就是告诉程序其引 用的外部变量/函数的地址,此地址位于共享库被加载在内存的区间内。动态连 接还有一个延迟(Lazy)定位的特性,即只在“真正”需要引用符号时才重定位, 这对提高程序运行效率有极大帮助。

7:动态连接器执行在ELF文件中标记为 .init 的节的代码,进行程序运行的 初始化。在早期系统中,初始化代码对应函数 _init(void)(函数名强制固定), 在现代系统中,则对应形式为

void

__attribute((constructor))

init_function(void)

{

……

}

其中函数名为任意。

8:动态连接器把控制传递给程序,从 ELF 文件头部中定义的程序进入点开 始执行。在 a.out 格式和ELF格式中,程序进入点的值是显式存在的,在 COFF 格式中则是由规范隐含定义。

从上面的描述可以看出,加载文件最重要的是完成两件事情:加载程序段和 数据段到内存;进行外部定义符号的重定位。重定位是程序连接中一个重要概念 。我们知道,一个可执行程序通常是由一个含有 main() 的主程序文件、若干目 标文件、若干共享库(Shared Libraries)组成。(注:采用一些特别的技巧, 也可编写没有 main 函数的程序,请参阅参考资料 2)一个 C 程序可能引用共 享库定义的变量或函数,换句话说就是程序运行时必须知道这些变量/函数的地 址。在静态连接中,程序所有需要使用的外部定义都完全包含在可执行程序中, 而动态连接则只在可执行文件中设置相关外部定义的一些引用信息,真正的重定 位是在程序运行之时。静态连接方式有两个大问题:如果库中变量或函数有任何 变化都必须重新编译连接程序;如果多个程序引用同样的变量/函数,则此变量/ 函数会在文件/内存中出现多次,浪费硬盘/内存空间。比较两种连接方式生成的 可执行文件的大小,可以看出有明显的区别。

a.out 文件格式分析

a.out 格式在不同的机器平台和不同的 UNIX 操作系统上有轻微的不同,例 如在 MC680x0平台上有 6 个 section。下面我们讨论的是最“标准”的格式。

a.out 文件包含 7 个 section,格式如下:

exec header(执行头部,也可理解为文件头部)

text segment(文本段)

data segment(数据段)

text relocations(文本重定位段)

data relocations(数据重定位段)

symbol table(符号表)

string table(字符串表)

执行头部的数据结构:

struct exec {

unsigned long a_midmag; /* 魔数和其它信息 */

unsigned long a_text; /* 文本段的长度 */

unsigned long a_data; /* 数据段的长度 */

unsigned long a_bss; /* BSS段的长度 */

unsigned long a_syms; /* 符号表的长度 */

unsigned long a_entry; /* 程序进入点 */

unsigned long a_trsize; /* 文本重定位表的长度 */

unsigned long a_drsize; /* 数据重定位表的长度 */

};

文件头部主要描述了各个 section 的长度,比较重要的字段是 a_entry(程 序进入点),代表了系统在加载程序并初试化各种环境后开始执行程序代码的入 口。这个字段在后面讨论的 ELF 文件头部中也有出现。由 a.out 格式和头部数 据结构我们可以看出,a.out 的格式非常紧凑,只包含了程序运行所必须的信息 (文本、数据、BSS),而且每个 section 的顺序是固定的。这种结构缺乏扩展 性,如不能包含“现代”可执行文件中常见的调试信息,最初的 UNIX 对 a.out 文件调试使用的工具是 adb,而 adb 是一种机器语言调试器!

a.out 文件中包含符号表和两个重定位表,这三个表的内容在连接目标文件 以生成可执行文件时起作用。在最终可执行的 a.out 文件中,这三个表的长度 都为 0。a.out 文件在连接时就把所有外部定义包含在可执行程序中,如果从程 序设计的角度来看,这是一种硬编码方式,或者可称为模块之间是强藕和的。在 后面的讨论中,我们将会具体看到ELF格式和动态连接机制是如何对此进行改进 的。

a.out 是早期UNIX系统使用的可执行文件格式,由 AT&T 设计,现在基 本上已被 ELF 文件格式代替。a.out 的设计比较简单,但其设计思想明显的被 后续的可执行文件格式所继承和发扬。可以参阅参考资料 16 和阅读参考资料 15 源代码加深对 a.out 格式的理解。参考资料 12 讨论了如何在“现代”的红帽 LINUX运行 a.out 格式文件。

COFF 文件格式分析

COFF 格式比 a.out 格式要复杂一些,最重要的是包含一个节段表(section table),因此除了 .text,.data,和 .bss 区段以外,还可以包含其它的区段 。另外也多了一个可选的头部,不同的操作系统可一对此头部做特定的定义。

COFF 文件格式如下:

File Header(文件头部)

Optional Header(可选文件头部)

Section 1 Header(节头部)

………

Section n Header(节头部)

Raw Data for Section 1(节数据)

Raw Data for Section n(节数据)

Relocation Info for Sect. 1(节重定位数据)

Relocation Info for Sect. n(节重定位数据)

Line Numbers for Sect. 1(节行号数据)

Line Numbers for Sect. n(节行号数据)

Symbol table(符号表)

String table(字符串表)

文件头部的数据结构:

struct filehdr

{

unsigned short f_magic; /* 魔数 */

unsigned short f_nscns; /* 节个数 */

longf_timdat; /* 文件建立时间 */

longf_symptr; /* 符号表相对文件的偏移量 */

longf_nsyms; /* 符号表条目个数 */

unsigned short f_opthdr; /* 可选头部长度 */

unsigned short f_flags; /* 标志 */

};

COFF 文件头部中魔数与其它两种格式的意义不太一样,它是表示针对的机器 类型,例如 0x014c 相对于 I386平台,而 0x268 相对于 Motorola 68000系列 等。当 COFF 文件为可执行文件时,字段 f_flags 的值为 F_EXEC(0X00002) ,同时也表示此文件没有未解析的符号,换句话说,也就是重定位在连接时就已 经完成。由此也可以看出,原始的 COFF 格式不支持动态连接。为了解决这个问 题以及增加一些新的特性,一些操作系统对 COFF 格式进行了扩展。Microsoft 设计了名为 PE(Portable Executable)的文件格式,主要扩展是在 COFF 文件 头部之上增加了一些专用头部,具体细节请参阅参考资料 18,某些 UNIX 系统 也对 COFF 格式进行了扩展,如 XCOFF(extended common object file format )格式,支持动态连接,请参阅参考资料 5。

紧接文件头部的是可选头部,COFF 文件格式规范中规定可选头部的长度可以 为 0,但在 LINUX 系统下可选头部是必须存在的。下面是 LINUX 下可选头部的 数据结构:

typedef struct

{

char magic[2]; /* 魔数 */

char vstamp[2]; /* 版本号 */

char tsize[4]; /* 文本段长度 */

char dsize[4]; /* 已初始化数据段长度 */

char bsize[4]; /* 未初始化数据段长度 */

char entry[4]; /* 程序进入点 */

char text_start[4]; /* 文本段基地址 */

char data_start[4]; /* 数据段基地址 */

}

COFF_AOUTHDR;

字段 magic 为 0413 时表示 COFF 文件是可执行的,注意到可选头部中显式 定义了程序进入点,标准的 COFF 文件没有明确的定义程序进入点的值,通常是 从 .text 节开始执行,但这种设计并不好。

前面我们提到,COFF 格式比 a.out 格式多了一个节段表,一个节头条目描 述一个节数据的细节,因此 COFF 格式能包含更多的节,或者说可以根据实际需 要,增加特定的节,具体表现在 COFF 格式本身的定义以及稍早提及的 COFF 格 式扩展。我个人认为,节段表的出现可能是 COFF 格式相对 a.out 格式最大的 进步。下面我们将简单描述 COFF 文件中节的数据结构,因为节的意义更多体现 在程序的编译和连接上,所以本文不对其做更多的描述。此外,ELF 格式和 COFF格式对节的定义非常相似,在随后的 ELF 格式分析中,我们将省略相关讨 论。

struct COFF_scnhdr

{

char s_name[8]; /* 节名称 */

char s_paddr[4]; /* 物理地址 */

char s_vaddr[4]; /* 虚拟地址 */

char s_size[4]; /* 节长度 */

char s_scnptr[4]; /* 节数据相对文件的偏移量 */

char s_relptr[4]; /* 节重定位信息偏移量 */

char s_lnnoptr[4]; /* 节行信息偏移量 */

char s_nreloc[2]; /* 节重定位条目数 */

char s_nlnno[2]; /* 节行信息条目数 */

char s_flags[4]; /* 段标记 */

};

有一点需要注意:LINUX系统中头文件coff.h中对字段 s_paddr的注释 是“physical address”,但似乎应该理解为“节被加载到内存中所占用的空间长 度”。字段s_flags标记该节的类型,如文本段、数据段、BSS段等。在 COFF的节 中也出现了行信息,行信息描述了二进制代码与源代码的行号之间的对映关系, 在调试时很有用。

参考资料 19是一份对COFF格式详细描述的中文资料,更详细的内容请参阅参 考资料 20。

ELF文件格式分析

ELF文件有三种类型:可重定位文件:也就是通常称的目标文件,后缀为.o。 共享文件:也就是通常称的库文件,后缀为.so。可执行文件:本文主要讨论的 文件格式,总的来说,可执行文件的格式与上述两种文件的格式之间的区别主要 在于观察的角度不同:一种称为连接视图(Linking View),一种称为执行视图 (Execution View)。

首先看看ELF文件的总体布局:

ELF header(ELF头部)

Program header table(程序头表)

Segment1(段1)

Segment2(段2)

………

Sengmentn(段n)

Setion header table(节头表,可选)

段由若干个节(Section)构成,节头表对每一个节的信息有相关描述。对可执 行程序而言,节头表是可选的。参考资料 1中作者谈到把节头表的所有数据全部 设置为0,程序也能正确运行!ELF头部是一个关于本文件的路线图(road map) ,从总体上描述文件的结构。下面是ELF头部的数据结构:

typedef struct

{

unsigned char e_ident[EI_NIDENT]; /* 魔数和相关信息 */

Elf32_Half e_type; /* 目标文件类型 */

Elf32_Half e_machine; /* 硬件体系 */

Elf32_Word e_version; /* 目标文件版本 */

Elf32_Addr e_entry; /* 程序进入点 */

Elf32_Off e_phoff; /* 程序头部偏移量 */

Elf32_Off e_shoff; /* 节头部偏移量 */

Elf32_Word e_flags; /* 处理器特定标志 */

Elf32_Half e_ehsize; /* ELF头部长度 */

Elf32_Half e_phentsize;/* 程序头部中一个条目的长 度 */

Elf32_Half e_phnum; /* 程序头部条目个数 */

Elf32_Half e_shentsize;/* 节头部中一个条目的长度 */

Elf32_Half e_shnum; /* 节头部条目个数 */

Elf32_Half e_shstrndx; /* 节头部字符表索引 */

}

Elf32_Ehdr;

下面我们对ELF头表中一些重要的字段作出相关说明,完整的ELF定义请参阅 参考资料 6和参考资料7。

e_ident[0]-e_ident[3]包含了ELF文件的魔数,依次是0x7f、'E'、'L'、'F' 。注意,任何一个ELF文件必须包含此魔数。参考资料 3中讨论了利用程序、工 具、/Proc文件系统等多种查看ELF魔数的方法,

e_ident[4]表示硬件系统的位数 ,1代表32位,2代表64位。 e_ident[5]表示数据编码方式,1代表小印第安排序 (最大有意义的字节占有最低的地址),2代表大印第安排序(最大有意义的字 节占有最高的地址)。e_ident[6]指定ELF头部的版本,当前必须为1。e_ident [7]到e_ident[14]是填充符,通常是0。ELF格式规范中定义这几个字节是被忽略 的,但实际上是这几个字节完全可以可被利用。如病毒Lin/Glaurung.676/666( 参考资料 1)设置e_ident[7]为0x21,表示本文件已被感染;或者存放可执行代 码(参考资料 2)。ELF头部中大多数字段都是对子头部数据的描述,其意义相 对比较简单。值得注意的是某些病毒可能修改字段e_entry(程序进入点)的值 ,以指向病毒代码,例如上面提到的病毒Lin/Glaurung.676/666。

一个实际可执行文件的文件头部形式如下:(利用命令readelf)

ELF Header:

Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00

Class: ELF32

Data: 2's complement, little endian

Version: 1 (current)

OS/ABI: UNIX - System V

ABI Version:0

Type: EXEC (Executable file)

Machine: Intel 80386

Version: 0x1

Entry point address: 0x80483cc

Start of program headers: 52 (bytes into file)

Start of section headers: 14936 (bytes into file)

Flags: 0x0

Size of this header: 52 (bytes)

Size of program headers:32 (bytes)

Number of program headers: 6

Size of section headers:40 (bytes)

Number of section headers: 34

Section header string table index: 31

紧接ELF头部的是程序头表,它是一个结构数组,包含了ELF头表中字段 e_phnum定义的条目,结构描述一个段或其他系统准备执行该程序所需要的信息 。

typedef struct {

Elf32_Word p_type; /* 段类型 */

Elf32_Off p_offset; /* 段位置相对于文件开始处的偏移量 */

Elf32_Addr p_vaddr; /* 段在内存中的地址 */

Elf32_Addr p_paddr; /* 段的物理地址 */

Elf32_Word p_filesz; /* 段在文件中的长度 */

Elf32_Word p_memsz; /* 段在内存中的长度 */

Elf32_Word p_flags; /* 段的标记 */

Elf32_Word p_align; /* 段在内存中对齐标记 */

} Elf32_Phdr;

在详细讨论可执行文件程序头表之前,首先查看一个实际文件的输出:

Program Headers:

TypeOffset VirtAddr PhysAddr FileSiz MemSiz Flg Align

PHDR0x000034 0x08048034 0x08048034 0x000c0 0x000c0 R E 0x4

INTERP 0x0000f4 0x080480f4 0x080480f4 0x00013 0x00013 R 0x1

[Requesting program interpreter: /lib/ld-linux.so.2]

LOAD0x000000 0x08048000 0x08048000 0x00684 0x00684 R E 0x1000

LOAD0x000684 0x08049684 0x08049684 0x00118 0x00130 RW 0x1000

DYNAMIC 0x000690 0x08049690 0x08049690 0x000c8 0x000c8 RW 0x4

NOTE0x000108 0x08048108 0x08048108 0x00020 0x00020 R 0x4

Section to Segment mapping:

Segment Sections...

00

01 .interp

02 .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.

version_r .rel.dyn .rel.plt

.init .plt .text .fini .rodata .eh_frame

03 .data .dynamic .ctors .dtors .jcr .got .bss

04 .dynamic

05 .note.ABI-tag

Section Headers:

[Nr] Name TypeAddr Off Size ES Flg Lk Inf Al

[ 0] NULL00000000 000000 000000 00 0 0 0

[ 1] .interpPROGBITS 080480f4 0000f4 000013 00 A 0 0 1

[ 2] .note.ABI-tag NOTE08048108 000108 000020 00 A 0 0 4

[ 3] .hash HASH08048128 000128 000040 04 A 4 0 4

[ 4] .dynsymDYNSYM 08048168 000168 0000b0 10 A 5 1 4

[ 5] .dynstrSTRTAB 08048218 000218 00007b 00 A 0 0 1

[ 6] .gnu.version VERSYM 08048294 000294 000016 02 A 4 0 2

[ 7] .gnu.version_r VERNEED 080482ac 0002ac 000030 00 A 5 1 4

[ 8] .rel.dyn REL 080482dc 0002dc 000008 08 A 4 0 4

[ 9] .rel.plt REL 080482e4 0002e4 000040 08 A 4 b 4

[10] .init PROGBITS 08048324 000324 000017 00 AX 0 0 4

[11] .plt PROGBITS 0804833c 00033c 000090 04 AX 0 0 4

[12] .text PROGBITS 080483cc 0003cc 0001f8 00 AX 0 0 4

[13] .fini PROGBITS 080485c4 0005c4 00001b 00 AX 0 0 4

[14] .rodataPROGBITS 080485e0 0005e0 00009f 00 A 0 0 32

[15] .eh_frame. PROGBITS 08048680 000680 000004 00 A 0 0 4

[16] .data PROGBITS 08049684 000684 00000c 00 WA 0 0 4

[17] .dynamic DYNAMIC 08049690 000690 0000c8 08 WA 5 0 4

[18] .ctorsPROGBITS 08049758 000758 000008 00 WA 0 0 4

[19] .dtorsPROGBITS 08049760 000760 000008 00 WA 0 0 4

[20] .jcr PROGBITS 08049768 000768 000004 00 WA 0 0 4

[21] .got PROGBITS 0804976c 00076c 000030 04 WA 0 0 4

[22] .bss NOBITS 0804979c 00079c 000018 00 WA 0 0 4

[23] .comment PROGBITS 00000000 00079c 000132 00 0 0 1

[24] .debug_aranges PROGBITS 00000000 0008d0 000098 00 0 0 8

[25] .debug_pubnames PROGBITS 00000000 000968 000040 00 0 0 1

[26] .debug_info PROGBITS 00000000 0009a8 001cc6 00 0 0 1

[27] .debug_abbrev PROGBITS 00000000 00266e 0002cc 00 0 0 1

[28] .debug_line PROGBITS 00000000 00293a 0003dc 00 0 0 1

[29] .debug_frame. PROGBITS 00000000 002d18 000048 00 0 0 4

[30] .debug_str PROGBITS 00000000 002d60 000bcd 01 MS 0 0 1

[31] .shstrtab STRTAB 00000000 00392d 00012b 00 0 0 1

[32] .symtabSYMTAB 00000000 003fa8 000740 10 33 56 4

[33] .strtabSTRTAB 00000000 0046e8 000467 00 0 0 1

对一个ELF可执行程序而言,一个基本的段是标记p_type为PT_INTERP的段, 它表明了运行此程序所需要的程序解释器(/lib/ld- linux.so.2),实际上也 就是动态连接器(dynamic linker)。最重要的段是标记p_type为PT_LOAD的段 ,它表明了为运行程序而需要加载到内存的数据。查看上面实际输入,可以看见 有两个可 LOAD段,第一个为只读可执行(FLg为R E),第二个为可读可写(Flg 为RW)。段1包含了文本节.text,注意到ELF文件头部中程序进入点的值为 0x80483cc,正好是指向节. text在内存中的地址。段二包含了数据节.data,此 数据节中数据是可读可写的,相对的只读数据节.rodata包含在段1中。ELF格式 可以比 COFF格式包含更多的调试信息,如上面所列出的形式为.debug_xxx的节 。在I386平台LINUX系统下,用命令file查看一个ELF可执行程序的可能输出是: a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped。

ELF文件中包含了动态连接器的全路径,内核定位“正确”的动态连接器在内存 中的地址是“正确”运行可执行文件的保证,参考资料 13讨论了如何通过查找动 态连接器在内存中的地址以达到颠覆(Subversiver)动态连接机制的方法。

最后我们讨论ELF文件的动态连接机制。每一个外部定义的符号在全局偏移表 (Global Offset Table GOT)中有相应的条目,如果符号是函数则在过程连接表 (Procedure Linkage Table PLT)中也有相应的条目,且一个PLT条目对应一个 GOT条目。对外部定义函数解析可能是整个ELF文件规范中最复杂的,下面是函数 符号解析过程的一个描述。

1:代码中调用外部函数func,语句形式为call 0xaabbccdd,地址0xaabbccdd 实际上就是符号func在PLT表中对应的条目地址(假设地址为标号.PLT2)。

2:PLT表的形式如下

.PLT0: pushl 4(%ebx)

/* GOT表的地址保存在寄存器ebx中 */

jmp *8(%ebx)

nop; nop

nop; nop

.PLT1: jmp *name1@GOT(%ebx)

pushl $offset

jmp .PLT0@PC

.PLT2: jmp *func@GOT(%ebx)

pushl $offset

jmp .PLT0@PC

3:查看标号.PLT2的语句,实际上是跳转到符号func在GOT表中对应的条目。

4:在符号没有重定位前,GOT表中此符号对应的地址为标号.PLT2的下一条语 句,即是pushl $offset,其中$offset是符号func的重定位偏移量。注意到这是 一个二次跳转。

5:在符号func的重定位偏移量压栈后,控制跳到PLT表的第一条目,把GOT[1] 的内容压栈,并跳转到GOT[2]对应的地址。

6:GOT[2]对应的实际上是动态符号解析函数的代码,在对符号func的地址解 析后,会把func在内存中的地址设置到GOT表中此符号对应的条目中。

7:当第二次调用此符号时,GOT表中对应的条目已经包含了此符号的地址, 就可直接调用而不需要利用PLT表进行跳转。

动态连接是比较复杂的,但为了获得灵活性的代价通常就是复杂性。其最终 目的是把GOT表中条目的值修改为符号的真实地址,这也可解释节.got包含在可 读可写段中。

动态连接是一个非常重要的进步,这意味着库文件可以被升级、移动到其他 目录等等而不需要重新编译程序(当然,这不意味库可以任意修改,如函数入参 的个数、数据类型应保持兼容性)。从很大程度上说,动态连接机制是ELF格式 代替a.out格式的决定性原因。如果说面对对象的编程本质是面对接口 (interface)的编程,那么动态连接机制则是这种思想的地一个非常典型的应 用,具体的讲,动态连接机制与设计模式中的桥接(BRIDGE)方法比较类似,而 它的LAZY特性则与代理(PROXY)方法非常相似。动态连接操作的细节描述请参 阅参考资料 8,9,10,11。通过阅读命令readelf、objdump 的源代码以及参考 资料 14中所提及的相关软件源代码,可以对ELF文件的格式有更彻底的了解。

总结

不同时期的可执行文件格式深刻的反映了技术进步的过程,技术进步通常是 针对解决存在的问题和适应新的环境。早期的UNIX系统使用a.out格式,随着操 作系统和硬件系统的进步,a.out格式的局限性越来越明显。新的可执行文件格 式COFF在UNIX System VR3中出现,COFF格式相对a.out格式最大变化是多了一个 节头表(section head table),能够在包含基础的文本段、数据段、BSS段之 外包含更多的段,但是COFF对动态连接和C++程序的支持仍然比较困难。为了解 决上述问题, UNIX系统实验室(UNIX SYSTEM Laboratories USL) 开发出ELF文 件格式,它被作为应用程序二进制接口(Application binary Interface ABI) 的一部分,其目的是替代传统的a.out格式。例如,ELF文件格式中引入初始化段 .init和结束段.fini(分别对应构造函数和析构函数)则主要是为了支持C++程 序。1994年6月ELF格式出现在LINUX系统上,现在ELF格式作为UNIX/LINUX最主要 的可执行文件格式。当然我们完全有理由相信,在将来还会有新的可执行文件格 式出现。

上述三种可执行文件格式都很好的体现了设计思想中分层的概念,由一个总 的头部刻画了文件的基本要素,再由若干子头部/条目刻画了文件的若干细节。 比较一下可执行文件格式和以太数据包中以太头、IP头、TCP头的设计,我想我 们能很好的感受分层这一重要的设计思想。参考资料 21从全局的角度讨论了各 种文件的格式,并提出一个比较夸张的结论:Everything Is Byte!

最后的题外话:大多数资料中对a.out格式的评价较低,常见的词语有黑暗年 代(dark ages)、丑陋(ugly)等等,当然,从现代的观点来看,的确是比较 简单,但是如果没有曾经的简单何来今天的精巧?正如我们今天可以评价石器时 代的技术是ugly,那么将来的人们也可以嘲讽今天的技术是非常ugly。我想我们 也许应该用更平和的心态来对曾经的技术有一个公正的评价。

篇6:科技金融平台运行机制分析论文

科技金融平台运行机制分析论文

摘要:21世纪是信息与科技相互促进发展的时代,科技金融平台为高新技术产业的发展进步与自主创新能力的提升提供了重要支撑,其运行机制的合理有效显得至关重要。本文以系统科学论和协调效应论为理论指导,从合作协调机制和动力保障机制两大方面入手探析科技金融平台的运行机制。

关键词::科技金融平台;合作协调机制;动力保障机制

科技金融平台由参与科技金融活动的企业、科研机构、高等院校、政府部门、金融机构等相关主体组成,旨在将科技创新与金融体系相结合,实现科学研究、技术开发、科技成果转化以及科技产业化发展等的协调良性运转。科技金融平台的运行机制是保证平台运行的前提与支柱,为平台所有参与主体的相互合作、有效融合提供动力保障。

一、科技金融平台运行的理论基础

(一)系统科学论

科技金融平台是一个结构复杂、关系繁综、功能多样的开放性系统,因而其运行机制的探析研究从属于具有复杂性的科学研究领域。系统科学的整体观与动态发展观为平台的运行机制研究提供了崭新的视角。科技金融平台包含了巨大的信息库以及相互作用关系,使得参与主体的一些作用机理难以进行深入层层分解式的细化研究。系统科学论为平台运行机制的研究提供了整体论观点的科学依据。

(二)协调效应论

协同效应论是研究诸多系统在质变过程中所应遵循共同规律的科学。其核心观点为系统内部各子系统或组成部分的协同作用对系统能否发挥协同效应具有重要影响,协调的好则系统的整体性功能就好,反之整体性的功能无法得到有效发挥。由此反观科技金融平台,如果平台内部协调配合的好,则会产生“1+1>2”的协同效应,反之会使造成平台的混乱无序。因此,协调效应论对建立各参与主体间的相互协调配合机制,对科技金融平台的运行发展具有科学的指导意义。

二、科技金融平台运行的合作协调机制

(一)互相协调的产学研机制

(1)机制内涵释析。科技金融平台是一个由科技型企业、政府、科研机构、大学以及金融机构等主体组织组成的复杂网络系统。产学研机制的形成得以使平台有条不紊地发挥各主体间的相互作用,可以促进平台与外界的资源互换,能够使各种资源实现优化配置,产学研机制形成于产业、学校、科研机构间,总得来说机制的相互协调能够使科技平台的整体效更加明显突出。(2)机制具体运行。产学研机制的常规稳定运行离不开参与主体的互相合作与密切配合,一方面学校和科研机构产业提供前沿的创新成果,另一方面产业为科研机构和学校投入资金与设备,保证学研创新成果研发的顺利开展。同时政府的调控和协调者的角色必不可少,机制的正常运转需要政府既要给予积极的政策引导、鼓励学研的创新,又要激励企业投资,保证三者的团结协作,确保科技创新成果保证在较高水平。

(二)多主体的风险共担机制

(1)机制内涵释析。风险共担机制涉及到投资主体、投资对象、相关的中介服务机构等多方面主体。风险共担机制的运行能够保证科技金融平台多个主体的参与,能够充分发挥各主体的核心职能,为平台的风投提供针对有效的专业服务。(2)机制具体运行。风险共担机制在具体的运转中,多主体各司其职,政府会出台相关的法律法规以鼓励引导风投;风险投资机构会为科技成果的创新转化提供资金支持;科技评估机构、技术交易机构等中介机构在机制运转过程中提供及时专业的指导、监督、评估等作用,同时平台针对风险共担机制制定了相关对策,均以确保平台的科学投资与责任共担。

三、科技金融平台运行的动力保障机制

(一)协同激励的创新机制

(1)机制内涵释析。对于协同激励的创新机制可分为两部分进行理解,一是激励机制,二是协同创新机制,激励机制旨在激发参与主体的创造积极性,通过合理配置与相互协同哥主体的股权、目标等实现;协同创新机制为保证平台实现技术创新目标,通过促进各方面资源的相互作用为平台积累量变、实现质变提供不竭动力。(2)机制具体运行。激励机制通过股权激励、目标激励、情感激励将产学研与政府、企业以及相关金融机构有效紧密结合起来在创造价值、实现创新的过程中实现利益共享,既促进了科技金融平台的创新成果转化,又使各参与主体在创新的过程中实现人生价值。协同创新机制是通过建立研发子平台、产业化子平台、公共服务子平台以及人才培养子平台四平台,将产学研及相关机构紧密结合,围绕特定技术,共同解决技术难题,制定技术标准,实现成果共享,推动科技创新。

(二)完善系统的保障机制

(1)机制内涵释析。科技金融平台在具体的.运转过程中会遇到不同的障碍,为保障平台的良性运转,建立系统完善的保障机制至关重要。具体而言,保障机制是指在科技金融平台发展的过程中为平台各参与主体的密切合作提供必须及时的保障,既有精神层面的政策,又有物质方面的资金与人才供给。(2)机制具体运行。保障机制的具体运行包括三部分的密切配合,分别是政府的指导、产业的科技与人才的建设。政府的指导体现在相关法律法规的制定,为平台运转奠定基础;产业的科技体现在保证科技成果的研发推进,这离不开大额的资金支持,需要在政府引导下企业的支持投入,相关主体间需要相互协作;人才队伍建设亦是至关重要的,源源不断的人才供给是科技创新的前提,一方面政府企业给予科技培训机构资金支持,另一方面人才的培养能够填补企业与社会的缺口。在新时代背景下探析科技金融平台的运行机制可以实现科技金融资源的优化整合,为科技金融平台提供持久的动能,能够及时发现问题解决问题,实现平台的自动反馈调控,为平台的稳定运行提供保障,最终使各要素之间实现良性运转,推动科技金融平台的改进完善。

参考文献:

[1]江积海,张烁亮.基于价值网的科技金融平台运作模式研究[J].科技进步与对策,(22).

[2]王勇,冯立.多案例背景下的区域性科技金融平台运作研究[J].科技管理研究,(08).

[3]乔昱凯.基于价值网的科技金融平台运作模式研究[J].财会学习,(01).

[4]代鸿顺,李平原.互联网及多金融平台对金融行业的影响[J].淮北职业技术学院学报,(04).

篇7:融资平台公司转型案例分析

天津泰达投资控股有限公司(简称“泰达控股”)前身是天津经济技术开发区总公司,经天津市政府1984年12月批准成立,职责定位为经营开发区公共设施及各项公共服务事业,经营开发区的进出口贸易,办理国外投资所需的咨询业务等职能。2001年12月30日,经天津市政府批准,以天津经济技术开发区总公司的转制为基础框架,并统筹组合天津泰达集团有限公司、天津经济技术开发区建设集团有限公司(后更名为“天津泰达建设集团有限公司”),注册成立天津泰达投资控股有限公司,对区属国有资产行使所有者职能,承担保值增值的责任。2001年泰达控股成立至今,通过合资、收购等方式,成立/入资北方国际信托、长城医药保健品公司、恒安人寿、天津钢管集团、渤海财产保险股份公司、渤海银行等机构,在园区建设、市政公用事业运营的基础上,全面进入生产制造、金融产业。

泰达控股在以“资源经营”为核心的战略思想指导下,以自然资源、社会资源和品牌资源为主要经营领域,以天津开发区和滨海新区为主要投资、经营和服务区域,形成了“以渤海银行为旗舰的金融产业、以钢管公司为代表的基础实业、以小城开发为主体的城市资源经营、以能源供应为核心的公用事业、以海洋整治为龙头的区域开发、以循环经济为标志的社会专营领域”等六大产业布局,初步形成了“金融是核心,公用事业是基础,新资源开发是方向”的产业格局。2010年,泰达控股实现销售收入578亿元、总资产1612亿元,主要经营领域为区域开发与房地产、公用事业、制造业、金融和现代服务业等,拥有14家全资公司、25家控股公司和23家参股公司,其中包括6家上市公司。

案例解析

区域经济的发展对平台公司不断提出更高的要求,也带来更多的发展机遇。从最初的开发区资金运营管理、公用事业运营,到实业经营,再发展为金融性的投资和经营并重的,以投资为主的集团企业,泰达控股从单一的政府投融资平台成功转型为具备强大赢利能力的多产业集团公司。

在天津经济开发区快速发展的背景下,泰达控股抓住机遇,争取政府支持,快速抢占资源;在传统事业继续做大做实的基础上,积极介入有前景、有特色的新领域,实现收入多元化,稳定利润来源;同时,以金融产业为杠杆,以“泰达”品牌为支点,进行资本运作。

结语

从各地平台公司的运作特点看来,由于各地经济发展阶段、建设重点不一样,政府投融资平台的体系建设模式不尽相同。但其功能定位与运作方式,均结合了区域特点和地方城市经济的发展诉求,赋予地方平台公司运作使命。随着区域经济的深入发展,平台公司需要逐步摆脱“地方政府投融资平台”的单一功能定位,向资产管理、产业扶持、创业引导等纵深方向发展。

国发19号文根据投资项目及其偿债方式的差异,界定了平台公司的发展定位,明确了平台公司与政府的关系。其中,对承担有稳定经营性收入的公益性项目融资任务并主要依靠自身收益偿还债务的融资平台公司,以及承担非公益性项目融资任务的融资平台公司,要“充实公司资本金,完善治理结构,实现商业运作;要通过引进民间投资等市场化途径,促进投资主体多元化,改善融资平台公司的股权结构”。

OA平台、数据分析、软件开发个人工作总结

软件开发管理平台的分析与设计论文

平台策划书

平台祝福语

防火墙、UTM产品硬件平台架构分析服务器教程

信息化平台建议书

云南大学党课平台

祝福短信平台

购物平台广告语

平台推广方案

《Linux/Unix平台可执行文件格式分析(整理7篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

点击下载本文文档