Python 2.7中的Unicode字符串XOR

问题描述:

我想解码一个混淆的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字节。 –

你的代码工作是(除了你需要在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