2017-01-09 101 views
1

我想解碼一個混淆的Android應用程序。反編譯後,我可以看到幾個字符串以這種方式混淆:Python 2.7中的Unicode字符串XOR

static char[] java_decode(char[] cArr, char[] cArr2) { 
     int i = 0; 
     for (int i2 = 0; i2 < cArr.length; i2++) { 
      cArr[i2] = (char) (cArr2[i]^cArr[i2]); 
      i++; 
      if (i >= cArr2.length) { 
       i = 0; 
      } 
     } 
     return cArr; 
    } 
str2 = new String(epgwmgrwgrdvzck("浶㫻ᒍ夓䌎箜湛泰Ⳮ䯣倝".toCharArray(), new char[]{'浌', '㫛', 'ᓮ', '奼', '䍻', '篲', '港', '沂', 'Ⲕ', '𩣑', '倧'})).intern(); 
# java.lang.String str2 = ": country :" 

爲了更好地理解和快速審查,我想改變所有這些字符串進入平原之一;我選擇了Python,因爲它只是一種快速且快速的腳本語言。
不幸的是,我對這些多字節字符有些困難。這是我試着寫功能:

# coding=utf-8 

def decode(string1, string2): 
    string1 = list(string1) 

    i = 0 
    i2 = 0 

    while i2 < len(string1): 
     string1[i2] = chr(ord(string2[i])^ord(string1[i2])) 

     i += 1 

     if i >= len(string2): 
      i = 0 

     i2 += 1 

    string1 = str("".join(string1))  
    print string1 

    return string1 

decode("浶㫻ᒍ夓䌎箜湛泰Ⳮ䯣倝", ['浌', '㫛', 'ᓮ', '奼', '䍻', '篲', '港', '沂', 'Ⲕ', '𩣑', '倧']) 
# TypeError: ord() expected a character, but string of length 3 found 

這裏的主要問題是:ord()只接受一次一個字符,而這些字符串是由多字節字符的。
有關如何解決此問題的任何建議?

我使用Python 2.7.11 |蟒蛇4.0.0(x86_64的)。我知道Python 3比Python 2有更好的Unicode支持;如果該解決方案僅適用於Python 3,我可以毫無問題地使用它,因爲它只是一次性腳本。

+1

該死的,我要補充的Python版本,然後我點擊上「詢問」而不發佈。感謝您提醒 – tampe125

+0

使用Python 3.這些Python 2字符串類似於Java byte []',其中包含unicode字節。 –

回答

2

你的代碼工作是(除了你需要在Python 3改變print string1print(string1);輸出和返回值是字符串: country :

然而,這並不在Python 2的工作,因爲在Python 2中的字符串不是Unicode的;你需要前綴的所有Unicode字符串與u,即u'浌' /或者你需要使用from __future__ import unicode_literals使'在Python 2創建的Unicode文本;還有chr轉換值轉換成8位字符串值(即一個字節),而不是一個Unicode字符。


FWIW,代碼可以容易寫入Python 3中作爲

from itertools import cycle 

def decode(s1, s2): 
    return ''.join([ 
     chr(ord(c1)^ord(c2)) 
     for c1, c2 in 
     zip(s1, cycle(s2)) 
    ]) 

result = decode("浶㫻ᒍ夓䌎箜湛泰Ⳮ䯣倝", 
       ['浌', '㫛', 'ᓮ', '奼', '䍻', '篲', '港', '沂', 'Ⲕ', '𩣑', '倧']) 

print(result) # prints ": country :" 

首先它似乎java代碼允許第二陣列爲比第一短,並在這種情況下,其價值重複;在Python中,我們可以使用itertools.cycle更高效地實現此效果。我們使用zip來對輸入數組中的相應值進行配對,並使用列表理解來構建將被賦予''.join的列表。

該代碼可以通過添加from __future__ import unicode_literals和改變chrunichr一些小的修改工作,的Python 2,:

from __future__ import unicode_literals, print_function 
from itertools import cycle 

def decode(s1, s2): 
    return ''.join([ 
     unichr(ord(c1)^ord(c2)) 
     for c1, c2 in 
     zip(s1, cycle(s2)) 
    ]) 

result = decode("浶㫻ᒍ夓䌎箜湛泰Ⳮ䯣倝", 
       ['浌', '㫛', 'ᓮ', '奼', '䍻', '篲', '港', '沂', 'Ⲕ', '𩣑', '倧']) 

print(result) # prints ": country :" 
+0

謝謝!它完美的工作! – tampe125