1

最近、いくつかの 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'

4

6 に答える 6

4

注意が必要なのはloadstring、関連する関数が lua コードと lua バイト コードの両方を受け入れることです。その呼び出しにloadstringは、lua ソース コードではなく、バイト コンパイルされた lua が渡されます。

バイトコンパイルされた lua を簡単に入手できます。このような例を得ることができます

  • lua ファイルを作成します。
  • luac でコンパイルして lauc.out を生成する
  • 16 進数ビューアーでファイルの内容を確認します。

空の lua ファイルの場合、次のようになります。

0000000: 1b4c 7561 5100 0104 0804 0800 0900 0000  .LuaQ...........
0000010: 0000 0000 4066 6f6f 2e6c 7561 0000 0000  ....@foo.lua....
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 バイトを 10 進数に変換すると、次のようになります。

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

文字列内のエスケープ文字と一致します。

チャンク内のコードが何をするかについてさらに詳細が必要な場合は、チャンクをファイルに書き出し、lua 逆コンパイル ツールを使用して調査する必要があります。ChunkSpyluadec15、およびunluacは両方とも lua wikiツール ページに記載されています。

あなたが提供したチャンクには、それをさらに進めるのに十分なコンテンツがありません。切り捨てられたと思いますか?

于 2013-04-12T00:58:10.577 に答える
3

暗号化されているようには見えません。単なる一連のバイトのようです。各バックスラッシュは、文字とそのバイト コードを表します。

27 はエスケープ、76 は「L」、117 は「u」、97 は「a」などです。

短いスクリプトを実行すると、次の文字列が得られます (記号は、エスケープ、見出しの開始、null などの特殊文字です): ←LuaQ ☺♦♦ @ @C:\Users\Alex\Desktop

アスキー テーブルでバイトを調べることができます。

更新: 少し調査したところ、LuaQ はプリコンパイル済みスクリプトまたはそのようなものであることを意味することがわかりました。でも、私はかなり離れているかもしれません。

于 2013-04-12T00:49:21.620 に答える
0

簡単な答えだけではなく、途中でこのようなことに遭遇した場合に知っておくべきことをいくつかお知らせしたいと思います.

この種の難読化はあまり安全ではなく、実際には ASCII テーブルからのものです。:byte通常、この種の難読化は Lua 5.1 で行われ、とで簡単に作成できますtable.concat。トロイの説明のより強力なバージョンを使用して、このコードを単純に逆にすることができます。これにより、周囲のほとんどのセキュリティを回避できます。

function loadstring(input)
   print(input)
end

ですから、これがどのように機能するかについて少し理解していただければ幸いです。前述のように、これは使用:bytetable.concat使用によって複製できます。

于 2018-07-08T13:14:28.477 に答える
0

難読化を簡単に解除できる暗号化

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)
于 2020-07-19T15:28:23.157 に答える