QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2300|回复: 1
打印 上一主题 下一主题

[转载]COFF文件格式(6)

[复制链接]
字体大小: 正常 放大
Blackbird        

8

主题

2

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-9-17 14:08 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<><STRONG>重要声明:本文乃转载自其他社区,由于在下无法获得任何有关作者和出处的信息,所以不能在此登出,恳请作者原谅,并希望知情者能告知在下。本着资源的共享的精神,在下深信作者不会拒绝在下的转载行为。同时强烈BS数学中国的下载系统,它不但不能及时给予他人需要的帮助,还浪费了他人大量的时间,仅仅是为了获得无聊的点数,而且遗憾的是,那些点数并不能保证你真能获得帮助!</STRONG></P>, {8 s8 K+ g: i- [3 b9 d* O
<><STRONG>字符串表<br></STRONG>    不用多说,瞎子也能看出这个表是用来保存字符串的。它紧接在符号表后。至于为什么要保存字符串,前面已经说过了。这里就不再多说了,只说说字符串的保存格式。<br>     字符串表是所有节中最简单一节。如下图:</P>
5 v3 Z8 U6 H* Y8 z<DIV align=center>0                             4                        </DIV>$ ~, t+ @* Q% \2 O9 j! _$ y/ ]
<DIV>5 {  C  q* `4 V9 @2 i* A
<TABLE  cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=162 align=center bgColor=#ffffff borderColorLight=#000000 border=1>
& o2 s% H9 P4 d7 W# {4 d2 n. W5 s- p9 N
! l& U& X! x  Y  Z' ]+ |<TR>; I/ f1 ^! A* E, T
<TD vAlign=top width=%50>字符串表长度</TD>
- H* B- X$ ^8 I; C8 F0 s<TD vAlign=top width=%50>字符串1\0</TD></TR>% P) l7 W* z( a6 O" \% w5 ^/ C
<TR>
, a9 K8 k. c- }<TD vAlign=top width=%50>....</TD>0 y" ]$ T. Z5 e; h8 T
<TD vAlign=top width=%50>字符串n\0</TD></TR></TD></TR></TABLE></DIV>3 j6 B4 n8 m7 L
<DIV><br>    字符串表的前四个字节是字符串表的长度,以字节为单位。其后就是以0结尾的字符串(C风格字符串)。要注意的是,字符串表的长度不仅仅是字符串的长度(这个长度要包括每个字符串后的‘\0’)的总合,它还包括这个长度域的四个字节。符号表中ulOffset成员所指出的偏移就是从字符串表起始处的偏移。比如:指像每一个字符串的符号,ulOffset的值总为4。<br>    下面给出的代码,是从字符串表中读取字符串的典型C代码。<br><br>int iStrlen,iCur=4;                 // iStrLen是字符串表的长度,iCur是当前字符串偏移<br>char *str;                          // 字符串表<br>read(fn, &amp;iStrlen, 4);              // 得到字符串表长度<br>str = (char *)malloc(iStrlen);      // 为字符串表分配空间<br>while (iCur&lt;iStrlen )               // 读字符串表,直到全部读入内存<br>    iCur+=read(fn, str+iCur, iStrlen- iCur);<br>iCur=4;                             // 把当前字符串偏移指到每一个字符串<br>while (iCur&lt;iStrlen ) {             // 显示每一个字符串<br>    printf("String offset 0x%04X : %s\n", iCur, str + iCur);<br>    iCur+=(strlen(str+iCur)+1);     // 计算偏移时不要忘了计算‘\0’字符所占的1个字节!<br>}<br>free(str);                          // 释放字符串表空间</DIV>( X& O  e4 j$ W, Q$ K
<DIV> </DIV>. N7 l1 I& }* e$ f, w0 x  |
<DIV>    直到这里,整个COFF的结构已经全部介绍完了。很多了解PE格式的朋友一定会奇怪,好像少了很多内容!?是的,标准的COFF文件只有这么多的东西。但MS为了和DOS的可执行文件兼容,以及对可执行文件功能的扩展,在COFF格式中加了很多它自己的标准。让我差点就认不出COFF了。但了解了COFF文件以后,再来学习PE文件的格式,那就很简单了。<br>    想了解PE文件的格式?网上有很多它的资料,我将在本文的基础上再写几篇文章,分别介绍PE,OMF以及ELF的格式。<br>    现在大家可以自己动手,写一个COFF文件解析器或是一个简单的连接程序了!</DIV>
" I; G1 ], o1 e/ v5 j0 K" Z
[此贴子已经被作者于2005-9-17 14:58:16编辑过]
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

1

主题

2

听众

60

积分

升级  57.89%

该用户从未签到

新人进步奖

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2025-12-29 08:49 , Processed in 0.502283 second(s), 57 queries .

回顶部