使用FLASM或SWFMILL汇编/反汇编swf文件。其他选择?

时间:2013-12-12 15:14:31

标签: actionscript-3 flash actionscript flash-cs5

我们有一个由第三人创建的相对简单的SWF,基本上可以移动一些文本。我需要能够每天修改该文本,但我没有Flash,我不知道如何使用Flash。因此,在Flash中打开和修改它不是一种选择。外部文件也不是一个选项。

我尝试使用FLASM和SWFMILL反汇编SWF,但结果不显示实际文本。

使用FLASM我使用 flasm -d main_ver3.swf> main_ver3.flm 即可。结果如下:https://dl.dropboxusercontent.com/u/10067449/Flash/main_ver3.flm

使用swfmill我使用 swfmill swf2xml main_ver3.swf main_ver3.xml 。结果如下:https://dl.dropboxusercontent.com/u/10067449/Flash/main_ver3.xml

在他们两个中我都没看到一些添加到Flash的文本,例如“Blackberry Curve”,“Apple iphone”,“Nokia Lumia”。

问题是什么?该文本是使用Flash的文本工具创建的。

感谢。

1 个答案:

答案 0 :(得分:0)

是的,不幸的是,它不会像替换文本字符串那么容易。 SWF是一种复杂的格式,具有很多可能性。在您的情况下,字体嵌入为一组字形,字形(字母)在文本对象中引用。

漫画sans字体在此标记下定义:

  <DefineFont3 objectID="15" isShiftJIS="0" isUnicode="0" isANSII="0" wideGlyphOffsets="0" italic="0" bold="0" language="1" name="Comic Sans MS">

此标记中定义了一堆字形,您会注意到第10个字形(如果从0开始计数,则为9的索引)具有map =“65”值:

      <Glyph map="65">
        <GlyphShape>
          <edges>
            <ShapeSetup x="12500" y="300" fillStyle0="1"/>
            <CurveTo x1="-920" y1="0" x2="-680" y2="-2360"/>
            <CurveTo x1="-260" y1="-900" x2="-390" y2="-2250"/>
            ...

十进制“65”是ASCII中的大写字母A.所以上面的绘制调用正在绘制一个大写字母A.稍后,以字形9(ascii 65,大写字母A)开头并拼出'Apple iPhone'的文本记录是(我添加了字母):

  <DefineText objectID="22">
    <bounds>
      <Rectangle left="26" right="2560" top="81" bottom="574"/>
    </bounds>
    <transform>
      <Transform transX="0" transY="0"/>
    </transform>
    <records>
      <TextRecord>
        <records>
          <TextRecord6 isSetup="1" objectID="15" y="440" fontHeight="400">
            <color>
              <Color red="255" green="255" blue="255"/>
            </color>
          </TextRecord6>
          <TextRecord6 isSetup="0">
            <glyphs>
              <TextEntry glyph="9" advance="293"/>   #  9 = A
              <TextEntry glyph="25" advance="214"/>  # 25 = p
              <TextEntry glyph="25" advance="214"/>  # 25 = p
              <TextEntry glyph="21" advance="110"/>  # 21 = l
              <TextEntry glyph="17" advance="219"/>  # 17 = e
              <TextEntry glyph="0" advance="120"/>   #  0 = space
              <TextEntry glyph="19" advance="112"/>  # 19 = i
              <TextEntry glyph="25" advance="214"/>  # 25 = P
              <TextEntry glyph="18" advance="231"/>  # 18 = h
              <TextEntry glyph="24" advance="210"/>  # 24 = o
              <TextEntry glyph="23" advance="209"/>  # 23 = n
              <TextEntry glyph="17" advance="219"/>  # 17 = e
            </glyphs>
          </TextRecord6>
          <TextRecord6 isSetup="0">
            <glyphs/>
          </TextRecord6>
        </records>
      </TextRecord>
    </records>
  </DefineText>

我不确定advance =“###”是什么,但我猜它是定义字母间距。 l,i和空间只有大约100个单位宽,而其他字母大约是200个单位。

此外,SWF是紧凑的,因此无法保证您拥有随意替换文本所需的每个字形 - 它可能只有在SWF中呈现文本所需的字形。

简而言之,可以使用这些工具修改SWF,但是您需要进行一些挖掘和努力来更改此文本。

另请注意,如果设计人员小心,可以构建一个使用简单可替换文本字段反编译的SWF。它需要从AS3代码(又名动作)中定义的数组中获取文本字段的文本。