当前位置:文档之家› 目标文件格式分析工具-ar-nm等等

目标文件格式分析工具-ar-nm等等

目标文件格式分析工具-ar-nm等等
目标文件格式分析工具-ar-nm等等

目标文件格式分析工具: ar,nm,objdump,objcopy,readelf

如果普通编程不需要了解这些东西,如果想精确控制你的目标文件的格式或者你想查看一下文件里的内容以便作出某种判断,那么你可以看一下下面的工具:ar,nm,objdump,objcopy。具体用法请参考man在线手册。

ar基本用法

ar命令可以用来创建、修改库,也可以从库中提出单个模块。库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。

下面是ar命令的格式:

ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...

例如我们可以用ar rv libtest.a hello.o hello1.o来生成一个库,库名字是test,链接时可以用-ltest链接。该库中存放了两个模块hello.o和hello1.o。选项前可以有‘-'字符,也可以没有。下面我们来看看命令的操作选项和任选项。现在我们把{dmpqrtx}部分称为操作选项,而[abcfilNoPsSuvV]部分称为任选项。

{dmpqrtx}中的操作选项在命令中只能并且必须使用其中一个,它们的含义如下:

?d:从库中删除模块。按模块原来的文件名指定要删除的模块。如果使用了任选项v 则列出被删除的每个模块。

?m:该操作是在一个库中移动成员。当库中如果有若干模块有相同的符号定义(如函数定义),则成员的位置顺序很重要。如果没有指定任选项,任何指定的成员将移到库的最后。也可以使用'a','b',或'I'任选项移动到指定的位置。

?p:显示库中指定的成员到标准输出。如果指定任选项v,则在输出成员的内容前,将显示成员的名字。如果没有指定成员的名字,所有库中的文件将显示出来。

?q:快速追加。增加新模块到库的结尾处。并不检查是否需要替换。'a','b',或'I'任选项对此操作没有影响,模块总是追加的库的结尾处。如果使用了任选项v则列出每个模块。 这时,库的符号表没有更新,可以用'ar s'或ranlib来更新库的符号表索引。

?r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。

如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。

?t:显示库的模块表清单。一般只显示模块名。

?x:从库中提取一个成员。如果不指定要提取的模块,则提取库中所有的模块。

下面在看看可与操作选项结合使用的任选项:

?a:在库的一个已经存在的成员后面增加一个新的文件。如果使用任选项a,则应该为命令行中membername参数指定一个已经存在的成员名。

?b:在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项b,则应该为命令行中membername参数指定一个已经存在的成员名。

?c:创建一个库。不管库是否存在,都将创建。

?f:在库中截短指定的名字。缺省情况下,文件名的长度是不受限制的,可以使用此参数将文件名截短,以保证与其它系统的兼容。

?i:在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项i,则应该为命令行中membername参数指定一个已经存在的成员名(类似任选项b)。

?l:暂未使用

?N:与count参数一起使用,在库中有多个相同的文件名时指定提取或输出的个数。

?o:当提取成员时,保留成员的原始数据。如果不指定该任选项,则提取出的模块的时间将标为提取出的时间。

?P:进行文件名匹配时使用全路径名。ar在创建库时不能使用全路径名(这样的库文件不符合POSIX标准),但是有些工具可以。

?s:写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。甚至对于没有任何变化的库也作该动作。对一个库做ar s等同于对该库做ranlib。

?S:不创建目标文件索引,这在创建较大的库时能加快时间。

?u:一般说来,命令ar r...插入所有列出的文件到库中,如果你只想插入列出文件中那些比库中同名文件新的文件,就可以使用该任选项。该任选项只用于r操作选项。

?v:该选项用来显示执行操作选项的附加信息。

?V:显示ar的版本。

nm基本用法

nm用来列出目标文件的符号清单。下面是nm命令的格式:

nm [-a│--debug-syms] [-g│--extern-only]

[-B] [-C│--demangle[=style]] [-D│--dynamic]

[-S│--print-size] [-s│--print-armap]

[-A│-o│--print-file-name][--special-syms]

[-n│-v│--numeric-sort] [-p│--no-sort]

[-r│--reverse-sort] [--size-sort] [-u│--undefined-only]

[-t radix│--radix=radix] [-P│--portability]

[--target=bfdname] [-f format│--format=format]

[--defined-only] [-l│--line-numbers] [--no-demangle]

[-V│--version] [-X 32_64] [--help] [objfile...]

如果没有为nm命令指出目标文件,则nm假定目标文件是a.out。下面列出该命令的任选项,大部分支持"-"开头的短格式和"—"开头的长格式。

?-A、-o或--print-file-name:在找到的各个符号的名字前加上文件名,而不是在此文件的所有符号前只出现文件名一次。

例如nm libtest.a的输出如下:

CPThread.o:

00000068 T Main__8CPThreadPv

00000038 T Start__8CPThread

00000014 T _._8CPThread

00000000 T __8CPThread

00000000 ? __FRAME_BEGIN__

.......................................

则nm -A 的输出如下:

libtest.a:CPThread.o:00000068 T Main__8CPThreadPv

libtest.a:CPThread.o:00000038 T Start__8CPThread

libtest.a:CPThread.o:00000014 T _._8CPThread

libtest.a:CPThread.o:00000000 T __8CPThread

libtest.a:CPThread.o:00000000 ? __FRAME_BEGIN__

..................................................................

?-a或--debug-syms:显示所有的符号,包括debugger-only symbols。

?-B:等同于--format=bsd,用来兼容MIPS的nm。

?-C或--demangle:将低级符号名解析(demangle)成用户级名字。这样可以使得C++函数名具有可读性。

?--no-demangle:默认的选项,不需要将低级符号名解析成用户级名。

?-D或--dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。

?-f format:使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd。

?-g或--extern-only:仅显示外部符号。

?-n、-v或--numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序。

?-p或--no-sort:按目标文件中遇到的符号顺序显示,不排序。

?-P或--portability:使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。

?-s或--print-armap:当列出库中成员的符号时,包含索引。索引的内容包含:哪些模块包含哪些名字的映射。

?-r或--reverse-sort:反转排序的顺序(例如,升序变为降序)。

?--size-sort:按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。

?-t radix或--radix=radix:使用radix进制显示符号值。radix只能为"d"表示十进制、"o"表示八进制或"x"表示十六进制。

?--target=bfdname:指定一个目标代码的格式,而非使用系统的默认格式。

?-u或--undefined-only:仅显示没有定义的符号(那些外部符号)。

?--defined-only:仅显示定义的符号。

?-l或--line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。对于已定义的符号,查找符号地址的行号。对于未定义符号,查找符号重定位项的行号。

如果可以找到行号信息,显示在符号信息之后。

?-V或--version:显示nm的版本号。

?--help:显示nm的任选项。

对于每一个符号,nm列出其值(the symbol value),类型(the symbol type)和其名字(the symbol name)。

对于每一个符号来说,其类型如果是小写的,则表明该符号是local的;大写则表明该符号是global(external)的。

说明

符号

类型

A 该符号的值是绝对的,在以后的链接过程中,不允许进行改变。这样的

符号值,常常出现在中断向量表中,例如用符号来表示各个中断向量函

数在中断向量表中的位置。

B 该符号的值出现在非初始化数据段(bss)中。例如,在一个文件中定义全

局static int test。则该符号test的类型为b,位于bss section中。

其值表示该符号在bss段中的偏移。一般而言,bss段分配于RAM中

C 该符号为common。common symbol是未初始话数据段。该符号没有包含

于一个普通section中。只有在链接过程中才进行分配。符号的值表示

该符号需要的字节数。例如在一个c文件中,定义int test,并且该符

号在别的地方会被引用,则该符号类型即为C。否则其类型为B。

D 该符号位于初始话数据段中。一般来说,分配到data section中。例如

定义全局int baud_table[5] = {9600, 19200, 38400, 57600, 115200},

则会分配于初始化数据段中。

G 该符号也位于初始化数据段中。主要用于small object提高访问small

data object的一种方式。

I 该符号是对另一个符号的间接引用。

N 该符号是一个debugging符号。

R 该符号位于只读数据区。例如定义全局const int test[] = {123, 123};

则test就是一个只读数据区的符号。注意在cygwin下如果使用gcc直

接编译成MZ格式时,源文件中的test对应_test,并且其符号类型为D,

即初始化数据段中。但是如果使用m6812-elf-gcc这样的交叉编译工具,

源文件中的test对应目标文件的test,即没有添加下划线,并且其符号

类型为R。一般而言,位于rodata section。值得注意的是,如果在一

个函数中定义const char *test = “abc”, const char test_int = 3。

使用nm都不会得到符号信息,但是字符串“abc”分配于只读存储器中,

test在rodata section中,大小为4。

S 符号位于非初始化数据区,用于small object。

T 该符号位于代码区text section。

U 该符号在当前文件中是未定义的,即该符号的定义在别的文件中。例如,当前文件调用另一个文件中定义的函数,在这个被调用的函数在当前就

是未定义的;但是在定义它的文件中类型是T。但是对于全局变量来说,

在定义它的文件中,其符号类型为C,在使用它的文件中,其类型为U。

V 该符号是一个weak object。

W The symbol is a weak symbol that has not been specifically tagged as a weak object symbol.

- 该符号是a.out格式文件中的stabs symbol。

? 该符号类型没有定义

objdump基本用法

objdump有点象那个快速查看之流的工具,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。对于一般只想让自己程序跑起来的程序员,这个命令没有更多意义,对于想进一步了解系统的程序员,应该掌握这种工具,至少你可以自己写写shellcode了,或者看看人家给的exploit 中的shellcode是什么东西。更多关于目标文件的内容分析建议看看《深入理解计算机》这本书的第二部分第七章节。

常用法:

objdump [-a│--archive-headers]

[-b bfdname│--target=bfdname]

[-C│--demangle[=style] ]

[-d│--disassemble]

[-D│--disassemble-all]

[-z│--disassemble-zeroes]

[-EB│-EL│--endian={big │ little }]

[-f│--file-headers]

[--file-start-context]

[-g│--debugging]

[-e│--debugging-tags]

[-h│--section-headers│--headers]

[-i│--info]

[-j section│--section=section]

[-l│--line-numbers]

[-S│--source]

[-m machine│--architecture=machine]

[-M options│--disassembler-options=options]

[-p│--private-headers]

[-r│--reloc]

[-R│--dynamic-reloc]

[-s│--full-contents]

[-W│--dwarf]

[-G│--stabs]

[-t│--syms]

[-T│--dynamic-syms]

[-x│--all-headers]

[-w│--wide]

[--start-address=address]

[--stop-address=address]

[--prefix-addresses]

[--[no-]show-raw-insn]

[--adjust-vma=offset]

[--special-syms]

[-V│--version]

[-H│--help]

objfile...

选项详解:

--archive-headers

-a 显示档案库的成员信息,与 ar tv 类似

objdump -a libpcap.a

和 ar -tv libpcap.a 显示结果比较比较

显然这个选项没有什么意思。

--adjust-vma=offset

When dumping information, first add offset to all

the section addresses. This is useful if the sec-

tion addresses do not correspond to the symbol

table, which can happen when putting sections at particular addresses when using a format which can

not represent section addresses, such as a.out.

-b bfdname

--target=bfdname

指定目标码格式。这不是必须的,objdump能自动识别许多格式, 比如:objdump -b oasys -m vax -h fu.o

显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys 编译器生成的目标文件。objdump -i将给出这里可以指定的

目标码格式列表

--demangle

-C 将底层的符号名解码成用户级名字,除了去掉所有开头

的下划线之外,还使得C++函数名以可理解的方式显示出来。

--debugging

显示调试信息。企图解析保存在文件中的调试信息并以C语言

的语法显示出来。仅仅支持某些类型的调试信息。

--disassemble

-d 反汇编那些含有指令机器码的section

--disassemble-all

-D 与 -d 类似,但反汇编所有section

--prefix-addresses

反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。 显示效果并不理想,但可能会用到其中的某些显示,自己可以对比。

--disassemble-zeroes

一般反汇编输出将省略大块的零,该选项使得这些零块也被反汇编。

-EB

-EL

--endian={big|little}

这个选项将影响反汇编出来的指令。

little-endian就是我们当年在dos下玩汇编的时候常说的高位在高地址, x86都是这种。

--file-headers

-f 显示objfile中每个文件的整体头部摘要信息。

--section-headers

--headers

-h 显示目标文件各个section的头部摘要信息。

--help 简短的帮助信息。

--info

-i 显示对于 -b 或者 -m 选项可用的架构和目标格式列表。

--section=name

-j name 仅仅显示指定section的信息

--line-numbers

-l 用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用 使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求

编译时使用了-g之类的调试编译选项。

--architecture=machine

-m machine

指定反汇编目标文件时使用的架构,当待反汇编文件本身没有描述

架构信息的时候(比如S-records),这个选项很有用。可以用-i选项

列出这里能够指定的架构

--reloc

-r 显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇 编后的格式显示出来。

--dynamic-reloc

-R 显示文件的动态重定位入口,仅仅对于动态目标文件有意义,比如某些 共享库。

--full-contents

-s 显示指定section的完整内容。

objdump --section=.text -s inet.o | more

--source

-S 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时, 效果比较明显。隐含了-d参数。

--show-raw-insn

反汇编的时候,显示每条汇编指令对应的机器码,除非指定了

--prefix-addresses,这将是缺省选项。

--no-show-raw-insn

反汇编时,不显示汇编指令的机器码,这是指定 --prefix-addresses

选项时的缺省设置。

--stabs

Display the contents of the .stab, .stab.index, and

.stab.excl sections from an ELF file. This is only

useful on systems (such as Solaris 2.0) in which

.stab debugging symbol-table entries are carried in

an ELF section. In most other file formats, debug-

ging symbol-table entries are interleaved with

linkage symbols, and are visible in the --syms output.

--start-address=address

从指定地址开始显示数据,该选项影响-d、-r和-s选项的输出。

--stop-address=address

显示数据直到指定地址为止,该选项影响-d、-r和-s选项的输出。

--syms

-t 显示文件的符号表入口。类似于nm提供的信息

--dynamic-syms

-T 显示文件的动态符号表入口,仅仅对动态目标文件有意义,比如某些

共享库。它显示的信息类似于 nm -D|--dynamic 显示的信息。

--version 版本信息

objdump --version

--all-headers

-x 显示所有可用的头信息,包括符号表、重定位入口。-x 等价于

-a -f -h -r -t 同时指定。

objdump -x inet.o

readelf基本用法

readelf 负责显示ELF文件的信息

Usage: readelf elf-file(s)

Display information about the contents of ELF format files

Options are:

-a --all 全部 Equivalent to: -h -l -S -s -r -d -V -A -I

-h --file-header 文件头 Display the ELF file header

-l --program-headers 程序 Display the program headers

--segments An alias for --program-headers

-S --section-headers 段头 Display the sections' header

--sections An alias for --section-headers

-e --headers 全部头 Equivalent to: -h -l -S

-s --syms 符号表 Display the symbol table

--symbols An alias for --syms

-n --notes 内核注释 Display the core notes (if present)

-r --relocs 重定位 Display the relocations (if present)

-u --unwind Display the unwind info (if present)

-d --dynamic 动态段 Display the dynamic segment (if present)

-V --version-info 版本 Display the version sections (if present)

-A --arch-specific CPU构架 Display architecture specific information (if any). -D --use-dynamic 动态段 Use the dynamic section info when displaying symbols

-x --hex-dump= 显示 段内内容Dump the contents of section

-w[liaprmfFso] or

--debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]

显示DWARF2调试段内容 Display the contents of DWARF2 debug sections

-I --histogram Display histogram of bucket list lengths

-W --wide 宽行输出 Allow output width to exceed 80 characters

-H --help Display this information

-v --version Display the version number of readelf

Usage: readelf elf-file(s)

Display information about the contents of ELF format files

Options are:

-a --all 全部 Equivalent to: -h -l -S -s -r -d -V -A -I

-h --file-header 文件头 Display the ELF file header

-l --program-headers 程序 Display the program headers

--segments An alias for --program-headers

-S --section-headers 段头 Display the sections' header

--sections An alias for --section-headers

-e --headers 全部头 Equivalent to: -h -l -S

-s --syms 符号表 Display the symbol table

--symbols An alias for --syms

-n --notes 内核注释 Display the core notes (if present)

-r --relocs 重定位 Display the relocations (if present)

-u --unwind Display the unwind info (if present)

-d --dynamic 动态段 Display the dynamic segment (if present)

-V --version-info 版本 Display the version sections (if present)

-A --arch-specific CPU构架 Display architecture specific information (if any). -D --use-dynamic 动态段 Use the dynamic section info when displaying symbols -x --hex-dump= 显示 段内内容Dump the contents of section

-w[liaprmfFso] or

--debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]

显示DWARF2调试段内容 Display the contents of DWARF2 debug sections

-I --histogram Display histogram of bucket list lengths

-W --wide 宽行输出 Allow output width to exceed 80 characters

-H --help Display this information

ldd使用方法

2009-08-17 23:06

ldd命令

该命令用于判断某个可执行的 binary 档案含有什么动态函式库。

[root@test root]# ldd [-vdr] [filename]

参数说明:

--version 打印ldd的版本号

-v --verbose 打印所有信息,例如包括符号的版本信息

-d --data-relocs 执行符号重部署,并报告缺少的目标对象(只对ELF格式适用) -r --function-relocs 对目标对象和函数执行重新部署,并报告缺少的目标对象和函数(只对ELF格式适用)

--help 用法信息

如果命令行中给定的库名字包含'/',这个程序的libc5版本将使用它作为库名字;否则它将在标准位置搜索库。运行一个当前目录下的共享库,加前缀"./"。

错误:

ldd不能工作在a.out格式的共享库上。

ldd不能工作在一些非常老的a.out程序上,这些程序在支持ldd的编译器发行前已经创建。如果你在这种类型的程序上使用ldd,程序将尝试argc = 0的运行方式,其结果不可预知。

例如:

[songbei6@hn ~]$ ldd -v /lib/libc.so.6 ------必须跟绝对路径 /lib/ld-linux.so.2 (0x002c1000)

linux-gate.so.1 => (0x00cb3000)

Version information:

/lib/libc.so.6:

ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2

ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2

ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2

[root@hn songbei6]# ldd /usr/sbin/useradd

linux-gate.so.1 => (0x00fa3000)

libcrypt.so.1 => /lib/libcrypt.so.1 (0x00c90000)

libaudit.so.0 => /lib/libaudit.so.0 (0x005e2000)

libselinux.so.1 => /lib/libselinux.so.1 (0x002de000)

libc.so.6 => /lib/libc.so.6 (0x00101000)

libdl.so.2 => /lib/libdl.so.2 (0x00d18000)

libsepol.so.1 => /lib/libsepol.so.1 (0x002f7000)

/lib/ld-linux.so.2 (0x002c1000)

[root@hn songbei6]#

文章出处:https://www.doczj.com/doc/5d14673561.html,/

objcopy使用说明

objcopy用于将object的部分或全部内容拷贝到另一个object,从而可以实现格式的变换。objcopy可用用于将文件转换成S-record格式或者raw二进制格式。

例如,

xxxx-elf-objcopy –O srec test.o test.s19

则将test.o转换成s-record文件中。通常涉及到text段。

xxxx-elf-objcopy –O binary test.o test.bin

则将test.o转换成raw binary文件格式。

当将object文件转换成raw binary格式时,通常将去除掉symbols和relocation 信息。在生成s-record过程中,有时需要用选项“-S”,“-R”去除掉binary文件,s-record 文件不需要的相应信息。

此外,还需要注意到使用objcopy不能够改变大、小endian。

选项Desc

infile/outfile 源文件/目标文件

-I bfdname

--input-target=bfdname 输入文件的bfdname,可取值elf32-little,

elf32-big等,可用用objdump –I查看相应的信息

-O bfdname

--output-target=bfdname

输出文件的bfdname

-F bfdname

--target=bfdname

指定输入、输出文件的bfdname,目标文件格式

-j sectionname

--only-section=sectionname 只将由sectionname指定的section拷贝到输出文件

-R sectionname

--remove-section=sectionname

去除掉由sectionname指定的section

-S

--strip-all

去掉源文件的符号信息和relocation信息

-g

--strip-debug

去除掉调试符号信息和相关的段

-K symbolname

--keep-symbol=symbolname

保留由symbolname指定的符号信息

-N symbolname

--strip-symbol=symbolname

去除掉由symbolname指定的符号信息

-G symbolname

--keep-global-symbol=symbolname

-L symbolname

处理符号

--localize-symbol=symbolname

-W symbolname

--weaken-symbol=symbolname

-w

--wildcard

-x

--discard-all

-X

--discard-locals

-b byte

--byte=byte

每byteth byte中保留1 byte

-i interleave

--interleave=interleave

每隔interleave字节拷贝1 byte --gap-fill val 在section中填充val

--set-start val 设定新文件的start address

--change-start incr

--adjust-start incr

调整start address

--change-address incr --adjust-vma incr 调整所有sections的VMA(virtual memory address)和LMA(linear memory address)。

--change-section-address

section{=,+,-}val

--adjust-section-vma section

调整指定section的VMA/LMA地址

{=,+,-}val

--set-section-flags section=flag 指定指定section的flag,flag的取值可以alloc,contents, load, noload, readonly, code, data, rom, share, debug

--add-section sectionname=filename 添加一个section,该section的内容为filenmae 的内容

--rename-section oldname=

newname[,flags]

更改section的名

-V

--version

objcopy的version number

wav文件格式分析详解

