<?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>岁月如歌 &#187; IDEA</title>
	<atom:link href="http://lifesinger.org/blog/tag/idea/feed/" rel="self" type="application/rss+xml" />
	<link>http://lifesinger.org/blog</link>
	<description>关注用户体验、前端开发，记录生活点滴、岁月足迹。</description>
	<lastBuildDate>Mon, 06 Sep 2010 15:05:09 +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>腾讯注册页面的 JS 解密</title>
		<link>http://lifesinger.org/blog/2009/11/tecent-signup-js-decode/</link>
		<comments>http://lifesinger.org/blog/2009/11/tecent-signup-js-decode/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 02:27:01 +0000</pubDate>
		<dc:creator>lifesinger</dc:creator>
				<category><![CDATA[开发]]></category>
		<category><![CDATA[encode]]></category>
		<category><![CDATA[IDEA]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[qq]]></category>
		<category><![CDATA[tecent]]></category>

		<guid isPermaLink="false">http://lifesinger.org/blog/?p=2261</guid>
		<description><![CDATA[先访问：http://signup.qq.com/ 然后下载：http://signup.qq.com/js/a.js 用 IntelliJ IDEA 格式化代码： var naa = true; O00O = new Array(); O00O[0] = ' f u n c t i o n p ( ) { v a r...'; OOO0 = 'fu'; OO0O = 'TVOBtOOIPdmbLGGEKsBJ'; OOO0 += 'nction __' + '__(_' + 'O0){'; O0O0 = 'v%61%72%20l%32%3Dw%69\156d\157w%2E...'; //... OOO0 += 'eva'; OOOO = [...]]]></description>
			<content:encoded><![CDATA[<p>先访问：<a href="http://signup.qq.com/">http://signup.qq.com/</a><br />
然后下载：http://signup.qq.com/js/a.js</p>
<p>用 IntelliJ IDEA 格式化代码：</p>
<pre>
var naa = true;
O00O = new Array();
O00O[0] = ' f u n c t i o n   p ( ) { v a r...';
OOO0 = 'fu';
OO0O = 'TVOBtOOIPdmbLGGEKsBJ';
OOO0 += 'nction __' + '__(_' + 'O0){';
O0O0 = 'v%61%72%20l%32%3Dw%69\156d\157w%2E...';
//...
OOO0 += 'eva';
OOOO = 'xxQFIxOBcaNyWMCROKJuuZcq';
OOO0 += 'l(unes' + 'cape(_O0))}';
eval(OOO0);
//...
____(O0O0);
OO00 += '0O.e 2   -&#038;O5NORmP...';
</pre>
<p><span id="more-2261"></span><br />
注意变量名，很囧很混淆。使用 IDEA 强大的重构工具，换个名和调整下顺序：</p>
<pre>
var naa = true;

var a = new Array();
a[0] = 'f u n c t i o n   p ( ) { v a r...';

var b = 'fu';
b += 'nction __' + '__(_' + 'O0){';
b += 'eva';
b += 'l(unes' + 'cape(_O0))}';
eval(b);
b = '';

var c = 'OROIOYrQlrnBFVmo';

var d = 'v\141r%20%6C%32%3Dw\151ndo...';
var e = 'KFevRhEwkUOOOcSLStJIOObYtLDkWZpWOkvT';
//...
</pre>
<p>b 太猥琐啦。处理下，加密方法浮出水面：</p>
<pre>
var naa = true;

var a = new Array();
a[0] = 'f u n c t i o n   p ( ) { v a r...';

var l2 = window.opera ? 1 : 0;
function unencode(l4) {
  //...
}

var lO = '';
for (var ii = 0; ii < a.length; ii++) {
    lO += unencode(a[ii]);
}

var Zz = 'i7f=zis&#038;&#038;!zOF?true:false;';
var Zy = lO.indexOf(Zz);
if (Zy >= 0) {
    lO = lO.substr(Zy + (Zz.length));
    if (naa) {
        document.write('<scr' + 'ipt>' + lO + '</sc' + 'ript>');
    }
}
</pre>
<p>根据上面代码的逻辑，可以立刻得到真实代码其实就在该脚本的下面。用 Firebug 一看，果真如此：<br />
<img src="http://lifesinger.org/blog/wp-content/uploads/2009/11/tecent-signup.png" alt="tecent-signup.png" /></p>
<p>这个页面的其它 js 也类似，用 Firebug 立刻就能找到已经解密好的代码。</p>
<p>发这篇文章，一是觉得 jerryhuang@tencent.com 的做法不可取（何苦自己折腾自己），二是推荐 Web 前端开发 IDE 中的王者：IntelliJ IDEA（目前已有社区开源免费版，强烈推荐）。</p>
]]></content:encoded>
			<wfw:commentRss>http://lifesinger.org/blog/2009/11/tecent-signup-js-decode/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>
