mediafire.comをホストするファイルの例でJavascriptを解読します

現在、ネストされたevalコマンドを使用してサイトのJavaScriptを暗号化する方法が人気を集めています。 最近、mediafire.comをホストしているファイルでこのような暗号化に出会いました。 暗号化は異常であり、興味があり、この方法がうまく機能することを理解することにしました。



Mediafire.comサイトでは、キャプチャなしでファイルをダウンロードできますが、同時に、最近では、あらゆる種類の自動ロボットから非常にうまく保護されています。 彼は、組み込みのJavaScriptコードジェネレーターを使用してこれを行います。 さらに、新しいコードが作成されるたびに、自動手段でコードをエミュレートすることが難しくなります。



この記事では、暗号化されたコードを詳細に分析することなくこのような保護を簡単に回避し、mediafire.comから自動ファイルアップロードスクリプトを作成する方法について説明します。



最初に、このコードがどのように見えるかを示します。

Copy Source | Copy HTML var h5u= '' ; var ybb=unescape( 'rev%24l%7Djg9%23%23%3Frev%24swhsp4l9qjawgeta%2C%23%213Bl%213F%216%3Da4c0%2A%2A6%213Bl%<<< >>>Z%3D--%3Fareh%2Cl%7Djg-%3F' ); for (i=0;i<1324;i++)h5u=h5u+(String.fromCharCode(ybb.charCodeAt(i)^4)); eval(h5u);



  1. Copy Source | Copy HTML var h5u= '' ; var ybb=unescape( 'rev%24l%7Djg9%23%23%3Frev%24swhsp4l9qjawgeta%2C%23%213Bl%213F%216%3Da4c0%2A%2A6%213Bl%<<< >>>Z%3D--%3Fareh%2Cl%7Djg-%3F' ); for (i=0;i<1324;i++)h5u=h5u+(String.fromCharCode(ybb.charCodeAt(i)^4)); eval(h5u);



  2. Copy Source | Copy HTML var h5u= '' ; var ybb=unescape( 'rev%24l%7Djg9%23%23%3Frev%24swhsp4l9qjawgeta%2C%23%213Bl%213F%216%3Da4c0%2A%2A6%213Bl%<<< >>>Z%3D--%3Fareh%2Cl%7Djg-%3F' ); for (i=0;i<1324;i++)h5u=h5u+(String.fromCharCode(ybb.charCodeAt(i)^4)); eval(h5u);



  3. Copy Source | Copy HTML var h5u= '' ; var ybb=unescape( 'rev%24l%7Djg9%23%23%3Frev%24swhsp4l9qjawgeta%2C%23%213Bl%213F%216%3Da4c0%2A%2A6%213Bl%<<< >>>Z%3D--%3Fareh%2Cl%7Djg-%3F' ); for (i=0;i<1324;i++)h5u=h5u+(String.fromCharCode(ybb.charCodeAt(i)^4)); eval(h5u);



  4. Copy Source | Copy HTML var h5u= '' ; var ybb=unescape( 'rev%24l%7Djg9%23%23%3Frev%24swhsp4l9qjawgeta%2C%23%213Bl%213F%216%3Da4c0%2A%2A6%213Bl%<<< >>>Z%3D--%3Fareh%2Cl%7Djg-%3F' ); for (i=0;i<1324;i++)h5u=h5u+(String.fromCharCode(ybb.charCodeAt(i)^4)); eval(h5u);





例からわかるように、コードは暗号化されています。 また、ページにアクセスするたびに、コードが変更されます。暗号化コード(XOR)の変更、evalのネストの変更、変数および関数の名前の変更。



このコードは、N個の関数(htmlで生成)の1つを呼び出します。この関数には、画面上のN個のブロック(htmlでも生成)の1つが含まれ、画面に表示されます。 次に、追加のスクリプト(これも暗号化されています)が読み込まれます。このスクリプトは、すべてのブロックへのファイルダウンロードへの擬似修正パスへのリンクを書き込み、これらのブロックの1つのみに正しいパスを書き込みます。



そのため、このようなファイルを自動的にダウンロードする問題を解決する必要があります

システム。



アクションプランを作成します。



1.メインページをダウンロードし、解読して、N個の関数のどれが呼び出され、どのN個のブロックに含まれているかを判断します(キーを見つけます)。

2.キーによるリンクを含むファイルをダウンロードし、N個のリンクのうちどれが実際のものであるかを解読して決定します(キーによって決定)

3.ファイルをダウンロードする



正直なところ、コードは絶えず変化しているため、コードと暗号化方法をすぐに解析するという考えを捨てました。 したがって、別の方法、つまりいくつかのブラウザー機能をエミュレートすることに注意を促します。



この問題は、即興的な手段spidermonkeyを使用して解決します。



システムにspidermonkeyをインストールします(私のFreeBSDの例):



cd /usr/ports/lang/spidermonkey

make install clean







私が遭遇した最大の問題は、実行可能コードがリンクを保存する場所と、それが呼び出す関数を正確に事前に知らないことです。 コード自体を解析しないために、ある種のgetElementById()関数を作成しました。この関数は、特定のHTML要素に値をロードするために使用されます。 私はこのようにしました:

Copy Source | Copy HTML



  1. var element = new Object ();
  2. element.innerHTML = "" ;
  3. var parent = new Object ();
  4. parent.document = new Object ();
  5. parent.document.getElementById = functiontheGetElementByID( x ){
  6. print( "HTML:" + element.innerHTML );
  7. print( "\ n" );
  8. print( "ELEMENT:" + x + ":" );
  9. 戻り要素。
  10. };
  11. //ここにコードを挿入
  12. print( "HTML:" + element.innerHTML );


変更されていないコード自体がこのラッパー内に挿入され、実行されます。 コードがgetElementById()関数を呼び出す場合、コードはinnerHTMLに保存されているすべてを表示します。



したがって、コードを変更せずに、スクリプトが保存する内容と場所を決定することが可能になります。



結論として、mediafire.comからファイルをダウンロードする実際の例をよく理解することをお勧めします。

