<?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>破解狂 &#8211; swigger&#039;s BLOG</title>
	<atom:link href="https://www.swigger.net/category/crack/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.swigger.net</link>
	<description>醉卧沙场君莫笑 古来征战几人回</description>
	<lastBuildDate>Wed, 28 Dec 2011 11:21:03 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
	<item>
		<title>patch mindmanager to avoid fuzzy text.</title>
		<link>https://www.swigger.net/2011/12/28/patch-mindmanager-to-avoid-fuzzy-text/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Wed, 28 Dec 2011 11:21:03 +0000</pubDate>
				<category><![CDATA[破解狂]]></category>
		<guid isPermaLink="false">http://www.swigger.net/?p=321</guid>

					<description><![CDATA[mindmanager is a great tool, but it has  &#8230; <a href="https://www.swigger.net/2011/12/28/patch-mindmanager-to-avoid-fuzzy-text/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>mindmanager is a great tool, but it has a bug (or they the devlopers may think it&#8217;s a feature) not fixed for years. That is, the fuzzy text problem. Just search mindmanager fuzzy text , there are many results about this bug and some patches for the old versions of mindmanager. Just as what is said from http://forum.us.mindjet.com/viewtopic.php?f=16&#038;t=3060 ，disabling the call to GdipSetTextRenderingHint fixes this bug.</p>
<p>steps to make a patch<br />
1. open a debugger, ex: ollydbg, load mindmanager.<br />
2. break at GdipSetTextRenderingHint  (gdiplus.dll!_GdipSetTextRenderingHint@8)<br />
3. when it break down, track the call to it. It&#8217;s something like:<br />
[code lang=&#8221;outline&#8221;]00688A2D  call        00CC8792 [/code]<br />
goto 00CC8792 , it is something like:<br />
[code lang=&#8221;outline&#8221;]00CC8792  jmp         dword ptr ds:[0E5A758h] [/code]<br />
change it to :<br />
retn 8<br />
code bytes: c2 08 00 90 90 90<br />
4. save the modification to mindmanager.exe<br />
5. done, enjoy clear text.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>修改 vs2010 编译器使之支持u8&#8243;字符串&#8221;的形式</title>
		<link>https://www.swigger.net/2011/01/03/%e4%bf%ae%e6%94%b9-vs2010-%e7%bc%96%e8%af%91%e5%99%a8%e4%bd%bf%e4%b9%8b%e6%94%af%e6%8c%81u8%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e5%bd%a2%e5%bc%8f/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Mon, 03 Jan 2011 07:28:07 +0000</pubDate>
				<category><![CDATA[开发]]></category>
		<category><![CDATA[破解狂]]></category>
		<guid isPermaLink="false">http://www.swigger.net/?p=214</guid>

					<description><![CDATA[vs有比较完善的unicode支持，从2005(或更早？)开始就支持源文件是ut &#8230; <a href="https://www.swigger.net/2011/01/03/%e4%bf%ae%e6%94%b9-vs2010-%e7%bc%96%e8%af%91%e5%99%a8%e4%bd%bf%e4%b9%8b%e6%94%af%e6%8c%81u8%e5%ad%97%e7%ac%a6%e4%b8%b2%e7%9a%84%e5%bd%a2%e5%bc%8f/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>vs有比较完善的unicode支持，从2005(或更早？)开始就支持源文件是utf-8，并且可以用中文做变量名函数名。（可以是可以，不推荐）</p>
<p>不过，也有一点很让人生气，就算源文件是utf-8编码的，编译时，他也会把utf-8转成主机的编码。所以，对于中文编码而言，如果源文件是</p>
<p>utf-8的并且有这样的内容，编译还是一样出问题：</p>
<pre>const char * test = "®";
tt.cpp(10) : warning C4566: character represented by universal-character-name '\u00AE' cannot be represented in the current code page (936)</pre>
<p>c++0x草案中有 u8&#8243;string literal&#8221; 形式的字符串，如果可以用这个，则问题解决，可惜的是，vs2010并不支持 u8-prefix string literal。当然，u和U也不支持。不过由于windows本身所说的unicode是utf-16 le，所以vc里L&#8221;string&#8221;就是u&#8221;string&#8221;。</p>
<p>如果才能让vc以持u8呢？写一个宏和字符串转化的类，在运行期转化是一个可行但比较折中的办法，这个办法最大的问题是依然不能在代码里写&#8221;®&#8221;这样的字串，因为编译期转成中文编码失败成?号，运行期转成utf-8还是问号。</p>
<p>当然，可以写 L&#8221;®&#8221;，这样这个u8类可以这样写：</p>
<pre>string to_utf8(const wchar_t*);
#define U8(string)  to_utf8(string).c_str()</pre>
<p>然后在用的地方写：</p>
<p>U8(L&#8221;®&#8221;);</p>
<p>这样基本能用，但带来了一些运行期消耗。并且L的字符串也比较大。当然宏本身还可以改改，使得不需要写L，而是在预处理后加入L，但会带来额外的限制（想想U8(&#8220;hello&#8221; &#8220;world&#8221;)）。</p>
<p>能不能hack编译器加入u8的支持呢？经过一番研究，发现了点眉目。</p>
<p>首先，vc编译器编译的主要功能代码在c1xx.dll中。这个dll的x86版本位于 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\c1xx.dll。惊喜的是微软提供了它的pdb，这样分析它的行为就大大简化了。</p>
<p>经过研究发现，vc基本上函展开，获取token生成语法树是一次过的。</p>
<p>在关键函数</p>
<p>4F4C9430 GetTokenFromCurrentChar</p>
<p>处，会有一个循环，从一个全局变量中读取解析到的内容，然后构造出一个token。我们要做的就是hack这个过程，如果当前token符合 u8&#8243;string&#8221;的形式，则处理一遍字符串，转成8进制的串表示方法。</p>
<p>经过一番苦战成功后，结果如下：</p>
<p>[code lang=&#8221;outline&#8221;]</p>
<p>tt.cpp:</p>
<p>#define U8(str) u8##str<br />
#define U16(str) L##str</p>
<p>int main()<br />
{</p>
<p>U8(&#8220;哈&#8221;);<br />
u8&#8243;哈&#8221;;<br />
return 0;<br />
}</p>
<p>D:\temp&gt;cl /E tt.cpp<br />
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80&#215;86<br />
Copyright (C) Microsoft Corporation.  All rights reserved.</p>
<p>tt.cpp<br />
#line 1 &#8220;tt.cpp&#8221;<br />
int main()<br />
{</p>
<p>&#8220;\345\223\210&#8221;;<br />
&#8220;\345\223\210&#8243;;<br />
return 0;<br />
}</p>
<p>[/code]</p>
<p>使用的办法是：</p>
<p>把原始的c1xx.dll重命名为c1xx_.dll，写了一个假的c1xx.dll，把导出函数的调用都重定位到c1xx_.dll。然后在GetTokenFromCurrentChar的循环开始处：</p>
<p>4F4C943E                                             8B3D 046C644F    MOV EDI,DWORD PTR DS:[Current_char]</p>
<p>写入一个跳转，跳转到自己的函数中检查是否需要替换字串。写完后变成：</p>
<p>4F4C943E                                             E8 4D7EB60E      CALL c1xx.asmReplCurCode<br />
4F4C9443                                             90               NOP</p>
<p>这个被调用的函数是这样的：<br />
__declspec(naked) void asmReplCurCode()<br />
{<br />
__asm<br />
{<br />
pushad;<br />
call ReplCurCode;<br />
popad;<br />
mov edi, [ptrCurChar];<br />
mov edi, [edi];<br />
ret;<br />
}<br />
}<br />
即用汇编做一个简单的包装，调用C++函数，然后完成被覆盖的代码要完成的事，然后ret回去。</p>
<p>ReplCurCode是这样的：</p>
<p>[code lang=&#8221;cpp&#8221; ]<br />
void ReplCurCode()<br />
{<br />
if (g_pred == 0)<br />
{<br />
g_pred = 1;<br />
char ch = ** ptrCurChar;<br />
//note: in creating/using precompiled header mode, don&#8217;t insert this code since it had done before.<br />
if (ch == &#8216;\r&#8217; || ch == &#8216;\n&#8217;)<br />
{<br />
replace = *ptrCurChar;<br />
const char * scode = &#8220;\r\n#define __bultin_u8 1\r\n1\r\n&#8221;;<br />
match = scode + strlen(scode)-3;<br />
*ptrCurChar = scode;<br />
return ;<br />
}<br />
}</p>
<p>if (*ptrCurChar == match)<br />
{<br />
*ptrCurChar = replace;<br />
match = 0;<br />
replace = 0;<br />
}</p>
<p>const char * src = *ptrCurChar;<br />
if (src[0] == &#8216;#&#8217; &amp;&amp; src[1] == &#8216;d&#8217;)<br />
{<br />
int ff = 0;<br />
}</p>
<p>string prefix;<br />
while (isspace((unsigned char)(src[0])))<br />
{<br />
prefix += src[0];<br />
++ src;<br />
}</p>
<p>if (src[0] == &#8216;u&#8217; &amp;&amp;  src[1] == &#8216;8&#8217; &amp;&amp; src[2] == &#8216;&#8221;&#8216;)<br />
{<br />
//so this is a U8 str.<br />
string sb;<br />
size_t sz = TextProcess::unescape(src+3, MAXLONG, sb);<br />
if (src[sz+3] == &#8216;&#8221;&#8216;)<br />
{<br />
string st = TextProcess::escape(sb.c_str(), sb.length());<br />
string &amp; codestr = getPool(prefix + st, src);<br />
match   = codestr.c_str() + codestr.length();<br />
replace = src+sz+4;<br />
*ptrCurChar = codestr.c_str();<br />
}<br />
}<br />
}</p>
<p>[/code]</p>
<p>在首次处理的时候插入一个宏定义，这样代码中就可以知道编译器是不是修改支持了u8的功能。ptrCurChar是微软的c1xx.dll中的全局变量的地址，通过它知道当前要解析什么样的代码，解析完之后替换掉它，使得</p>
<p>u8&#8243;哈&#8221;</p>
<p>交给微软cl.exe解释的时候变成  &#8220;\345\223\210&#8221; 当然下一次再跑到这里的时候，比较是不是解释完我设置的替换串了，是的话换回原始要解释的内容，当然是跳过了u8&#8243;哈&#8221;这个串的。</p>
<p>即： if(*ptrCurChar == match) *ptrCurChar = replace;</p>
<p>这样处理完了之后，vs2010就完美的支持u8&#8243;string&#8221;了。不过只能小范围内使用或写一些自己用的工具，对于大的团队而言，还是等微软下一个vs吧，也许那时就真正支持u8&#8243;literal string&#8221;了。</p>
<p>其实不只是 u8 literal string，这样改编译器，还能实现一些更有意思的东西。</p>
<p>dowload:  <a class="wpGallery" href="/soft/hack_c1xx.dll">hack_c1xx.dll </a></p>
<p>仅适用于原始md5为D05630986B03CBB28CD4D8E1BDD65831的c1xx.dll。</p>
<p>把原始c1xx.dll改名为c1xx_.dll，把hack_c1xx.dll改名为c1xx.dll</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>使hdtune扫硬盘时可以从某个位置开始</title>
		<link>https://www.swigger.net/2009/04/04/%e4%bd%bfhdtune%e6%89%ab%e7%a1%ac%e7%9b%98%e6%97%b6%e5%8f%af%e4%bb%a5%e4%bb%8e%e6%9f%90%e4%b8%aa%e4%bd%8d%e7%bd%ae%e5%bc%80%e5%a7%8b/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sat, 04 Apr 2009 15:49:55 +0000</pubDate>
				<category><![CDATA[破解狂]]></category>
		<guid isPermaLink="false">http://www.swigger.net/?p=87</guid>

					<description><![CDATA[hdtune扫硬盘坏道，很慢。为了让它可以从某个位置开始，调了一下： [code &#8230; <a href="https://www.swigger.net/2009/04/04/%e4%bd%bfhdtune%e6%89%ab%e7%a1%ac%e7%9b%98%e6%97%b6%e5%8f%af%e4%bb%a5%e4%bb%8e%e6%9f%90%e4%b8%aa%e4%bd%8d%e7%bd%ae%e5%bc%80%e5%a7%8b/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>hdtune扫硬盘坏道，很慢。为了让它可以从某个位置开始，调了一下：</p>
<p>[code lang=&#8221;outline&#8221;]<br />
004089F5                            . 57                      PUSH EDI                                 ; /lParam<br />
004089F6 &lt;blockpos&gt;                 . 8B7C24 1C               MOV EDI,DWORD PTR SS:[ESP+1C]            ; |<br />
004089FA                            . 8946 1A                 MOV DWORD PTR DS:[ESI+1A],EAX            ; |<br />
004089FD                            . 57                      PUSH EDI                                 ; |wParam<br />
004089FE                            . 68 0E040000             PUSH 40E                                 ; |Message = WM_USER+14.<br />
00408A03                            . 51                      PUSH ECX                                 ; |hWnd<br />
00408A04                            . FF15 FC964700           CALL DWORD PTR DS:[4796FC]               ; \SendMessageA<br />
[/code]</p>
<p> 在 blockpos处，修改esp+1c里的值，就可以了。</p>
<p>总的来说，hdtune把硬盘分为很多个格子，每行５０个，总共有很多行。每一个小格扫完后，就发送这个自定义的消息 WM_USER+14来通知主线程画一个色块。绿色表示无问题，红色表示有问题。运行到blockpos这一行时，把这个值改掉，即可定义到第n个格子。第０个为左上，第４９个为第一行最后一个，依此类推。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>被sothink swf decompiler阴了一把</title>
		<link>https://www.swigger.net/2008/06/29/%e8%a2%absothink-swf-decompiler%e9%98%b4%e4%ba%86%e4%b8%80%e6%8a%8a/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sat, 28 Jun 2008 18:15:51 +0000</pubDate>
				<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一把，结 &#8230; <a href="https://www.swigger.net/2008/06/29/%e8%a2%absothink-swf-decompiler%e9%98%b4%e4%ba%86%e4%b8%80%e6%8a%8a/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></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>[code lang=&#8221;outline&#8221;]</p>
<p>debian:~# cat t2.c<br />
#include &lt;stdio.h&gt;</p>
<p>int main()<br />
{<br />
        double d = 2.67121e+009;<br />
        unsigned char * p = (unsigned char*)&amp;d;</p>
<p>        int i;<br />
        for ( i=0; i&lt;8; ++i)<br />
        {<br />
                printf(&#8220;%02x &#8220;, p[i]);<br />
        }<br />
        printf(&#8220;\n&#8221;);<br />
        return 0;<br />
}<br />
debian:~# gcc t2.c <br />
debian:~# ./a.out<br />
00 00 00 c2 ed e6 e3 41</p>
<p>[/code]</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>[code lang=&#8221;javascript&#8221;]</p>
<p>class TEA<br />
{<br />
    function TEA()<br />
    {<br />
    } // End of the function<br />
    static function encrypt(src, key)<br />
    {<br />
        if (!key || key.length == 0)<br />
        {<br />
            key = &#8220;9F3779B99F3779B9&#8221;;<br />
        } // end if<br />
        var _loc4 = TEA.charsToLongs(TEA.strToChars(src));<br />
        var _loc9 = TEA.charsToLongs(TEA.strToChars(key));<br />
        var _loc8 = _loc4.length;<br />
        if (_loc8 == 0)<br />
        {<br />
            return (&#8220;&#8221;);<br />
        } // end if<br />
        if (_loc8 == 1)<br />
        {<br />
            _loc4[_loc8++] = 0;<br />
        } // end if<br />
        var _loc2 = _loc4[_loc8 &#8211; 1];<br />
        var _loc3 = _loc4[0];<br />
        var _loc11 = 2671212985;<br />
        var _loc5;<br />
        var _loc7;<br />
        var _loc10 = Math.floor(6 + 52 / _loc8);<br />
        var _loc6 = 0;<br />
        while (_loc10&#8211; &gt; 0)<br />
        {<br />
            _loc6 = _loc6 + _loc11;<br />
            _loc7 = _loc6 &gt;&gt;&gt; 2 &amp; 3;<br />
            for (var _loc1 = 0; _loc1 &lt; _loc8 &#8211; 1; ++_loc1)<br />
            {<br />
                _loc3 = _loc4[_loc1 + 1];<br />
                _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);<br />
                _loc2 = _loc4[_loc1] = _loc4[_loc1] + _loc5;<br />
            } // end of for<br />
            _loc3 = _loc4[0];<br />
            _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);<br />
            _loc2 = _loc4[_loc8 &#8211; 1] = _loc4[_loc8 &#8211; 1] + _loc5;<br />
        } // end while<br />
        return (TEA.charsToHex(TEA.longsToChars(_loc4)));<br />
    } // End of the function<br />
    static function decrypt(src, key)<br />
    {<br />
        if (!key || key.length == 0)<br />
        {<br />
            key = &#8220;9F3779B99F3779B9&#8221;;<br />
        } // end if<br />
        var _loc4 = TEA.charsToLongs(TEA.hexToChars(src));<br />
        var _loc9 = TEA.charsToLongs(TEA.strToChars(key));<br />
        var _loc8 = _loc4.length;<br />
        if (_loc8 == 0)<br />
        {<br />
            return (&#8220;&#8221;);<br />
        } // end if<br />
        var _loc2 = _loc4[_loc8 &#8211; 1];<br />
        var _loc3 = _loc4[0];<br />
        var _loc10 = 2671212985;<br />
        var _loc6;<br />
        var _loc7;<br />
        var _loc12 = Math.floor(6 + 52 / _loc8);<br />
        for (var _loc5 = _loc12 * _loc10; _loc5 != 0; _loc5 = _loc5 &#8211; _loc10)<br />
        {<br />
            _loc7 = _loc5 &gt;&gt;&gt; 2 &amp; 3;<br />
            for (var _loc1 = _loc8 &#8211; 1; _loc1 &gt; 0; &#8211;_loc1)<br />
            {<br />
                _loc2 = _loc4[_loc1 &#8211; 1];<br />
                _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);<br />
                _loc3 = _loc4[_loc1] = _loc4[_loc1] &#8211; _loc6;<br />
            } // end of for<br />
            _loc2 = _loc4[_loc8 &#8211; 1];<br />
            _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);<br />
            _loc3 = _loc4[0] = _loc4[0] &#8211; _loc6;<br />
        } // end of for<br />
        return (TEA.charsToStr(TEA.longsToChars(_loc4)));<br />
    } // End of the function<br />
    static function charsToLongs(chars)<br />
    {<br />
        var _loc3 = new Array(Math.ceil(chars.length / 4));<br />
        for (var _loc1 = 0; _loc1 &lt; _loc3.length; ++_loc1)<br />
        {<br />
            _loc3[_loc1] = chars[_loc1 * 4] + (chars[_loc1 * 4 + 1] &lt;&lt; 8) + (chars[_loc1 * 4 + 2] &lt;&lt; 16) + (chars[_loc1 * 4 + 3] &lt;&lt; 24);<br />
        } // end of for<br />
        return (_loc3);<br />
    } // End of the function<br />
    static function longsToChars(longs)<br />
    {<br />
        var _loc3 = new Array();<br />
        for (var _loc1 = 0; _loc1 &lt; longs.length; ++_loc1)<br />
        {<br />
            _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);<br />
        } // end of for<br />
        return (_loc3);<br />
    } // End of the function<br />
    static function charsToHex(chars)<br />
    {<br />
        var _loc4 = new String(&#8220;&#8221;);<br />
        var _loc3 = new Array(&#8220;0&#8221;, &#8220;1&#8221;, &#8220;2&#8221;, &#8220;3&#8221;, &#8220;4&#8221;, &#8220;5&#8221;, &#8220;6&#8221;, &#8220;7&#8221;, &#8220;8&#8221;, &#8220;9&#8221;, &#8220;a&#8221;, &#8220;b&#8221;, &#8220;c&#8221;, &#8220;d&#8221;, &#8220;e&#8221;, &#8220;f&#8221;);<br />
        for (var _loc1 = 0; _loc1 &lt; chars.length; ++_loc1)<br />
        {<br />
            _loc4 = _loc4 + (_loc3[chars[_loc1] &gt;&gt; 4] + _loc3[chars[_loc1] &amp; 15]);<br />
        } // end of for<br />
        return (_loc4);<br />
    } // End of the function<br />
    static function hexToChars(hex)<br />
    {<br />
        var _loc3 = new Array();<br />
        for (var _loc1 = hex.substr(0, 2) == &#8220;0x&#8221; ? (2) : (0); _loc1 &lt; hex.length; _loc1 = _loc1 + 2)<br />
        {<br />
            _loc3.push(parseInt(hex.substr(_loc1, 2), 16));<br />
        } // end of for<br />
        return (_loc3);<br />
    } // End of the function<br />
    static function charsToStr(chars)<br />
    {<br />
        var _loc3 = new String(&#8220;&#8221;);<br />
        for (var _loc1 = 0; _loc1 &lt; chars.length; ++_loc1)<br />
        {<br />
            _loc3 = _loc3 + String.fromCharCode(chars[_loc1]);<br />
        } // end of for<br />
        return (_loc3);<br />
    } // End of the function<br />
    static function strToChars(str)<br />
    {<br />
        var _loc3 = new Array();<br />
        for (var _loc1 = 0; _loc1 &lt; str.length; ++_loc1)<br />
        {<br />
            _loc3.push(str.charCodeAt(_loc1));<br />
        } // end of for<br />
        return (_loc3);<br />
    } // End of the function<br />
} // End of Class</p>
<p>[/code]</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
