деобфускация кода lua

Недавно я скачал код lua и обнаружил внутри какую-то запутанную строку. Это заставило меня задаться вопросом, какая техника запутывания использовалась там. У кого-нибудь есть идея?

local code='\27\76\117\97\81\0\1\4\4\4\8\0\64\0\0\0\64\67\58\92\85\115\101\114\115\92\65\108\101\120\92\68\101\115\107\116\111\112'
loadstring(code)()

РЕДАКТИРОВАТЬ: Еще немного (зашифрованного?) кода.

'\196\2\28\66\0\1\198\193\194\2\25\128\129\3\22\64\14\128\197\193\0\0\198\193\195\3\6\2\196\2\220\129\0\1\218'


person Robin64    schedule 12.04.2013    source источник
comment
Вы можете сохранить байт-код в файл io.open('bc','w'):write(code) и декомпилировать его с помощью luac -l -l bc.   -  person Egor Skriptunoff    schedule 12.04.2013
comment
@EgorSkriptunoff, luac -l дает вам список байт-кода, а не источник Lua, декомпилированный из байт-кода. Тем не менее, этого может быть достаточно, чтобы понять, что делает код.   -  person lhf    schedule 12.04.2013


Ответы (6)


Не выглядит зашифрованным вообще. Похоже, это просто последовательность байтов. Каждая обратная косая черта представляет символ с его байтовым кодом.

27 — escape, 76 — «L», 117 — «u», 97 — «a» и так далее.

Запустив его через короткий сценарий, я получаю эту строку (символы — это специальные символы, такие как escape, начало заголовка и ноль): ←LuaQ ☺♦♦ @ @C:\Users\Alex\Desktop

Вы можете найти байты в таблице ascii.

Обновление: небольшое исследование показало мне, что LuaQ означает, что это предварительно скомпилированный скрипт или что-то в этом роде. Я мог бы быть далеко, хотя.

person Netfangled    schedule 12.04.2013
comment
Спасибо за ответы. Воспользовавшись вашими советами, я получил первую интересную часть исходного кода: 'C:\Users\Alex\Desktop\encrypt.lua', а дальше все пошло тарабарщиной. Вот выдержка из этого: 65\2\0\193\129\1\0\226\64\0\2\137\192\0\129 Я также заметил, что некоторые значения, такие как 128, 137, 192, использовались повторно. . @michaelanderson предлагает ли это какие-либо общие методы шифрования? - person Robin64; 12.04.2013
comment
Я добавил в свой ответ несколько инструментов, которые могут позволить вам исследовать, что делает фрагмент. - person Michael Anderson; 12.04.2013

Сложность заключается в том, что loadstring и связанные с ней функции принимают как код lua, так и байтовый код lua. Этот вызов loadstring просто передает байтовый скомпилированный lua, а не исходный код lua.

Вы можете легко скомпилировать байт lua. Вы можете получить такой пример

  • Создайте луа-файл.
  • Скомпилируйте его с помощью luac, чтобы сгенерировать lauc.out
  • Посмотрите содержимое файла с помощью шестнадцатеричной программы просмотра.

Для пустого файла lua я получаю:

0000000: 1b4c 7561 5100 0104 0804 0800 0900 0000  .LuaQ...........
0000010: 0000 0000 4066 6f6f 2e6c 7561 0000 0000  [email protected]....
0000020: 0000 0000 0000 0002 0201 0000 001e 0080  ................
0000030: 0000 0000 0000 0000 0001 0000 0001 0000  ................
0000040: 0000 0000 0000 0000 00                   .........

Перевод первых 8 байтов в десятичный вид:

27, 76, 117, 97, 81, 0, 1, 4

Что соответствует экранированным символам в вашей строке.

Если вам нужны дополнительные сведения о том, что делает код в фрагменте, вам нужно записать фрагмент в файл и использовать инструмент декомпиляции lua для исследования. ChunkSpy, luadec15 и unluac упоминаются в lua wiki страница инструментов.

В фрагменте, который вы предоставили, недостаточно контента, чтобы я мог продолжить его, я полагаю, он усечен?

person Michael Anderson    schedule 12.04.2013

Если у него есть loadstring, простой способ, который может не всегда работать, - это просто добавить

строка_загрузки = печать;

на старте

person Troy    schedule 18.06.2018

Вместо того, чтобы пытаться просто дать вам простой ответ, я хотел бы сообщить вам некоторые вещи, которые нужно знать, если вы столкнетесь с подобными вещами на своем пути.

Этот вид обфускации не очень безопасен и на самом деле основан на таблице ASCII. Обычно такого рода обфускации делаются в Lua 5.1 и могут быть легко реализованы с помощью :byte и table.concat. Вы можете просто изменить этот код с помощью более мощной версии объяснения Троя, которая может обойти большую часть безопасности вокруг него:

function loadstring(input)
   print(input)
end

Так что я надеюсь, что вы получили некоторое представление о том, как это работает. Как указывалось ранее, это можно воспроизвести, используя :byte и table.concat использование.

person Lua Tutoring    schedule 08.07.2018

его легко деобфусцировать шифрование

local a ='\196\2\28\66\0\1\198\193\194\2\25\128\129\3\22\64\14\128\197\193\0\0\198\193\195\3\6\2\196\2\220\129\0\1\218'
print(a)
person ProB1    schedule 19.07.2020

Вы можете сделать это как

Старый код:

loadstring(your string)

вы просто можете увидеть/деобфусцировать его, используя print() вместо loadstring()

Новый код:

print(your string) 

Новый сценарий:

local code='\27\76\117\97\81\0\1\4\4\4\8\0\64\0\0\0\64\67\58\92\85\115\101\114\115\92\65\108\101\120\92\68\101\115\107\116\111\112'

print(code)
person EpicScripter    schedule 01.12.2020