Copy Source | Copy HTML



  1. / * <br/> *著作権(C)AIG <br/> * gmail.comでのaignospam <br/> * <br/> *ソースおよびバイナリ形式での再配布および使用、 <br/>の有無にかかわらず *変更以下の条件 が満たさ れている場合は許可され ます。 <br/> * 1.ソースコードの再配布には、上記の著作権 <br/> *通知、この条件のリスト、および以下の免責事項を 保持する必要があり ます。 <br/> * 2.バイナリ形式での再配布は、上記の著作権 <br/> *通知、この条件リスト、および以下の免責事項を <br/> *文書および/または配布で提供されるその他の資料に 複製する必要があり ます。 <br/> * <br/> *このソフトウェアは、「現状有姿」の著者および 寄稿者によって提供され、 <br/> * <br/>を含むがこれに限定され ない、明示または 黙示の保証特定の目的に対する商品性および適合性の保証 <br/> *否認されます。 いかなる場合も著者または貢献者は責任を負い ません <br/> *直接的、間接的、偶発的、特別、模範的 、または結果的 <br/> *損害賠償(代替品の調達を含むが、これらに限定されない <br/> *またはサービス、使用、データ、または利益の損失、またはビジネスの中断) <br/> *契約、厳格 、または責任を 問わず、責任の理論および理由にかかわらず、 責任または不法行為(過失またはその他を含む) )何らかの方法で発生する <br/> *このソフトウェアの使用から、たとえ <br/> *の 損害の可能性について知らされていても <br/> * /
  2. 関数 jsDecode( $ code
  3. {
  4. $ fh = fopen( './code.js''w' );
  5. fwrite( $ fh'var element = new Object(); element.innerHTML = "";' );
  6. fwrite( $ fh'var parent = new Object(); parent.document = new Object();' );
  7. fwrite( $ fh'parent.document.getElementById = function theGetElementByID(x){print( "HTML:" + element.innerHTML); print( "\ n"); print( "ELEMENT:" + x + ":" ); return element;}; ' );
  8. fwrite( $ fh$ code );
  9. fwrite( $ fh'print( "HTML:" + element.innerHTML);' );
  10. fclose( $ fh );
  11. return `js ./code.js 2 >&1`;
  12. }
  13. 関数 downloadMediafire( $ url
  14. {
  15. $ cookie_file = './cookie.mediafire.txt' ;
  16. @unlink( $ cookie_file );
  17. $ user_agent = "Mozilla / 4.0(互換性あり; MSIE 5.01; Windows NT 5.0)" ;
  18. $ ch = curl_init( $ url );
  19. curl_setopt( $ ch 、CURLOPT_RETURNTRANSFER、 1 );
  20. curl_setopt( $ ch 、CURLOPT_USERAGENT、 $ user_agent );
  21. curl_setopt( $ ch 、CURLOPT_FOLLOWLOCATION、 1 );
  22. curl_setopt( $ ch 、CURLOPT_COOKIEJAR、 $ cookie_file );
  23. curl_setopt( $ ch 、CURLOPT_COOKIEFILE、 $ cookie_file );
  24. $ result_parent = curl_exec( $ ch );
  25. $ referer = $ url ;
  26. //すべての関数を検索します
  27. if (!preg_match_all( "/ function \ s +([a-z0-9] +)\(qk \、pk \、r \)/"$ result_parent$ match_function_names )){
  28. print "生成された関数が見つかりません\ n" ;
  29. print $ result_parent ;
  30. falseを返します
  31. }
  32. $ code_header = '' ;
  33. foreach$ match_function_names [ 1 ] as $ function_name ){
  34. $ code_header 。= '関数' ;
  35. $ code_header 。= $ function_name ;
  36. $ code_header 。= '( qk 、pk、r)' ;
  37. $ code_header 。= '{print( "KEY:" + qk + ":" + pk + ":" + r + ":" + "'$ function_name'" + ":");};'; ;
  38. }
  39. if (!preg_match( '/Eo\(\);(.*?eval.*?)if/'、$ result_parent$ match_code )){
  40. print "キーコードが見つかりません\ n" ;
  41. print $ result_parent ;
  42. falseを返します
  43. }
  44. // eval関数をデコードします...
  45. $ code = jsDecode( $ code_header$ match_code [ 1 ]);
  46. if (!preg_match( '/KEY:(.*?):(.*?):(.*?):(.*?):/'、$ code$ match_key )){
  47. $コードを 印刷し ます
  48. falseを返します
  49. }
  50. $ qk = $ match_key [ 1 ];
  51. $ pk = $ match_key [ 2 ];
  52. $ r = $ match_key [ 3 ];
  53. $ valid_function_name = $ match_key [ 4 ];
  54. //可視要素を検索...
  55. if (!preg_match( '/ function'$ valid_function_name'\(。*?document.getElementById \(\'(。{32})\ '\)/'$ result_parent$ match_id )){
  56. print $ result_parent ;
  57. falseを返します
  58. }
  59. $ element_id = $ match_id [ 1 ];
  60. $ url = 'http://www.mediafire.com/dynamic/download.php?qk=' $ qk'&pk ='$ pk'&r ='$ r ;
  61. print "URL = $ url \ n" ;
  62. curl_setopt( $ ch 、CURLOPT_URL、 $ url );
  63. curl_setopt( $ ch 、CURLOPT_REFERER、 $ referer );
  64. $ result_fetch = curl_exec( $ ch );
  65. curl_close( $ ch );
  66. if (!preg_match( '/(var\s+et\s*=\s*15.*?)function/'、$ result_fetch$ match_header )){
  67. print "リンクヘッダーが見つかりません\ n" ;
  68. print $ result_fetch ;
  69. falseを返します
  70. }
  71. $ code_header = $ match_header [ 1 ];
  72. if (!preg_match( '/case\s+15:(.*?)break;/'、$ result_fetch$ match_code )){
  73. print "リンクコードが見つかりません\ n" ;
  74. print $ result_fetch ;
  75. falseを返します
  76. }
  77. // eval関数をデコードします...
  78. $ code = jsDecode( $ code_header$ match_code [ 1 ]);
  79. if (!preg_match( ' /'。$ element_id'。*?href = "http:\ / \ /([^"] +) "/'$ code$ match_url )){
  80. print "要素urlが見つかりません\ n" ;
  81. $コードを 印刷し ます
  82. falseを返します
  83. }
  84. $ file_url = $ match_url [ 1 ];
  85. print "URL = $ file_url \ n" ;
  86. $ file = basename( $ file_url );
  87. $ url = "http:// $ file_url" ;
  88. if (file_exists( $ file )){
  89. trueを返します
  90. }
  91. $ fp = fopen( $ file'w' );
  92. $ ch = curl_init( $ url );
  93. curl_setopt( $ ch 、CURLOPT_RETURNTRANSFER、 1 );
  94. curl_setopt( $ ch 、CURLOPT_USERAGENT、 $ user_agent );
  95. curl_setopt( $ ch 、CURLOPT_FOLLOWLOCATION、 1 );
  96. curl_setopt( $ ch 、CURLOPT_COOKIEJAR、 $ cookie_file );
  97. curl_setopt( $ ch 、CURLOPT_COOKIEFILE、 $ cookie_file );
  98. curl_setopt( $ ch 、CURLOPT_REFERER、 $ referer );
  99. curl_setopt( $ ch 、CURLOPT_FILE、 $ fp );
  100. $ result = curl_exec( $ ch );
  101. $ info = curl_getinfo( $ ch );
  102. curl_close( $ ch );
  103. fclose( $ fp );
  104. if$ info [ 'http_code' ]!= 200 ){
  105. print_r( $ info );
  106. falseを返します
  107. }
  108. trueを返します
  109. }



All Articles