从反向工程 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': 'حيوان زاحف يغير لون جلده'}]}
这应该为您提供大量选项来进一步处理数据。
我用 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': 'حيوان زاحف يغير لون جلده'}]}
这应该为您提供大量选项来进一步处理数据。