wav文件格式分析详解 作者:曹京 日期:2006年7月17日 一、综述 WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个 字节便是“RIFF”。 WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。具体见下图: ------------------------------------------------ | RIFF WAVE Chunk | | ID = 'RIFF' | | RiffType = 'WAVE' | ------------------------------------------------ | Format Chunk | | ID = 'fmt ' | ------------------------------------------------ | Fact Chunk(optional) | | ID = 'fact' | ------------------------------------------------ | Data Chunk | | ID = 'data' | ------------------------------------------------ 图1 Wav格式包含Chunk示例 其中除了Fact Chunk外,其他三个Chunk是必须的。每个Chunk有各自的ID,位于Chunk最开始位置,作为标示,而且均为4个字节。并且紧跟在ID后面的是Chunk大小(去除ID和Size所占的字节数后剩下的其他字节数目),4个字节表示,低字节 表示数值低位,高字节表示数值高位。下面具体介绍各个Chunk内容。 PS: 所有数值表示均为低字节表示低位,高字节表示高位。 二、具体介绍 RIFF WAVE Chunk ================================== | |所占字节数| 具体内容| ================================== | ID | 4 Bytes | 'RIFF' | ---------------------------------- | Size | 4 Bytes | | ---------------------------------- | Type | 4 Bytes | 'WAVE' |

pe文件格式

PE文件格式详解(一)――基础知识 什么是PE文件格式: 我们知道所有文件都是一些连续(当然实际存储在磁盘上的时候不一定是连续的)的数据组织起来的,不同类型的文件肯定组织形式也各不相同;PE文件格式便是一种文件组织形式,它是32位Wind ow系统中的可执行文件EXE以及动态连接库文件DLL的组织形式。为什么我们双击一个EXE文件之后它就会被Window运行,而我们双击一个DOC文件就会被Word打开并显示其中的内容;这说明文件中肯定除了存在那些文件的主体内容(比如EXE文件中的代码,数据等,DOC文件中的文件内容等)之外还存在其他一些重要的信息。这些信息是给文件的使用者看的,比如说EXE文件的使用者就是Window,而DOC文件的使用者就是Word。Window可以根据这些信息知道把文件加载到地址空间的那个位置,知道从哪个地址开始执行;加载到内存后如何修正一些指令中的地址等等。那么PE文件中的这些重要信息都是由谁加入的呢?是由编译器和连接器完成的,针对不同的编译器和连接器通常会提供不同的选项让我们在编译和 联结生成PE文件的时候对其中的那些Window需要的信息进行设定;当然也可以按照默认的方式编译连接生成Window中默认的信息。例如:WindowNT默认的程序加载基址是0x40000;你可以在用VC连接生成EXE文件的时候使用选项更改这个地址值。在不同的操作系统中可执行文件的格式是不同的,比如在Linux上就有一种流行的ELF格式;当然它是由在Linux上的编译器和连接器生成的,

所以编译器、连接器是针对不同的CPU架构和不同的操作系统而涉及出来的。在嵌入式领域中我们经常提到交叉编译器一词,它的作用就是在一种平台下编译出能在另一个平台下运行的程序;例如,我们可以使用交叉编译器在跑Linux的X86机器上编译出能在Arm上运行的程序。 程序是如何运行起来的: 一个程序从编写出来到运行一共需要那些工具,他们都对程序作了些什么呢?里面都涉及哪些知识需要学习呢?先说工具:编辑器-》编译器-》连接器-》加载器;首先我们使用编辑器编辑源文件;然后使用编译器编译程目标文件OBJ,这里面涉及到编译原理的知识;连接器把OBJ文件和其他一些库文件和资源文件连接起来生成EXE文件,这里面涉及到不同的连接器的知识,连接器根据OS的需要生成EXE文件保存着磁盘上;当我们运行EXE文件的时候有W indow的加载器负责把EXE文件加载到线性地址空间,加载的时候便是根据上一节中说到的PE文件格式中的哪些重要信息。然后生成一个进程,如果进程中涉及到多个线程还要生成一个主线程;此后进程便开始运行;这里面涉及的东西很多,包括:PE文件格式的内容;内存管理(CPU内存管理的硬件环境以及在此基础上的OS内存管理方式);模块,进程,线程的知识;只有把这些都弄清楚之后才能比较清楚的了解这整个过程。下面就让我们先来学习PE文件格式吧。

OBJ文件格式详解

3D中的OBJ文件格式详解 常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序;第二种是Alias|Wavefront公司推出的OBJ模型文件。本文对第二种obj模型文件进行分析。 3D文件格式,常见的有几种"*.3ds","*.max","*.lw","*.mb","*.dxf","*.obj"。但是,OBJ文件的具体特征,却很少有人能给出较为圆满的描述。很多人认识OBJ文件是从使用Poser开始的,Poser是一款人体建模软件,要把Poser生成的人体导出到其它3D软件中进行再加工,就用到了OBJ文件。OBJ文件是一种标准的3D模型文件格式,很适合用于3D 软件模型之间的互导。比如在3dsMax或LightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ 文件的读写,不过很多软件需要通过插件才能做到这一点。 另外,作为一种优秀的文件格式,很多游戏引擎也都支持OBJ文件的读取。3D软件模型之间的互导是一件很常见的事情,不幸的是,目前的3D软件模型导出功能都不那么完美,经常会出现缺面少线的情况,有时还会遇到导出的模型根本打不开的情况。 OBJ文件是一种文本文件格式,比起二进制文件为主、连每个块的用途也得试探来试探去的3DS,文本文件为主的OBJ对我们更友好。与3DS文件的树状[块结构]不同,OBJ文件只是很单纯的字典状结构,没有块ID来表征名字而是简单地用易懂的表意字符来表示。总之看上去是赏心悦目的样子,而苦处也就只有实际写导入代码的时候才知道了- -。OBJ文件优化了存储但劣化了读写。 如果Maya自身的模型出错,也可以先转成OBJ格式,修改之后再导回Maya。 OBJ文件-- 概念 OBJ文件是Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种文件格式,这种格式同样也以通过Maya读写。 OBJ文件是一种文本文件,可以直接用写字板打开进行查看和编辑修改。 另外,有一种与此相关二进制文件格式(使用".MOD"后缀),二进制格式作为专利未公开,因此在这里我们不作讨论。 OBJ最近的有文档的版本是v3.0,代替以前的v2.11版本。 OBJ3.0格式支持多边形(Polygon),直线(Lines),表面(Surfaces),和自由形态曲线(Free-form Curves)。 直线和多角形通过它们的点来描述,曲线和表面则根据于它们的控制点和依附于曲线类型的额外信息来定义。这些信息支持规则和不规则的曲线,包括那些基于贝塞尔(Bezier)曲线,B样条(B-spline),基数(Cardinal/Catmull-Rom样条),和泰勒方程(Taylor equations)的曲线。 1、OBJ文件-- 特点 (1)OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信 息。 (2)OBJ文件主要支持多边形(Polygons)模型。

PE格式基础及程序的装入

DOS MZ header部分是DOS时代遗留的产物,是PE文件的一个遗传基因,一个Win32程序如果在DOS下也是可以执行,只是提示:“This program cannot be run in DOS mode.”然后就结束执行,提示执行者,这个程序要在Win32系统下执行。 DOS stub 部分是DOS插桩代码,是DOS下的16位程序代码,只是为了显示上面的提示数据。这段代码是编译器在程序编译过程中自动添加的。 PE header 是真正的Win32程序的格式头部,其中包括了PE格式的各种信息,指导系统如何装载和执行此程序代码。 Section table部分是PE代码和数据的结构数据,指示装载系统代码段在哪里,数据段在哪里等。对于不同的PE文件,设计者可能要求该文件包括不同的数据的Section。所以有一个Section Table 作为索引。Section多少可以根据实际情况而不同。但至少要有一个Section。如果一个程序连代码都没有,那么他也不能称为可执行代码。在Section Table后,Section数目的多少是不定的。 二、程序的装入 当我们在explorer.exe(资源管理器)中双击某文件,执行一个可执行程序,系统会根据文件扩展名启动一个程序装载器,称之为Loader。Loader会首先检查DOS MZ Header,如果存在,就继续寻找PE header,如果这两项都不存在,就认为是DOS 16位代码,如果只存在DOS MZ Header,而其中又指示了而其中又指示了PE Header 的位置,那么Loader 就判定此文件不一个有效的PE文件,拒绝执行。 如果DOS Header 和PE Header都正常有效,那么Loader就会根据PE Header 及Section Table的指示,将相应的代码和数据映射到内存中,然后根据不同的Section进行数据的初始化,最后开始执行程序段代码。 三、PE格式高级分析 下面我们以一个真实的程序为例详细分析PE格式,分析PE格式最好有PE分析器,常用的软件是Lord PE,也有其它的分析工具和软件如PE Editor 、Stud PE等。 先分析一下磁盘文件的内容,这里我们使用UltraEdit32(UE)工具,这是一个实用的文件编辑器,可以编辑文本和二进制文件。

