Advertisement
0x16_7ton

RanByUs Decrypt script

Feb 1st, 2013
351
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.14 KB | None | 0 0
  1. '''
  2. 0x16/7ton
  3.  
  4. '''
  5. import idaapi
  6. import idautils
  7. import idc
  8.  
  9.  
  10. #config
  11. #alf buffer
  12. buf_alf= "WyIDOSLQoTMMwRBdXFdhMMflIVncWuiouyjkOiWvhEsXvsiJwiIttNIe"
  13. #start address of offset table
  14. addr_crbl=0x101EEA8
  15. #Key Table Init size&value
  16. table_dword = [None]*0x1414
  17. memset_count=0
  18. while (memset_count<0x1414):
  19.     table_dword[memset_count]=0
  20.     memset_count+=1
  21.    
  22. table_dword [0] = 0x92B8374F;
  23. table_dword [0x4] = 0xA38C2612;
  24. table_dword [0x8] = 0x49847091;
  25. table_dword [0x0c] = 0x982D9283;
  26. table_dword [0x10] = 0x92B8374F;
  27. table_dword [0x410] = 0x49847091;
  28. ##Key table creating
  29. round_count=0x0
  30. count=0x11;
  31. i = 0x14
  32.  
  33. ###########1....
  34.  
  35. while (count):
  36.     table_dword [i]= 0xffffffff &(table_dword [0x4] + table_dword [i- 4])
  37.     i += 4
  38.     count-=1
  39. ##########2....
  40. i_start=0x414;
  41. while(1):
  42.     i =i_start
  43.     count = 0xFF
  44.     while ( count ):
  45.         table_dword [i] = 0xffffffff &(table_dword [0xC] + table_dword [i- 4])
  46.         i+= 4;
  47.         count-=1;
  48.        
  49.     if (round_count==0):
  50.         table_dword[0x810] = 0xffffffff &(table_dword[0x8]^(0xffffffff &(table_dword [0xC] & table_dword[0x80C])))
  51.     if (round_count==1):  
  52.         table_dword[0xc10] = 0xffffffff &(table_dword[0x8]^(0xffffffff &(table_dword [0xC] & table_dword[0xC0C])))
  53.     if (round_count==2):  
  54.         table_dword[0x1010] =0xffffffff &(table_dword[0x8]^(0xffffffff &(table_dword [0xC] & table_dword[0x100C])))
  55.     if (round_count==3):
  56.         break
  57.     i_start+=0x400;
  58.     round_count+=1;
  59. #########3....
  60. count2 = 0x12;
  61. i=0;
  62. r = 0x10;
  63. magick_dword = 0;
  64.  
  65. while ( count2):
  66.         magick_dword=0x0;
  67.         count= 4;
  68.         while ( count):
  69.             magick_dword = 0xffffffff &((0x000000ff & ord(buf_alf[i]))| (0xffffffff &(magick_dword<< 8)))
  70.             i+=1
  71.             if ( i == 0x38):
  72.                 i = 0
  73.             count-=1
  74.         table_dword[r]^= 0xffffffff &(magick_dword);
  75.         r += 4;
  76.         count2-=1
  77. #########4....
  78. count2=9
  79. magick_dword= 0x0
  80. magick_dword2 = 0x0;
  81. temp_1 = 0x0
  82. temp_2 = 0x0
  83. i=0x14;
  84. while(count2):
  85.     r=0x10;
  86.     count =0x10;
  87.     while ( count ):
  88.         magick_dword= 0xffffffff&(table_dword[r]^ magick_dword)
  89.         r+=4;
  90.         magick_dword2 ^= 0xffffffff&(table_dword[0xffffffff &(4*(magick_dword & 0xFF) + 0x1010)]
  91.                         +(table_dword[0xffffffff & (4*((magick_dword>>8) & 0xff)+0xc10)]
  92.                         ^(table_dword[0xffffffff&(4*((magick_dword>>16) & 0xff)+0x810)]
  93.                         +table_dword[0xffffffff & (4*(magick_dword>>0x18)+0x410)])))
  94.         temp_1 = magick_dword
  95.         magick_dword =magick_dword2
  96.         magick_dword2=temp_1
  97.         temp_2 = magick_dword
  98.         count-=1
  99.     magick_dword =temp_1 ^ table_dword[0x54];
  100.     magick_dword2=temp_2 ^ table_dword[0x50];
  101.     table_dword[i-4]=magick_dword
  102.     table_dword[i]=magick_dword2
  103.     i+=8
  104.     count2-=1
  105. i=0x414
  106. count3=4
  107. while(count3):
  108.     count2=0x80
  109.     while(count2):
  110.         r=0x10;
  111.         count =0x10;
  112.         while ( count ):
  113.             magick_dword= 0xffffffff&(table_dword[r]^ magick_dword)
  114.             r+=4;
  115.             magick_dword2 ^= 0xffffffff&(table_dword[0xffffffff &(4*(magick_dword & 0xFF) + 0x1010)]
  116.                             +(table_dword[0xffffffff & (4*((magick_dword>>8) & 0xff)+0xc10)]
  117.                             ^(table_dword[0xffffffff&(4*((magick_dword>>16) & 0xff)+0x810)]
  118.                             +table_dword[0xffffffff & (4*(magick_dword>>0x18)+0x410)])))
  119.             temp_1 = magick_dword
  120.             magick_dword =magick_dword2
  121.             magick_dword2=temp_1
  122.             temp_2 = magick_dword
  123.             count-=1
  124.         magick_dword =temp_1 ^ table_dword[0x54];
  125.         magick_dword2=temp_2 ^ table_dword[0x50];
  126.         table_dword[i-4]=magick_dword
  127.         table_dword[i]=magick_dword2
  128.  
  129.         i+=8
  130.         count2-=1
  131.     count3-=1
  132. ##############################
  133. #Dword Key table generated
  134. #now decrypt
  135. i=0
  136.  
  137. size_string=0
  138. string_count=0  
  139. addr_encr_str=0
  140. encr_dword=0x0
  141. encr_dword2=0x0
  142. temp_dword=0x0
  143. hash_dword=0x0
  144. while(True):
  145.     size_string=Dword(addr_crbl+i+0xc)
  146.     addr_encr_str=Dword(addr_crbl+i+0x4)
  147.     hash_dword=Dword(addr_crbl+i)
  148.  
  149.     if (size_string!=0):
  150.        
  151.         ea=0x01001000
  152.         str_1=hex(hash_dword).rstrip("L").lstrip("0x")
  153.         str_1=[''.join(x) for x in zip(*[list(str_1[z::2]) for z in range(2)])]
  154.         str_1 = ' '.join(["%s" % x for x in str_1[::-1]])
  155.         while True:
  156.             ea = FindBinary(ea, SEARCH_DOWN,str_1 )
  157.             if (ea==idaapi.BADADDR):
  158.                 break
  159.             MakeComm(ea+4,"0x%x" % addr_encr_str)
  160.             ea += 4
  161.  
  162.         print("string_%d hash_dword:0x%x size=%d addr_str=0x%x" % (string_count,hash_dword,size_string,addr_encr_str))
  163.         ###encrypt cycle
  164.  
  165.         size_string=(((size_string>>2)-1)>>1)+1
  166.         c=0
  167.         while(size_string):
  168.            
  169.             count=0x10
  170.             r = 0x54
  171.            
  172.             encr_dword=Dword(addr_encr_str+(c*8))
  173.             encr_dword2=Dword(addr_encr_str+4+(c*8))
  174.             while(count):
  175.                
  176.                 encr_dword2=0xffffffff&(table_dword[r]^ encr_dword2)
  177.                 encr_dword ^= 0xffffffff&(table_dword[0xffffffff &(4*(encr_dword2  & 0xFF) + 0x1010)]
  178.                               +(table_dword[0xffffffff & (4*((encr_dword2 >>8) & 0xff)+0xc10)]
  179.                               ^(table_dword[0xffffffff&(4*((encr_dword2>>16) & 0xff)+0x810)]
  180.                               +table_dword[0xffffffff & (4*(encr_dword2>>0x18)+0x410)])))
  181.                 temp_1=encr_dword2
  182.                 encr_dword2=encr_dword
  183.                 encr_dword=temp_1
  184.                 count-=1
  185.                 r-=4
  186.             temp_dword=encr_dword2
  187.             encr_dword2=temp_1
  188.             encr_dword=temp_dword
  189.             encr_dword=temp_dword^table_dword[0x14]
  190.             encr_dword2^=table_dword[0x10]
  191.             PatchDword(addr_encr_str+(c*8),encr_dword)
  192.             PatchDword(addr_encr_str+4+(c*8),encr_dword2)
  193.             c+=1
  194.             size_string-=1
  195.         string_count+=1
  196.         i+=0x10 #next block in offset table
  197.         ################
  198.     else:
  199.         break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement