从反向工程 lua 文件中解码 Ascii 字符串值

Decode Ascii string values from reverse-engineered lua file

我用 unluac 反编译了一个 lua 文件,结果发现所有字符串变量都不可读,而是 ascii encoded

clues = {
  {
    answer = {
      "63",
      "67",
      "68",
      "67",
      "61"
    },
    text = "63787667742686763792786678672727674262726575",
    syllables = {
      {"63", "67"},
      {"68", "67"},
      {"61"}
    }

如何解码 python 或 java 中的整个文件 ignoring any non ascii characters

试试这个:

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))

您有 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"63787667742686763792786678672727674262726575"
>>> utf8_data = bytes([int(data[i + 1:i + 4]) for i in range(0, len(data), 4)])
>>> print(utf8_data.decode('utf8'))
حيوان زاحف يغير لون جلده

Google 翻译告诉我这是 A creepy animal changes the color of its skin 英文。

否则我们可以使用基于堆栈的解析器将 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': 'حيوان زاحف يغير لون جلده'}]}

这应该为您提供大量选项来进一步处理数据。