PDF文件结构详解

PDF(Portable Document Format,便携式文档结构)是一种很有用的文件格式,其最大的特点是平台无关而且功能强大(支持文字/图象/表单/链接/音乐/视频等).做PDF 的解析,首先要熟悉PDF文件的物理结构和逻辑结构。PDF文件物理结构可分为以下几 块: 1.文件头 文件头是PDF文件的第一行,格式如下: %PDF-1.4 这是个固定格式,表示这个PDF文件遵循的PDF规范版本,目前PDF的生成工具,除了官方的acrobat,其他生成的以1.4版本的居多。对于做PDF开发来说,一个最简单的原则就是生成PDF的时候尽量符合低版本规范,以保证大多数解析器能支持;解析PDF的时候尽量支持高版本的规范,以保证支持大多数工具生成的PDF文件。 从1.4版本以后,PDF文件的版本并不唯一的只是在这里表示了,可能后面会改写(catalog的Version词条),所以解析PDF的时候,如果这里的版本大于等于1.4,应该再比较一下catalog里面的version,取其中高一点的版本。 2.对象集合 这是一个PDF文件最重要的部分,文件中用到的所有对象,包括文本/图象/音乐/视频/字体/超连接/加密信息/文档结构信息等等,都在这里定义。格式如下: 2 0 obj ... end obj 一个对象的定义包含4个部分: 前面的2是对象序号,其用来唯一标记一个对象;0是生成号,按照PDF规范,如果一个PDF文件被修改,那这个数字是累加的,它和对象序号一起标记是原始对象还是修改后的对象,但是实际开发中,很少有用这种方式修改PDF的,都是重新编排对象号;obj和endobj 是对象的定义范围,可以抽象的理解为这就是一个左括号和右括号;省略号部分是PDF规定的任意合法对象(一共8种,见后面附A)。 可以通过R关键字来引用任何一个对象,比如要引用上面的对象,可以使用2 0 R,需要主意的是,R关键字不仅可以引用一个已经定义的对象,还可以引用一个并不存在的对象,而且效果就和引用了一个空对象一样。 3.交叉引用表

PE文件头解析大全

PE可选头部 PE可执行文件中接下来的224个字节组成了PE可选头部。虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。OPTHDROFFSET宏可以获得指向可选头部的指针: PEFILE.H #define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + \ ((PIMAGE_DOS_HEADER)a)->e_lfanew + \ SIZE_OF_NT_SIGNATURE + \ sizeof(IMAGE_FILE_HEADER))) 可选头部包含了很多关于可执行映像的重要信息,例如初始的堆栈大小、程序入口点的位置、首选基地址、操作系统版本、段对齐的信息等等。IMAGE_OPTIONAL_HEADER结构如下: WINNT.H typedef struct _IMAGE_OPTIONAL_HEADER { // // 标准域 // USHORT Magic; UCHAR MajorLinkerVersion; UCHAR MinorLinkerVersion; ULONG SizeOfCode; ULONG SizeOfInitializedData; ULONG SizeOfUninitializedData; ULONG AddressOfEntryPoint; ULONG BaseOfCode; ULONG BaseOfData; // // NT附加域 // ULONG ImageBase; ULONG SectionAlignment;

ULONG FileAlignment; USHORT MajorOperatingSystemVersion; USHORT MinorOperatingSystemVersion; USHORT MajorImageVersion; USHORT MinorImageVersion; USHORT MajorSubsystemVersion; USHORT MinorSubsystemVersion; ULONG Reserved1; ULONG SizeOfImage; ULONG SizeOfHeaders; ULONG CheckSum; USHORT Subsystem; USHORT DllCharacteristics; ULONG SizeOfStackReserve; ULONG SizeOfStackCommit; ULONG SizeOfHeapReserve; ULONG SizeOfHeapCommit; ULONG LoaderFlags; ULONG NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; 如你所见,这个结构中所列出的域实在是冗长得过分。为了不让你对所有这些域感到厌烦,我会仅仅讨论有用的——就是说,对于探究PE文件格式而言有用的。 标准域 首先,请注意这个结构被划分为“标准域”和“NT附加域”。所谓标准域,就是和UNIX可执行文件的COFF 格式所公共的部分。虽然标准域保留了COFF中定义的名字,但是Windows NT仍然将它们用作了不同的目的——尽管换个名字更好一些。 ·Magic。我不知道这个域是干什么的,对于示例程序EXEVIEW.EXE示例程序而言,这个值是0x010B

文件格式

常用文件格式 一、 关于常用文件的统一格式要求 (一) 通知通知(样本参见附件一) 1、 标题要求:标题要居中(较长可分为两行),采用二号宋体加粗, 并写明“关于XXXX 的通知”。 2、 正文要求:采用四号宋体或仿宋体书写,通知对象顶格写。正 文与标题间空一行,开始首行空两格。换行首行空两格。会议性通知发布内容(如:与会人、会议地点、会议时间等)采用大标题形式逐条列出。 3、 落款要求:采用四号宋体加粗,落款与正文间空两行,并居于 通知右下角(如:木槿感恩支教团);组织名称在上,日期换行并居于落款方的下方,并用汉字格式(如:二○一○年八月十一日)或数字格式(如:2010年8月11日)书写。 (二) 报告性报告性 报告性、、建议性文件 1、 标题要求:标题要居中(较长可分为两行),采用二号宋体加粗, 并写明“木槿感恩支教团XX 部关于XXXX 的报告(建议)”。 2、 正文要求:采用四号宋体书写,报告对象顶格写。正文与标题 间空一行,开始首行空两格。换行首行空两格。 3、 落款要求:采用四号宋体加粗,落款与正文间空两行,并居于 通知右下角(如:木槿感恩支教团XX 部);组织名称在上,日期换行并居于落款方的下方,并用汉字格式(如:二○一○年八月十一日)或数字格式(如:2010年8月11日)书写。 (三) 会议会议 会议记录记录 1、 会议记录是会议指定的记录人员对会议情所做的原始记载,是 与会议同步形成的实录性文书,一般不对外公布。 2、 写作要求: (1) 会议组织概况:会议名称、地点、与会人员(一般要逐个列出,

人员较多时可概括说明人数或人员身份)、缺席人员、会议议程、主持人、记录人等,这些要素最好在会前写好。 (2) 会议基本内容:会议议题、讨论发言情况、与会者提出的意见和建议、领导人讲话、议定事项、表决结果、通过的决议或文 件标题等,这些内容可根据会议性质和重要程度做摘要或详细 记载。 (3) 记录人员应当善于抓住要点,书写清晰、快速,没有在会上将信息记录完整的,要在会后进行整理。 工作计划 (四)工作计划 工作计划,是各个部门对今后一段时间的工作进行事先安排,明确目标,提出要求,制定措施和步骤的一种文体。 1、封面要求(参见附件四):标题第一行为:湘潭大学木槿感恩支教团;第二行为:活动名称(如:XX部XXXX年),居中,采用小一号宋体或楷体加粗。竖直居中写:工作计划,采用粗号宋体、楷体或黑体;最后落款居中写:木槿感恩支教团,采用二号宋体或楷体加粗,组织在上,日期换行并居于落款方的下方,并用数字格式书写(如2010年8月11日)。封面不加页眉、页脚及页码。 2、标题要求:标题要居中(较长可分为两行),采用二号宋体或楷体加粗,并写明计划的名称。如“木槿感恩支教团XX部门关于开展XX的工作计划”或“木槿感恩支教团XX部门XXXX年工作计划”。 3、正文要求: 采用四号楷体或宋体书写,正文与标题间空一行,开始首行空两格。换行首行空两格。 (1) 前言:是计划的总纲部分,包括计划的背景、指导思想、目的、现状、总目标及总任务、完成计划对今后的影响等。这 些内容不一定完全同时具备,可根据具体内容取舍。 (2) 主体:主要写计划的“三要素”,即目标、措施和步骤。

PE文件结构

检验PE文件的有效性 <1>首先检验文件头部第一个字的值是否等于IMAGE_DOS_SIGNATURE,是则表示DOS MZ header有效 <2>一旦证明文件的Dos header 有效后,就可用e_lfanew来定位PE header <3>比较PE header 的第一个字的值是否等于IMAGE_NT_HEADER,如果前后两个值都匹配. PS.WinHex使用方法 1.Alt+G跳到指定位置 2.Ctrl+Shift+N放入新文件 3.大文件扩容,新建一个扩容大小+1的文件,把这个文件的数据复制后写入整个文件的尾地址. 4.文本搜索ctrl+F 5.十六进制搜索ctrl+alt+x 6.文本显示F7 7.打开内存alt+F9 8.进制转换器F8 9.分析选块F2 10.计算HASH ctrl+F2 11.收集文本信息ctrl+F10 12.编辑模式F6 一.IMAGE_DOS_HEADER <1>位置00H,WORD(2个字节)的e_magic为4D5A,即MZ <2>位置3CH,60,LONG(4个节节)的e_lfanew为64+112=176即B0H, 二.IMAGE_NT_HEADERS <1>位置B0H,DWORD(4个字节),PE开始标记,写入50450000,即PE <2>位置B4H,WORD,PE所要求的CPU,对于Intel平台,为4C01 <2>位置B6,WORD,PE中段总数,计划有3个段,.text代码段,.rdata只读数据段,.data全局变量数据段,所以值为0300, <3>位置C4,WORD,表示后面的PE文件可选头的占空间大小,即224字节(E0),值为E000 <4>位置C6,WORD,表示文件是EXE还是DLL,如果是可执行文件写0200,如果是dll,写0020, <5>位置C8,WORD,表示文件格式,如果是0B01表示.exe,如果是0701表示ROM映像

视频文件格式详解

以下内容均来自网络。不是本人原创,属于转载内容。但对很多玩视频的人,意义重大。其中包含了很多关于电影相关的术语,一定要看完,才有用。 现在很多人下载电影很迷茫不知道怎么下不知道怎么选择接下来就介绍一下电影的一些知识. 首先我们来举个栗子 视频文件:Mr.and.Mrs.Smith.2005.XviD.AC3.WAF.avi 它表示电影名为Mr.and.Mrs.Smith;发布年:2005年;视频编码:XviD;音频编码:AC3;压缩组织:WAF;格式为AVI。字幕文件:Cht.gb5.srt 它表示SRT字幕;繁体中文GB5编码。注:CHT表示繁体中文,CHS:表示简体中文 接下来就是介绍各种常见的一些来源,格式和术语 一来源分类 1.CAM(枪版)——珍爱生命,远离枪版 CAM 通常是用数码摄像机从电影院盗录。有时会使用小三角架,但大多数时候不可能使用,所以摄像机会抖动。因此我们看到画面通常偏暗人物常常会失真,下方的字幕时常会出现倾斜。由于声音是从摄像机自带的话筒录制,所以经常会录到观众的笑声等声音。因为这些因素,图象和声音质量通常都很差。 举例说明:Journey.To.The.Center.Of.The.Earth.CAM.XViD-CAMERA(地心游记3D枪版) 2.TS(准枪版)——只比枪版好一点 TS 与CAM版的标准是相同的。但它使用的是外置音源(一般是影院座椅上为听力不好的人设的耳机孔)这个音源不能保证是好的音源,因为受到很多背景噪音的干扰。TS是在空的影院或是用专业摄像机在投影室录制,所以图象质量可能比CAM好。但画面的起伏很大。论坛上常出现的有一般TS版和经过修复清晰TS版 举例说明:Iron.Man.PROPER.TS.XviD-iLG(钢铁侠TS版) 3.TC(胶片版)——基本也可以忽略 TC使用电视电影机从胶片直接数字拷贝。画面质量还不错,但亮度不足,有些昏暗。很多时候制作TC使用的音源来自TS,因此音质很差,但画面质量远好过TS。如果不是太讲究的话TC版还是不错的选择。 举例说明:Madagascar.2005.TC.XviD.AC3.avi(马达加斯加TC版) 4.DVDSCR(预售版)——最差也要看这个

WAVE文件格式分析

WAVE 文件作为多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的。每个WAVE文件的头四个字节便是“RIFF”。WAVE 文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV 文件标识段和声音数据格式说明段两部分。WAVE文件各部分内容及格式见后文。 常见的声音文件主要有两种,分别对应于单声道(11.025KHz 采样率、8Bit 的采样值)和双声道(44.1KHz 采样率、16Bit 的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期 内声音模拟信号的积分值。 对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。 WAVE 文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE 文件是由样本组织而成的。在单声道WAVE 文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE 文件中,样本是交替出现的。 WAVE 文件除了前面一小段文件头对数据组织进行说明之外,Data 块就是声音的原始采样数据,WAVE 文件虽然可以压缩,但一般都使用不压缩的格式。44.1KHz 采样率、16Bit 的分辨率、双声道,所以WAVE可以保存音质要求非常高的声音文件,CD 采用的也是这种格式,声音方面的专家或是音乐发烧友们应该非常熟悉。但这种文件的体积也非常大,以44.1KHz 16bit 双声道的数据为例,一分钟的声音数据量为:4100*2byte*2channel*60s/1024/1024=10.09M 。所以不合适在网上传送。

对象文件格式分析

对象文件格式分析工具: objdump, nm,ar 前言 如果普通编程不需要了解这些东西,如果想精确控制你的对象文件的格式或者你想查看一下文件对象里的内容以便作出某种判断,刚你可以看一下下面的工具:objdump, nm, ar。当然,本文不可能非常详细的说明它们的使用方法和功能。如果你觉得本文不够清楚,你可以使用:man. 我的计划只是想让更多的人了解这些工具,以后在今后的编程过程中能有所帮助。 1. 库文件操作命令:ar ----非常好的东东。让你能查看函数库里的详细情况和用多个对象文件生成一个库文件。可以将多个.o打包成一个.a或者将一个.a拆分成.o 1. 经常用法: 1. ar -t libname.a //显示所有对象文件(.o文件)的列表.例:# ar t libtest.a libtest1.o libtest2.o 2. ar -rv libname.a objfile1.o objfile2.o ... objfilen.o //把objfile1.o--objfilen.o打包成一个库文件 2. ar 选项 d:从库中删除模块。按模块原来的文件名指定要删除的模块。如果使用了任选项v则列出被删除的每个模块。 m:该操作是在一个库中移动成员。当库中如果有若干模块有相同的符号定义(如函数定义),则成员的位置顺序很重要。如果没有指定任选项,任 何指定的成员将移到库的最后。也可以使用'a','b',或'I'任选项移动到指定的位置。 p:显示库中指定的成员到标准输出。如果指定任选项v,则在输出成员的内容前,将显示成员的名字。如果没有指定成员的名字,所有库中的文 件将显示出来。 q:快速追加。增加新模块到库的结尾处。并不检查是否需要替换。'a','b',或'I'任选项对此操作没有影响,模块总是追加的库的结尾处。如果使 用了任选项v则列出每个模块。这时,库的符号表没有更新,可以用'ar s'或ranlib来更新库的符号表索引。 r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消 息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。 t:显示库的模块表清单。一般只显示模块名。 x:从库中提取一个成员。如果不指定要提取的模块,则提取库中所有的模块。 下面在看看可与操作选项结合使用的任选项: a:在库的一个已经存在的成员后面增加一个新的文件。如果使用任选项a,则应该为命令行中membername参数指定一个已经存在的成员名。 b:在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项b,则应该为命令行中membername参数指定一个已经存在的成员名。 c:创建一个库。不管库是否存在,都将创建。 f:在库中截短指定的名字。缺省情况下,文件名的长度是不受限制的,可以使用此参数将文件名截短,以保证与其它系统的兼容。 i:在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项i,则应该为命令行中membername参数指定一个已经存在的成员名(类似 任选项b)。 l:暂未使用 N:与count参数一起使用,在库中有多个相同的文件名时指定提取或输出的个数。 o:当提取成员时,保留成员的原始数据。如果不指定该任选项,则提取出的模块的时间将标为提取出的时间。 P:进行文件名匹配时使用全路径名。ar在创建库时不能使用全路径名(这样的库文件不符合POSIX标准),但是有些工具可以。 s:写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。甚至对于没有任何变化的库也作该动作。对一个库做ar s等同于对该库做 ranlib。 S:不创建目标文件索引,这在创建较大的库时能加快时间。 u:一般说来,命令ar r...插入所有列出的文件到库中,如果你只想插入列出文件中那些比库中同名文件新的文件,就可以使用该任选项。该任选 项只用于r操作选项。 v:该选项用来显示执行操作选项的附加信息。 V:显示ar的版本. 2. nm --列出目标文件(.o)的符号清单。。NND,太激动了。刚知道此命令时让我三天没睡好觉。我就使劲用了一把。 1. 常用法:

pe文件结构 入门 教程

三年前,我曾经写了一个手工打造可执行程序的文章,可是因为时间关系,我的那篇文章还是有很多模糊的地方,我一直惦记着什么时候再写一篇完美的,没想到一等就等了三年。因为各种原因直到三年后的今天我终于完成了它。现在把它分享给大家,希望大家批评指正。 我们这里将不依赖任何编译器,仅仅使用一个十六进制编辑器逐个字节的手工编写一个可执行程序。以这种方式讲解PE结构,通过这个过程读者可以学习PE结构中的PE头、节表以及导入表相关方面的知识。为了简单而又令所有学习程序开发的人感到亲切,我们将完成一个Hello World! 程序。功能仅仅是运行后弹出一个消息框,消息框的内容是Hello World!。 首先了解一下Win32可执行程序的大体结构,就是通常所说的PE结构。 如图1所示PE结构示意图: 图1 标准PE结构图 由图中可以看出PE结构分为几个部分: MS-DOS MZ 头部:所有PE文件必须以一个简单的DOS MZ 头开始。有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随MZ header 之后的DOS程序。以此达到对Dos系统的兼容。(通常情况DOS MZ header总共占用64byte)。 MS-DOS 实模式残余程序:实际上是个有效的EXE,在不支持PE文件格式的操作系统中,它将简单显

示一个错误提示,大多数情况下它是由汇编编译器自动生成。通常,它简单调用中断21h,服务9来显示字符串"This program cannot run in DOS mode"。(在我们写的程序中,他不是必须的,可以不予以实现,但是要保留其大小,大小为112byte,为了简洁,可以使用00来填充。) PE文件标志:是PE文件结构的起始标志。(长度4byte, Windows程序此值必须为0x50450000) PE文件头:是PE相关结构 IMAGE_NT_HEADERS 的简称,其中包含了许多PE装载器用到的重要域。执行体在支持PE文件结构的操作系统中执行时,PE装载器将从DOS MZ header中找到PE header的起始偏移量,跳过了MS-DOS 实模式残余程序,直接定位到真正的文件头PE header,长度20byte。 PE文件可选头:虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。(长度 224byte )。 各段头部:又称节头部,一个Windows NT的应用程序典型地拥有9个预定义段(节),它们是“.text”、“.bss”、“.rdata”、“.data”、“.rsrc”、“.edata”、“.idata”、“.pdata”和“.debug”。一些应用程序不需要所有的这些段,同样还有些应用程序为了自己特殊的需要而定义了更多的段。(每个段头部占40byte,我们这里也不需要所有的段,仅需3个段。) 通常我们是将PE整个结构分成四个部分,把MS-DOS MZ 头部和MS-DOS 实模式残余程序作为第一部分,可以称他为DOS部分,而PE文件标志、PE文件头、PE文件可选头三个部分作为第二部分,称之为PE头部分,因为这部分才是Windows下真正需要的部分,所以从PE文件标志开始才是真正的PE部分。各段头部是第三部分,称之为节表。它详细描述了PE文件中各个节的详细信息。最后就是各个节的实体部分了,称为节数据。 以上仅仅是对PE结构各部分的大体讲解。接下来再手写这个Hello World!程序过程中,我将详细介绍每个部分的含义。 首先准备一下工具,一个十六进制编辑器足以。我们这里使用VC++ 6.0所携带的十六进制编辑器,您也可以使用如WinHex等十六进制编辑工具。 打开VC,选择文件,新建菜单项,然后选择一个二进制文件,单击确定。一切就绪了,下面就开始手写可执行程序,如图2所示:

PE结构4——区段与代码类型

甲壳虫免杀VIP教程 https://www.doczj.com/doc/5d14673561.html, 专业的免杀技术培训基地 我们的口号:绝对不一样的免杀教程!绝对不一样的实战体验!清晰的思路!细致全面的讲解!让你感到免杀原来可以这么简单! 动画教程只是起到技术交流作用.请大家不用利用此方法对国内的网络做破坏. 国人应该团结起来一致对外才是我们的责任.由此动画造成的任何后果和本站 无关. -------------------------------------------------------------------- 【免杀PE结构班】制作:Just41(carrieyz) 第四节【PE文件常见区段及其代码类型】 一、区段表的结构 PE文件格式中,所有的区段信息位于可选PE头之后。每个区段信息为40个字节长,并且没有任何填充信息。区段信息被定义为以下的结构: 学名:免杀技术说明大小LOADPE Name:区段名称,如".text" [8h] SizeOfRawData:RV A偏移大小[4h] VSize VirtualAddress:区段RV A起始地址[4h] VOffset PointerToRawData:区段物理偏移大小(偏移量)[4h] RSize PhysicalAddress:区段物理起始地址[4h] ROffset VirtualSize:真实长度[4h] PointerToRelocations:重定位的偏移[4h] PointerToLinenumbers:行号表的偏移[4h] NumberOfRelocations:重定位项数目[2h] NumberOfLinenumbers:行号表的数目[2h] Characteristics:区段属性[4h] 标志 计算方式: 区段表的文件偏移地址=PE头的文件偏移地址+14h+可选PE头大小+1 首先从0X3Ch处得到PE头的文件偏移地址,然后由PE头的文件偏移地址+14h得到可选PE头大小,再将上面三个数据相加再+1就得到区段表的文件偏移地址了。 VSize的大小只是效验下是否跨越下一个节了,或者是否超出了SizeOfImage,如果出现越界问题,提示非法32位应用程序,否则的话,它的值没有意义,节的大小不是由它决定的......对非最后一个节,按节间VOffset之差,最后一节用SizeOfImage-VOffset。

pe文件格式

pe文件格式:PE文件格式(1) 疯狂代码 https://www.doczj.com/doc/5d14673561.html,/ ?:http:/https://www.doczj.com/doc/5d14673561.html,/Waigua/Article60255.html 介绍说明:希望本文能够对初级入门CRACKER有定帮助翻译存在疏漏或者不准确希望来信指出感谢您指导!感谢看雪为我们提供这个交流平台让我们技术和时俱进!! 前言: PE("portableexecutable")文件格式是针对MSwindowsNT,windows95and win32s可执行 2进制代码(DLLsandprograms)在windowsNT内,驱动也是这个格式也可以用于对象文件和库 这个格式是Microsoft设计并在1993经过TIS(toolerfacestandard)委员会 (Microsoft,Intel,Borland,Watcom,IBM等)标准化了它基于在UNIX和VMS上运行对象文件和可执行文件COFF"commonobjectfileformat"格式 win32SDK包括个头文件包括对PE格式定义我将提及成员名和定义你也可能发现DLL文件"imagehelp.dll"非常有用它是NT部分但文档很少它些在"DeveloperNetwork"被描述 总览: 在PE文件开始我们可以发现MSDOS执行部分("stub");这使得任何个PE文件是有效DOS执行文件在DOS-stub的后是32位魔数0x00004550(IMAGE_NT_SIGNATURE).然后是个COFF格式文件头指明在何种机器上运行多少个节在里面连接时间是否是可执行文件或者DLL等DLL和可执行文件区别:DLL不能够启动只可以被其他可执行文件使用个可执行文件不能够连接到另个可执行文件 接着我们看到个可选文件头optionalheader(虽然叫“可选”它实际上直存在) COFF把可选文件头用于库不用于目标文件这里告诉我们文件如何被调入:起始地址预留堆栈数数据段尺寸 个有趣部分是尾巴上数据目录datadirectories这些目录包含指向节内数据指针例如如果文件有输出目录可以在成员IMAGE_DIRECTORY_ENTRY_EXPORT内发现个指针指向那个目录(目录描述结构->THUNKDATA结构->BYNAME结构)他将指向个节 在头后面是节头实际上节内容就是真正需要运行个所需要东西所有头和目录成员就是帮你找到它每个节有几个标志:对齐包含数据类型(化数据等)是否可以共享等及数据自身多数节含有个或多个通过“可选头”内数据目录项引用目录没有目录类型内容是化数据或者可执行代码(节是物理意义上内容组织目录是逻辑意义上内容

常用文件格式大全

不同的文件,有不同的文件格式,区别这些格式常常是文件名的后缀名不同,现统计常用文件后缀名如下,供大家参考和查阅。 O 对象代码库文件 O01 台风声音文件 OBD Microsoft Office活页夹 OBJ 对象文件 OBZ Microsoft Office活页夹向导 OCX Microsoft对象链接与嵌入定制控件 ODS Microsoft Outlook Express邮箱文件 OFF 3D 网状物对象文件格式 OFN Microsoft Office FileNew文件 OFT Microsoft Outlook模板 OKT Oktalyzer音乐模块(MOD)文件 OLB OLE对象库 OLE OLE对象 OOGL 面向对象图形库 OPL 组织者编程语言源文件——Psion/Symbian OPO OPL输出可执行文件 OPT Microsoft Developer Studio文件 OPX OPL扩展DLL(动态链接库) ORA Oracle 7 配置文件 ORC Oracle 7脚本文件 ORG Lotus Organizer 文件 OR2 Lotus Organizer 2 文件 OR3 Lotus Organizer 97 文件 OSS Microsoft Office查找文件 OST Microsoft Exchange / Outlook 离线文件 OTL Super NoteTab 模板文件 OUT C语言输出文件 P 对象代码库文件 P3 Primavera Project Planner(工程设计器)文件 P10 Tektronix Plot 10 绘图文件 P65 PageMaker 6.5文件 P7C Digital ID 文件(MIME) PAB Microsoft个人地址簿 PAC [请不要讲脏话] Studio Ⅱ包 PAK Quake WAD文件 PAL 压缩文件 PART Go!Zilla部分下载文件 PAS Pascal源代码 PAT DataCAD Hatch模式文件;CorelDRA W模式;高级Gravis Ultrasound / Forte 技术;碎片文件 PBD PowerBuilder动态库,作为本地DLL的一个替代物

【翻译】“PE文件格式”1.9版 完整译文(附注释)

标题:【翻译】“PE文件格式”1.9版完整译文(附注释) 作者:ah007 时间: 2006-02-28,13:32:12 链接: https://www.doczj.com/doc/5d14673561.html,/showthread.php?t=21932 $Id: pe.txt,v 1.9 1999/03/20 23:55:09 LUEVELSMEYER Exp $ PE文件格式系列译文之一---- 【翻译】“PE文件格式”1.9版完整译文(附注释) ========================================================= 原著:Bernd. Luevelsmeyer 翻译:ah007 [注意:本译文的所有大小标题序号都是译者添加,以方便大家阅读。圆圈内的数字是注释的编号,其中注释②译自微软的《PECOFF规范》,其它译自网络。----译者] 一、前言(Preface) ------------------ PE(“portable executable”,可移植的可执行文件)文件格式,是微软WindwosNT,Windows95和Win32子集①中的可执行的二进制文件的格式;在WindowsNT中,驱动程序也是这种格式。它还能被应用于各种目标文件②和库文件中。 这种文件格式是由微软设计的,并于1993年被TIS(tool interface standard,工具接口标准)委员会(由Microsoft,Intel,Borland,Watcom,IBM,等等组成)所批准,它明显的基于COFF文件格式的许多知识。COFF (“common object file fromat”,通用目标文件格式)是应用于好几种UNIX系统③和VMS④系统中的目标文件和可执行文件的格式。 Win32 SDK⑤中包含一个名叫的头文件,其中含有很多用于PE格式的#define和typedef定义。我将逐步地提到其中的很多结构成员名字和#define定义。 你也可能发现DLL文件“imagehelp.dll”很有用途,它是WindowNT的一部分,但其书面文件却很缺乏。它的一些功用在“Developer Network”(开发者网络)中有所描述。 二、总览(General Layout) ------------------------- 在一个PE文件的开始处,我们会看到一个MS-DOS可执行体(英语叫“stub”,意为“根,存根”);它使任何PE文件都是一个有效的MS-DOS可执行文件。 在DOS-根之后是一个32位的签名以及魔数0x00004550 (IMAGE_NT_SIGNATURE)(意为“NT签名”,也

相关主题
文本预览
相关文档 最新文档