2017-01-09 13 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 | Anaconda 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(string1)print string1を変更する必要があることを除いては、あなたのコードは動作します。出力と戻り値は文字列: country :ある

しかし、これはであるため、Pythonの2では動作しません。 Pythonの2文字列はユニコードではありません。あなたは、Python 2でのUnicodeリテラルを作成する「」にするためにfrom __future__ import unicode_literalsを使用する必要がすなわちu'浌' /代替として、uですべてのUnicode文字列リテラルの前に付ける必要があるだろう、ともchrが値を変換し、ユニコード文字ではなく8ビットの文字列値(つまりバイト)に変換します。


FWIWは、コードは簡単にすべての

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 :" 

まずとしてPython 3で書くことができ、Javaコードは二番目の配列が、最初よりも短くすることを可能にするようだと、この場合、その値は繰り返されます。 Pythonではitertools.cycleを使用してこの効果をより効率的に達成できます。 zipを使用して入力配列の対応する値をペアにし、リスト内包を使用して''.joinに与えられるリストを作成します。

このコードはfrom __future__ import unicode_literalsを追加しunichrchrを変更することで、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

関連する問題