2017-04-02 63 views
1

解碼ASCII字符串值,我反編譯一個LUA文件,unluac和原來所有的字符串變量不可讀取,並代替ascii encoded從反向工程LUA文件

clues = { 
    { 
    answer = { 
     "\216\173", 
     "\216\177", 
     "\216\168", 
     "\216\167", 
     "\216\161" 
    }, 
    text = "\216\173\217\138\217\136\216\167\217\134\032\216\178\216\167\216\173\217\129\032\217\138\216\186\217\138\216\177\032\217\132\217\136\217\134\032\216\172\217\132\216\175\217\135", 
    syllables = { 
     {"\216\173", "\216\177"}, 
     {"\216\168", "\216\167"}, 
     {"\216\161"} 
    } 

我如何去解碼整個文件ignoring any non ascii characters在Python或Java?

+0

可能會在每個斜槓上拆分字符串,然後將單個數字字符串轉換爲整數,然後轉換爲字符。那麼您可以檢查該值是否低於127以過濾非ASCII字符。 – Wietlol

+0

'ascii-encoded'是什麼意思?您不能同時使用包含非ASCII字符的ASCII編碼*和*,然後您需要忽略(由於定義中正確的ASCII編碼數據不能包含非ASCII編碼的數據)。你的意思是你需要*解碼數字轉義序列*或許? –

+0

根據我下面的回答,你沒有ASCII兼容的數據,你有阿拉伯文本。你確定*你想從這裏消除所有非ASCII數據嗎?你最終會得到空的琴絃。如果您必須*仍*刪除非ASCII數據,請參閱下面的答案和[用一個空格替換非ASCII字符](// stackoverflow.com/q/20078816)。 –

回答

2

你有UTF-8編碼的數據 ASCII,用編碼用十進制數三位數字轉義序列的每個字節。實際文本主要由阿拉伯文寫作組成。

您需要將每個\ddd序列替換爲相應的字節值,然後解碼爲UTF-8。在Python 3:

utf8_data = bytes([int(data[i + 1:i + 4]) for i in range(0, len(data), 4)]) 
print(utf8_data.decode('utf8')) 

演示:

>>> data = r"\216\173\217\138\217\136\216\167\217\134\032\216\178\216\167\216\173\217\129\032\217\138\216\186\217\138\216\177\032\217\132\217\136\217\134\032\216\172\217\132\216\175\217\135" 
>>> utf8_data = bytes([int(data[i + 1:i + 4]) for i in range(0, len(data), 4)]) 
>>> print(utf8_data.decode('utf8')) 
حيوان زاحف يغير لون جلده 

谷歌翻譯告訴我這是一個令人毛骨悚然的動物改變其在英語皮膚的顏色。

我們可以以其它方式使用一個基於堆棧的解析器的Lua語法轉換爲JSON:

import re 
import json 

def lua_to_python(lua_data): 
    return json.loads(''.join(_convert_lua_to_json_chunks(lua_data))) 

def _lua_bytes_to_text(data): 
    return bytes(
     [int(data[i + 1:i + 4]) for i in range(0, len(data), 4)] 
    ).decode('utf8') 

def _convert_lua_to_json_chunks(lua_data): 
    tokens = re.split(br'(["{},])', lua_data) 
    stack = [] 
    pos_tokens = enumerate(tokens) 
    for pos, token in pos_tokens: 
     if b'=' in token: 
      if not stack: 
       # top-level key-value, produce JSON object syntax 
       stack.append('}') 
       yield '{' 
      yield '"{}":'.format(token.strip().rstrip(b' =').decode('utf8')) 
     elif token == b'{': 
      # array or object? 
      next_nonws = next(t for t in tokens[pos + 1:] if t.strip()) 
      if b'=' in next_nonws: 
       stack.append('}') 
       yield '{' 
      else: 
       stack.append(']') 
       yield '[' 
     elif token == b'}': 
      yield stack.pop() 
     elif token == b'"': 
      yield '"' 
      for pos, s in pos_tokens: 
       if s == b'"': 
        yield '"' 
        break 
       yield _lua_bytes_to_text(s) 
     else: 
      yield token.decode('utf8') 
    yield from stack 

,並在最後兩個額外}人物,您的數據,那麼產生:

>>> lua_to_python(lua_data) 
{'clues': [{'answer': ['ح', 'ر', 'ب', 'ا', 'ء'], 'text': 'حيوان زاحف يغير لون جلده', 'syllables': [['ح', 'ر'], ['ب', 'ا'], ['ء']]}]} 
>>> pprint(lua_to_python(lua_data)) 
{'clues': [{'answer': ['ح', 'ر', 'ب', 'ا', 'ء'], 
      'syllables': [['ح', 'ر'], ['ب', 'ا'], ['ء']], 
      'text': 'حيوان زاحف يغير لون جلده'}]} 

這應該爲您提供充足的選項來進一步處理數據。

1

試試這個:

import re 

data = '\\216\\173\\217\\138\\217\\136\\216\\167\\217\\134\\032\\216\\178\\216\\167\\216\\173\\217\\129\\032\\217\\138\\216\\186\\217\\138\\216\\177\\032\\217\\132\\217\\136\\217\\134\\032\\216\\172\\217\\132\\216\\175\\217\\135' 
decoded_data = re.sub('\\\\(\d{1,3})', lambda x: chr(int(x.group(1))), data).decode('utf-8') 

print(repr(decoded_data)) 
+0

我一開始以爲這樣想,但是我在問題中發現了'\ 168'。由於'8'不能是八進制數,我認爲這些是十進制數。 – hallazzang

+0

是的,當我發表評論時,我知道我在計算中錯過了一個數字,並且也發現了這一點。 –

+0

在這一點上,這看起來像亂碼輸出(如果我們假定'text ='..''來保存實際*文本*,而不是二進制數據)。 –