<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>swigger's BLOG &#187; flash</title>
	<atom:link href="http://www.swigger.net/archives/tag/flash/feed" rel="self" type="application/rss+xml" />
	<link>http://www.swigger.net</link>
	<description>醉卧沙场君莫笑 古来征战几人回</description>
	<lastBuildDate>Wed, 11 Aug 2010 17:08:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>被sothink swf decompiler阴了一把</title>
		<link>http://www.swigger.net/archives/44.html</link>
		<comments>http://www.swigger.net/archives/44.html#comments</comments>
		<pubDate>Sat, 28 Jun 2008 18:15:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[破解狂]]></category>
		<category><![CDATA[decompile]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[破解]]></category>

		<guid isPermaLink="false">http://www.swigger.net/?p=44</guid>
		<description><![CDATA[好久没写了，今天再灌一篇。 一个flash小游戏里的TEA算法，hack一把，结果发现，decompile出来的as，改成js运行后，得到的结果跟原游戏运算出的结果是不一样的。 心想难道js跟as有些差别？不得已，去下了一个adobe flash cs3。 发现自己快不会用flash了，还是flash5时学了几天，做了点皮毛，主要也是那时为了应付交了一下某堂课的作业。想起来当时那老师也很好心，这个flash作业给了我满分。 不过今天对flash cs3感觉 很不顺手了。一开始就遇到个问题 ，在cs3中如何使用外部类？直接写一个，报错误“类不能嵌套”，搜了一把是写在一个.as文件里，就写在一个TEA.as里。 加入代码 import TEA; 结果又报错，说TEA没有实现，查文档，原来说是要放到一个包(package)里。那就放吧，放完发现还是不对，最后看了一下flash自己的实现，终于整明白了。先建一个crypto的文件夹，在里面建个TEA.as，代码这样： package crypto{ //crypto要跟文件夹名一致。 public class TEA{ //TEA跟文件名即TEA.as一致。public好像不能少。 &#8230;//省略 } } OK，可以运行了，然后发现，其实另存为flash 8的文档，就可以直接用不放在包里的TEA.as!晕倒。 运行发现，这个flash得到的结果跟html里的js算出来是一样的。敢情从下载flash起，事情就白做了。 最后没办法，回到sothink swf decompiler中，仔细看，看到一个疑点： var _loc11 = 2.671213E+009; 为什么是这样呢？算法中不应有这样的代码。打开raw code，找到这一行：  //96 09 00 06 ef e6 e3 41 00 00 20 37  _push 2.67121e+009 对比一下其它的_push语句，发现ef e6 e3 41 00 [...]]]></description>
			<content:encoded><![CDATA[<p>好久没写了，今天再灌一篇。</p>
<p>一个flash小游戏里的TEA算法，hack一把，结果发现，decompile出来的as，改成js运行后，得到的结果跟原游戏运算出的结果是不一样的。</p>
<p>心想难道js跟as有些差别？不得已，去下了一个adobe flash cs3。</p>
<p>发现自己快不会用flash了，还是flash5时学了几天，做了点皮毛，主要也是那时为了应付交了一下某堂课的作业。想起来当时那老师也很好心，这个flash作业给了我满分。</p>
<p>不过今天对flash cs3感觉 很不顺手了。一开始就遇到个问题 ，在cs3中如何使用外部类？直接写一个，报错误“类不能嵌套”，搜了一把是写在一个.as文件里，就写在一个TEA.as里。</p>
<p>加入代码 import TEA; 结果又报错，说TEA没有实现，查文档，原来说是要放到一个包(package)里。那就放吧，放完发现还是不对，最后看了一下flash自己的实现，终于整明白了。先建一个crypto的文件夹，在里面建个TEA.as，代码这样：</p>
<p>package crypto{ //crypto要跟文件夹名一致。</p>
<p>public class TEA{ //TEA跟文件名即TEA.as一致。public好像不能少。</p>
<p>&#8230;//省略</p>
<p>}</p>
<p>}</p>
<p>OK，可以运行了，然后发现，其实另存为flash 8的文档，就可以直接用不放在包里的TEA.as!晕倒。</p>
<p>运行发现，这个flash得到的结果跟html里的js算出来是一样的。敢情从下载flash起，事情就白做了。</p>
<p>最后没办法，回到sothink swf decompiler中，仔细看，看到一个疑点：</p>
<p>var _loc11 = 2.671213E+009;</p>
<p>为什么是这样呢？算法中不应有这样的代码。打开raw code，找到这一行：</p>
<p> //96 09 00 06 ef e6 e3 41 00 00 20 37<br />
 _push 2.67121e+009</p>
<p>对比一下其它的_push语句，发现ef e6 e3 41 00 00 20 37 是一个double值。</p>
<p>写个小程序：</p>
<p><pre><div style="border:1px solid lightgrey; font-size:8pt; font-family:Courier New; overflow:auto; white-space: pre; width:99%; max-height:500px; height:expression(offsetHeight>500 ? '500px' : 'auto')">debian:~# cat t2.c
#include &lt;stdio.h&gt;

int main()
{
        double d = 2.67121e+009;
        unsigned char * p = (unsigned char*)&amp;d;

        int i;
        for ( i=0; i&lt;8; ++i)
        {
                printf(&quot;%02x &quot;, p[i]);
        }
        printf(&quot;\n&quot;);
        return 0;
}
debian:~# gcc t2.c 
debian:~# ./a.out
00 00 00 c2 ed e6 e3 41</div></pre></p>
<p>对比00 00 00 c2 ed e6 e3 41 与ef e6 e3 41 00 00 20 37</p>
<p>只有一点儿不同，原double值应该是00 00 20 37 ef e6 e3 41</p>
<p>好，这样： printf(&#8220;%.14g\n&#8221;, *(double*)&#8221;\x00\x00\x20\x37\xef\xe6\xe3\x41&#8243;);</p>
<p>得到： 2671212985</p>
<p>这就是正确的原flash的设定值。</p>
<p>修改一下TEA.as:</p>
<p>var _loc11 = 2.671213E+009;改为：</p>
<p>var _loc11 = 2671212985；</p>
<p>再运行一把，成功！算出来的值跟原flash是一样的，可以互相加/解密。</p>
<p>总结一下：sothink swf decompiler太土，居然不会用最恰当的方法格式化double值。bs之。</p>
<p>另外把TEA.as贴出来，版权不归我所有，是RE出来的，原作者如果有意见，请聊系本人删除。</p>
<p>hilight不支持actionscript，当就是javascript好了，反正差不多。</p>
<p>贴的这个是flash8格式，在CS3中使 用要放入一个 package里，前面说过了。</p>
<p><pre><div style="border:1px solid lightgrey; font-size:8pt; font-family:Courier New; overflow:auto; white-space: pre; width:99%; max-height:500px; height:expression(offsetHeight>500 ? '500px' : 'auto')"><B><span style="color:#A020F0">class</span></B> TEA
{
    <B><span style="color:#A020F0">function</span></B> <B><span style="color:#0000FF">TEA</span></B>()
    {
    } <I><span style="color:#B22222">// End of the function
</span></I>    <B><span style="color:#A020F0">static</span></B> <B><span style="color:#A020F0">function</span></B> <B><span style="color:#0000FF">encrypt</span></B>(src, key)
    {
        <B><span style="color:#A020F0">if</span></B> (!key || key.length == 0)
        {
            key = <B><span style="color:#BC8F8F">&quot;9F3779B99F3779B9&quot;</span></B>;
        } <I><span style="color:#B22222">// end if
</span></I>        <B><span style="color:#A020F0">var</span></B> _loc4 = TEA.charsToLongs(TEA.strToChars(src));
        <B><span style="color:#A020F0">var</span></B> _loc9 = TEA.charsToLongs(TEA.strToChars(key));
        <B><span style="color:#A020F0">var</span></B> _loc8 = _loc4.length;
        <B><span style="color:#A020F0">if</span></B> (_loc8 == 0)
        {
            <B><span style="color:#A020F0">return</span></B> (<B><span style="color:#BC8F8F">&quot;&quot;</span></B>);
        } <I><span style="color:#B22222">// end if
</span></I>        <B><span style="color:#A020F0">if</span></B> (_loc8 == 1)
        {
            _loc4[_loc8++] = 0;
        } <I><span style="color:#B22222">// end if
</span></I>        <B><span style="color:#A020F0">var</span></B> _loc2 = _loc4[_loc8 - 1];
        <B><span style="color:#A020F0">var</span></B> _loc3 = _loc4[0];
        <B><span style="color:#A020F0">var</span></B> _loc11 = 2671212985;
        <B><span style="color:#A020F0">var</span></B> _loc5;
        <B><span style="color:#A020F0">var</span></B> _loc7;
        <B><span style="color:#A020F0">var</span></B> _loc10 = <B><span style="color:#DA70D6">Math</span></B>.floor(6 + 52 / _loc8);
        <B><span style="color:#A020F0">var</span></B> _loc6 = 0;
        <B><span style="color:#A020F0">while</span></B> (_loc10-- &gt; 0)
        {
            _loc6 = _loc6 + _loc11;
            _loc7 = _loc6 &gt;&gt;&gt; 2 &amp; 3;
            <B><span style="color:#A020F0">for</span></B> (<B><span style="color:#A020F0">var</span></B> _loc1 = 0; _loc1 &lt; _loc8 - 1; ++_loc1)
            {
                _loc3 = _loc4[_loc1 + 1];
                _loc5 = (_loc2 &gt;&gt;&gt; 5 ^ _loc3 &lt;&lt; 2) + (_loc3 &gt;&gt;&gt; 3 ^ _loc2 &lt;&lt; 4) ^ (_loc6 ^ _loc3) + (_loc9[_loc1 &amp; 3 ^ _loc7] ^ _loc2);
                _loc2 = _loc4[_loc1] = _loc4[_loc1] + _loc5;
            } <I><span style="color:#B22222">// end of for
</span></I>            _loc3 = _loc4[0];
            _loc5 = (_loc2 &gt;&gt;&gt; 5 ^ _loc3 &lt;&lt; 2) + (_loc3 &gt;&gt;&gt; 3 ^ _loc2 &lt;&lt; 4) ^ (_loc6 ^ _loc3) + (_loc9[_loc1 &amp; 3 ^ _loc7] ^ _loc2);
            _loc2 = _loc4[_loc8 - 1] = _loc4[_loc8 - 1] + _loc5;
        } <I><span style="color:#B22222">// end while
</span></I>        <B><span style="color:#A020F0">return</span></B> (TEA.charsToHex(TEA.longsToChars(_loc4)));
    } <I><span style="color:#B22222">// End of the function
</span></I>    <B><span style="color:#A020F0">static</span></B> <B><span style="color:#A020F0">function</span></B> <B><span style="color:#0000FF">decrypt</span></B>(src, key)
    {
        <B><span style="color:#A020F0">if</span></B> (!key || key.length == 0)
        {
            key = <B><span style="color:#BC8F8F">&quot;9F3779B99F3779B9&quot;</span></B>;
        } <I><span style="color:#B22222">// end if
</span></I>        <B><span style="color:#A020F0">var</span></B> _loc4 = TEA.charsToLongs(TEA.hexToChars(src));
        <B><span style="color:#A020F0">var</span></B> _loc9 = TEA.charsToLongs(TEA.strToChars(key));
        <B><span style="color:#A020F0">var</span></B> _loc8 = _loc4.length;
        <B><span style="color:#A020F0">if</span></B> (_loc8 == 0)
        {
            <B><span style="color:#A020F0">return</span></B> (<B><span style="color:#BC8F8F">&quot;&quot;</span></B>);
        } <I><span style="color:#B22222">// end if
</span></I>        <B><span style="color:#A020F0">var</span></B> _loc2 = _loc4[_loc8 - 1];
        <B><span style="color:#A020F0">var</span></B> _loc3 = _loc4[0];
        <B><span style="color:#A020F0">var</span></B> _loc10 = 2671212985;
        <B><span style="color:#A020F0">var</span></B> _loc6;
        <B><span style="color:#A020F0">var</span></B> _loc7;
        <B><span style="color:#A020F0">var</span></B> _loc12 = <B><span style="color:#DA70D6">Math</span></B>.floor(6 + 52 / _loc8);
        <B><span style="color:#A020F0">for</span></B> (<B><span style="color:#A020F0">var</span></B> _loc5 = _loc12 * _loc10; _loc5 != 0; _loc5 = _loc5 - _loc10)
        {
            _loc7 = _loc5 &gt;&gt;&gt; 2 &amp; 3;
            <B><span style="color:#A020F0">for</span></B> (<B><span style="color:#A020F0">var</span></B> _loc1 = _loc8 - 1; _loc1 &gt; 0; --_loc1)
            {
                _loc2 = _loc4[_loc1 - 1];
                _loc6 = (_loc2 &gt;&gt;&gt; 5 ^ _loc3 &lt;&lt; 2) + (_loc3 &gt;&gt;&gt; 3 ^ _loc2 &lt;&lt; 4) ^ (_loc5 ^ _loc3) + (_loc9[_loc1 &amp; 3 ^ _loc7] ^ _loc2);
                _loc3 = _loc4[_loc1] = _loc4[_loc1] - _loc6;
            } <I><span style="color:#B22222">// end of for
</span></I>            _loc2 = _loc4[_loc8 - 1];
            _loc6 = (_loc2 &gt;&gt;&gt; 5 ^ _loc3 &lt;&lt; 2) + (_loc3 &gt;&gt;&gt; 3 ^ _loc2 &lt;&lt; 4) ^ (_loc5 ^ _loc3) + (_loc9[_loc1 &amp; 3 ^ _loc7] ^ _loc2);
            _loc3 = _loc4[0] = _loc4[0] - _loc6;
        } <I><span style="color:#B22222">// end of for
</span></I>        <B><span style="color:#A020F0">return</span></B> (TEA.charsToStr(TEA.longsToChars(_loc4)));
    } <I><span style="color:#B22222">// End of the function
</span></I>    <B><span style="color:#A020F0">static</span></B> <B><span style="color:#A020F0">function</span></B> <B><span style="color:#0000FF">charsToLongs</span></B>(chars)
    {
        <B><span style="color:#A020F0">var</span></B> _loc3 = <B><span style="color:#A020F0">new</span></B> Array(<B><span style="color:#DA70D6">Math</span></B>.ceil(chars.length / 4));
        <B><span style="color:#A020F0">for</span></B> (<B><span style="color:#A020F0">var</span></B> _loc1 = 0; _loc1 &lt; _loc3.length; ++_loc1)
        {
            _loc3[_loc1] = chars[_loc1 * 4] + (chars[_loc1 * 4 + 1] &lt;&lt; &lt;img src=<B><span style="color:#BC8F8F">'http://www.swigger.net/wp-includes/images/smilies/icon_cool.gif'</span></B> alt=<B><span style="color:#BC8F8F">'8)'</span></B> <B><span style="color:#A020F0">class</span></B>=<B><span style="color:#BC8F8F">'wp-smiley'</span></B> /&gt; + (chars[_loc1 * 4 + 2] &lt;&lt; 16) + (chars[_loc1 * 4 + 3] &lt;&lt; 24);
        } <I><span style="color:#B22222">// end of for
</span></I>        <B><span style="color:#A020F0">return</span></B> (_loc3);
    } <I><span style="color:#B22222">// End of the function
</span></I>    <B><span style="color:#A020F0">static</span></B> <B><span style="color:#A020F0">function</span></B> <B><span style="color:#0000FF">longsToChars</span></B>(longs)
    {
        <B><span style="color:#A020F0">var</span></B> _loc3 = <B><span style="color:#A020F0">new</span></B> Array();
        <B><span style="color:#A020F0">for</span></B> (<B><span style="color:#A020F0">var</span></B> _loc1 = 0; _loc1 &lt; longs.length; ++_loc1)
        {
            _loc3.push(longs[_loc1] &amp; 255, longs[_loc1] &gt;&gt;&gt; 8 &amp; 255, longs[_loc1] &gt;&gt;&gt; 16 &amp; 255, longs[_loc1] &gt;&gt;&gt; 24 &amp; 255);
        } <I><span style="color:#B22222">// end of for
</span></I>        <B><span style="color:#A020F0">return</span></B> (_loc3);
    } <I><span style="color:#B22222">// End of the function
</span></I>    <B><span style="color:#A020F0">static</span></B> <B><span style="color:#A020F0">function</span></B> <B><span style="color:#0000FF">charsToHex</span></B>(chars)
    {
        <B><span style="color:#A020F0">var</span></B> _loc4 = <B><span style="color:#A020F0">new</span></B> String(<B><span style="color:#BC8F8F">&quot;&quot;</span></B>);
        <B><span style="color:#A020F0">var</span></B> _loc3 = <B><span style="color:#A020F0">new</span></B> Array(<B><span style="color:#BC8F8F">&quot;0&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;1&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;2&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;3&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;4&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;5&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;6&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;7&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;8&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;9&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;a&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;b&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;c&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;d&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;e&quot;</span></B>, <B><span style="color:#BC8F8F">&quot;f&quot;</span></B>);
        <B><span style="color:#A020F0">for</span></B> (<B><span style="color:#A020F0">var</span></B> _loc1 = 0; _loc1 &lt; chars.length; ++_loc1)
        {
            _loc4 = _loc4 + (_loc3[chars[_loc1] &gt;&gt; 4] + _loc3[chars[_loc1] &amp; 15]);
        } <I><span style="color:#B22222">// end of for
</span></I>        <B><span style="color:#A020F0">return</span></B> (_loc4);
    } <I><span style="color:#B22222">// End of the function
</span></I>    <B><span style="color:#A020F0">static</span></B> <B><span style="color:#A020F0">function</span></B> <B><span style="color:#0000FF">hexToChars</span></B>(hex)
    {
        <B><span style="color:#A020F0">var</span></B> _loc3 = <B><span style="color:#A020F0">new</span></B> Array();
        <B><span style="color:#A020F0">for</span></B> (<B><span style="color:#A020F0">var</span></B> _loc1 = hex.substr(0, 2) == <B><span style="color:#BC8F8F">&quot;0x&quot;</span></B> ? (2) : (0); _loc1 &lt; hex.length; _loc1 = _loc1 + 2)
        {
            _loc3.push(<B><span style="color:#DA70D6">parseInt</span></B>(hex.substr(_loc1, 2), 16));
        } <I><span style="color:#B22222">// end of for
</span></I>        <B><span style="color:#A020F0">return</span></B> (_loc3);
    } <I><span style="color:#B22222">// End of the function
</span></I>    <B><span style="color:#A020F0">static</span></B> <B><span style="color:#A020F0">function</span></B> <B><span style="color:#0000FF">charsToStr</span></B>(chars)
    {
        <B><span style="color:#A020F0">var</span></B> _loc3 = <B><span style="color:#A020F0">new</span></B> String(<B><span style="color:#BC8F8F">&quot;&quot;</span></B>);
        <B><span style="color:#A020F0">for</span></B> (<B><span style="color:#A020F0">var</span></B> _loc1 = 0; _loc1 &lt; chars.length; ++_loc1)
        {
            _loc3 = _loc3 + String.fromCharCode(chars[_loc1]);
        } <I><span style="color:#B22222">// end of for
</span></I>        <B><span style="color:#A020F0">return</span></B> (_loc3);
    } <I><span style="color:#B22222">// End of the function
</span></I>    <B><span style="color:#A020F0">static</span></B> <B><span style="color:#A020F0">function</span></B> <B><span style="color:#0000FF">strToChars</span></B>(str)
    {
        <B><span style="color:#A020F0">var</span></B> _loc3 = <B><span style="color:#A020F0">new</span></B> Array();
        <B><span style="color:#A020F0">for</span></B> (<B><span style="color:#A020F0">var</span></B> _loc1 = 0; _loc1 &lt; str.length; ++_loc1)
        {
            _loc3.push(str.charCodeAt(_loc1));
        } <I><span style="color:#B22222">// end of for
</span></I>        <B><span style="color:#A020F0">return</span></B> (_loc3);
    } <I><span style="color:#B22222">// End of the function
</span></I>} <I><span style="color:#B22222">// End of Class</span></I></div></pre></p>
]]></content:encoded>
			<wfw:commentRss>http://www.swigger.net/archives/44.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
