2010年12月13日星期一

Re: [PerlChina] 2010 Perl Advent Day 13: JE

我想写个脚本查询淘宝的快递。
虽然登录方便。但是javascript有混淆。
寒假试试。放到TODO里XD

在 2010年12月13日 下午7:07,Fayland Lam <fayland@gmail.com> 写道:
> http://advent.perlchina.org/2010/JE.html
>
> =for advent_year 2010
>
> =for advent_day 13
>
> =for advent_title JE
>
> =for advent_author Fayland Lam
>
> JavaScript 是个很不错的语言。网上有一个简单的叫 ROT 13 的加密来保护 email,今天我们做一点邪恶的事,就是简单破解该加密。
>
> ROT 13 的版本有很多,不过原理是一样的。下面是一个简单的例子。
>
> php 有内置的 str_rot13,Perl 我们需要安装 M<Crypt::Rot13>
>
> =begin code
>
> use Crypt::Rot13;
>
> my $rot13 = new Crypt::Rot13;
> $rot13->charge('<a href="mailto:test@example.com">test</a>');
> print $rot13->rot13() . "\n";
>
> =end code
>
> 然后我们把它放到 html 里。
>
> =begin code
>
> <script type="text/javascript">
> Rot13 = {
> map: null,
>
> convert: function(a) {
> Rot13.init();
>
> var s = "";
> for (i=0; i < a.length; i++) {
> var b = a.charAt(i);
> s += ((b>='A' && b<='Z') || (b>='a' && b<='z') ? Rot13.map[b] : b);
> }
> return s;
> },
>
> init: function() {
> if (Rot13.map != null)
> return;
>
> var map = new Array();
> var s = "abcdefghijklmnopqrstuvwxyz";
>
> for (i=0; i<s.length; i++)
> map[s.charAt(i)] = s.charAt((i+13)%26);
> for (i=0; i<s.length; i++)
> map[s.charAt(i).toUpperCase()] = s.charAt((i+13)%26).toUpperCase();
>
> Rot13.map = map;
> },
>
> write: function(a) {
> document.write(Rot13.convert(a));
> }
> }
>
> Rot13.write('<n uers="znvygb:grfg@rknzcyr.pbz">grfg</n>');
>
> </script>
>
> =end code
>
> 你会简单的发现,html 里显示的是跟 &lt;a href="mailto:test@example.com">test&lt;/a>
> 一样的东西,但是从源代码来看是加密过的。
>
> 上面只是一个很简单的例子。很多网页上可能不是 ROT 13 加密,但是我们无需理会,强大的 M<JE> 会解决一切。
>
> JE 是由 Perl 编写的 ECMAScript 引擎。虽然非 100% 兼容,但是大部分情况下都是很好用的。
>
> =begin code
>
> use JE;
>
> my $j = JE->new;
> my $v = $j->eval(<<'JS');
> Rot13 = {
> map: null,
>
> convert: function(a) {
> Rot13.init();
>
> var s = "";
> for (i=0; i < a.length; i++) {
> var b = a.charAt(i);
> s += ((b>='A' && b<='Z') || (b>='a' && b<='z') ? Rot13.map[b] : b);
> }
> return s;
> },
>
> init: function() {
> if (Rot13.map != null)
> return;
>
> var map = new Array();
> var s = "abcdefghijklmnopqrstuvwxyz";
>
> for (i=0; i<s.length; i++)
> map[s.charAt(i)] = s.charAt((i+13)%26);
> for (i=0; i<s.length; i++)
> map[s.charAt(i).toUpperCase()] = s.charAt((i+13)%26).toUpperCase();
>
> Rot13.map = map;
> },
>
> write: function(a) {
> return(Rot13.convert(a));
> }
> }
>
> Rot13.write('<n uers="znvygb:grfg@rknzcyr.pbz">grfg</n>');
> JS
>
> print $v->value;
>
> =end code
>
> 上面的代码我们使用了一点点小技巧,我们将 document.write 转成了 return, 这样我们会得到一个
> M<JE::String> 然后通过输出 ->value 来得到真正的 &gt;a
> href="mailto:test@example.com">test&gt;/a>
>
> 上面的东西看上去有点小无聊,自己破解自己加密的东西,但是您可以使用它来解密或者运行其他的 js 代码,这都将变得非常有趣。
>
> Enjoy!
>
> --
> Fayland Lam // http://www.fayland.org/
>
> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
> 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>
>

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

没有评论: