Advertisement
Guest User

MegaCrypter

a guest
Dec 19th, 2013
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.87 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. VERSION="1.2"
  4.  
  5. MEGA_API_URL="https://g.api.mega.co.nz"
  6. MEGA_API_KEY=""
  7. MC_API_URL="http://megacrypter.com/api"
  8. OPENSSL_AES_CTR_DEC="openssl enc -d -aes-128-ctr"
  9. OPENSSL_AES_CBC_DEC="openssl enc -a -A -d -aes-128-cbc"
  10.  
  11. # 1:json_string 2:index
  12. function json_param {
  13.     echo -ne "$1" | tr -d '\n' | perl -pe "s/^.*\"$2\" *?\: *?([0-9]+|true|false|null|\".*?(?<!\\\\)\").*?$/\1/s" | perl -pe "s/^\"(.+)\"$/\1/" | tr -d '\\'
  14. }
  15.  
  16. # 1:b64_encoded_String
  17. function b64_pad {
  18.    
  19.     b64=$(echo -ne "$1" | tr '\-_' '+/')
  20.    
  21.     pad=$(((4-${#1}%4)%4))
  22.    
  23.     for i in $(seq 1 $pad)
  24.     do
  25.         b64="${b64}="
  26.     done
  27.    
  28.     echo -n "$b64"
  29. }
  30.  
  31. # 1:string
  32. function md5 {
  33.  
  34.     echo -n "$1" | md5sum | tr -d -c [:alnum:]
  35. }
  36.  
  37. # 1:pass 2:double_md5 3:salt
  38. function is_valid_pass {
  39.  
  40.     if [ $(md5 "$3$(md5 "$1")$3") != $2 ]
  41.     then
  42.         echo -n "0"
  43.     else
  44.         echo -n "1"
  45.     fi
  46. }
  47.  
  48. # 1:hex_raw_key
  49. function hrk2hk {
  50.     key[0]=$(( 0x${1:0:16} ^ 0x${1:32:16} ))
  51.  
  52.     key[1]=$(( 0x${1:16:16} ^ 0x${1:48:16} ))
  53.  
  54.     printf "%016x" ${key[*]}
  55. }
  56.  
  57. echo -e "\nThis is MEGA-DOWN $VERSION"
  58.  
  59. if [ -z $1 ]
  60. then
  61.     echo -e "\n$0 <mega_url|mc_url> [speed_limit_bytes_second] [output_file] [mc_url_pass]\n\nNote: use '-' for output to STDOUT\n"
  62. else
  63.    
  64.     if [ $(echo -n $1 | grep -E -o 'mega\.co\.nz') ]
  65.     then
  66.        
  67.         #MEGA.CO.NZ LINK
  68.        
  69.         file_id=$(echo -n $1 | perl -pe "s/^.*\/#!(.+)!.*$/\1/s")
  70.        
  71.         file_key=$(echo -n $1 | perl -pe "s/^.*\/#!.+!(.*)$/\1/s")
  72.        
  73.         hex_raw_key=$(echo -n $(b64_pad $file_key) | base64 -d -i 2>/dev/null | od -An -t x1 | tr -d '\n ')
  74.        
  75.         mega_req_url="${MEGA_API_URL}/cs?id=$seqno&ak=$MEGA_API_KEY"
  76.        
  77.         mega_req_json="[{\"a\":\"g\", \"p\":\"$file_id\"}]"
  78.        
  79.         mega_res_json=$(curl -s -X POST --data-binary "$mega_req_json" "$mega_req_url")
  80.        
  81.         if [ $(echo -n "$mega_res_json" | grep -E -o '\[\-[0-9]\]') ]
  82.         then
  83.             error_code=$(echo -n "$mega_res_json" | perl -pe "s/^.*\[(.*?)\].*$/\1/s")
  84.             echo -e "\nMEGA ERROR: $error_code\n" 1>&2
  85.             exit
  86.         else   
  87.             file_size=$(json_param "$mega_res_json" s)
  88.            
  89.             at=$(json_param "$mega_res_json" at)
  90.  
  91.             hex_key=$(hrk2hk "$hex_raw_key")
  92.            
  93.             at_dec_json=$(echo -n $(b64_pad "$at") | $OPENSSL_AES_CBC_DEC -K $hex_key -iv "00000000000000000000000000000000" -nopad)
  94.            
  95.             if [ $(echo -n "$at_dec_json" | grep -E -o 'MEGA') ]
  96.             then
  97.                 file_name=$(json_param "$(echo -n $(b64_pad "$at") | $OPENSSL_AES_CBC_DEC -K $hex_key -iv "00000000000000000000000000000000" -nopad)" n)
  98.                
  99.                 mega_req_json="[{\"a\":\"g\", \"g\":\"1\", \"p\":\"$file_id\"}]"
  100.                
  101.                 mega_res_json=$(curl -s -X POST --data-binary "$mega_req_json" "$mega_req_url")
  102.                
  103.                 dl_temp_url=$(json_param "$mega_res_json" g)
  104.             else
  105.                 echo -e "\nMEGA ERROR: bad link\n" 1>&2
  106.                 exit
  107.             fi
  108.         fi
  109.     else
  110.        
  111.         #MEGACRYPTER LINK
  112.        
  113.         info_link=$(curl -s -X POST --data-binary "{\"m\":\"info\", \"link\":\"$1\"}" "$MC_API_URL")
  114.  
  115.         if [ $(echo $info_link | grep '"error"') ]
  116.         then
  117.             error_code=$(json_param "$info_link" error)
  118.             echo -e "\nMEGACRYPTER ERROR: $error_code\n" 1>&2
  119.         else
  120.             if [ -z $3 ]
  121.             then
  122.                 file_name=$(json_param "$info_link" name)
  123.             else
  124.                 file_name="$3"
  125.             fi     
  126.            
  127.             pass=$(json_param "$info_link" pass)
  128.            
  129.             if [ $pass != "false" ]
  130.             then
  131.                 arr_pass=(${pass//#/ })
  132.                 pass_double_md5=${arr_pass[0]}
  133.                 pass_salt=${arr_pass[1]}
  134.                 pass=""
  135.  
  136.                 if [ $4 ]
  137.                 then
  138.                     pass="$4"
  139.                                
  140.                     if [ $(is_valid_pass $pass $pass_double_md5 $pass_salt) -eq 0 ]
  141.                     then
  142.                         pass=""
  143.                     fi
  144.                 fi
  145.                
  146.                 if [ -z $pass ]
  147.                 then       
  148.                     read -e -p "Link is password protected. Enter password: " pass
  149.                            
  150.                     until [ $(is_valid_pass $pass $pass_double_md5 $pass_salt) -eq 1 ]; do
  151.                         read -e -p "Wrong password! Try again: " pass
  152.                     done       
  153.                 fi
  154.  
  155.                 hex_raw_key=$(echo -n $(b64_pad $(json_param "$info_link" key)) | $OPENSSL_AES_CBC_DEC -K $(md5 "$pass") -iv "00000000000000000000000000000000" | od -An -t x1 | tr -d '\n ')
  156.                
  157.                 if [ -z $3 ]
  158.                 then
  159.                     file_name=$(echo -n $(b64_pad "$file_name") | $OPENSSL_AES_CBC_DEC -K $(md5 "$pass") -iv "00000000000000000000000000000000")
  160.                 fi
  161.             else
  162.                 hex_raw_key=$(echo -n $(b64_pad $(json_param "$info_link" key)) | base64 -d -i 2>/dev/null | od -An -t x1 | tr -d '\n ')   
  163.             fi
  164.  
  165.             file_size=$(json_param "$info_link" size)
  166.  
  167.             hex_key=$(hrk2hk "$hex_raw_key")
  168.  
  169.             dl_link=$(curl -s -X POST --data-binary "{\"m\":\"dl\", \"link\":\"$1\"}" "$MC_API_URL")
  170.  
  171.             if [ $(echo $dl_link | grep '"error"') ]
  172.             then
  173.                 error_code=$(json_param "$dl_link" error)
  174.                 echo -e "\nMEGACRYPTER ERROR: $error_code\n" 1>&2
  175.                 exit       
  176.             else           
  177.                 dl_temp_url=$(json_param "$dl_link" url)
  178.             fi
  179.         fi
  180.     fi
  181.    
  182.     if [ "$3" != "-" ]
  183.         then
  184.        
  185.         if [ -z $2 ]
  186.         then
  187.             CURL_DL_COMMAND="curl -s"
  188.         else
  189.             CURL_DL_COMMAND="curl -s --limit-rate $2"
  190.         fi
  191.        
  192.         if [ $file_size -ge 1024 ]
  193.         then
  194.             file_size_f="~"$(($file_size/(1024*1024)))" MB"
  195.         else
  196.             file_size_f="${file_size} bytes"
  197.         fi
  198.  
  199.         echo -e "\nDownloading ${file_name} [${file_size_f}] ...\n"
  200.        
  201.         if [ -f "${file_name}.temp" ]
  202.             then
  203.                 echo -e "\nResuming download ...\n"
  204.            
  205.                 temp_size=$(stat -c %s "${file_name}.temp")
  206.            
  207.                 offset=$(($temp_size-$(($temp_size%16))))
  208.  
  209.                 iv_forward=$(printf "%016x" $(($offset/16)))
  210.  
  211.                 hex_iv="${hex_raw_key:32:16}$iv_forward"
  212.            
  213.                 truncate -s $offset "${file_name}.temp"
  214.  
  215.                 $CURL_DL_COMMAND "$dl_temp_url/$offset" | pv -s $(($file_size-$offset)) | $OPENSSL_AES_CTR_DEC -K $hex_key -iv $hex_iv >> "${file_name}.temp"
  216.             else
  217.                 hex_iv="${hex_raw_key:32:16}0000000000000000"              
  218.                 $CURL_DL_COMMAND "$dl_temp_url" | pv -s $file_size | $OPENSSL_AES_CTR_DEC -K $hex_key -iv $hex_iv > "${file_name}.temp"
  219.             fi
  220.  
  221.             mv "${file_name}.temp" "${file_name}"
  222.        
  223.             echo -e "\nFILE DOWNLOADED :)!\n"
  224.         else
  225.             hex_iv="${hex_raw_key:32:16}0000000000000000"
  226.             $CURL_DL_COMMAND "$dl_temp_url" | $OPENSSL_AES_CTR_DEC -K $hex_key -iv $hex_iv
  227.         fi
  228. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement