GameGuardian(以下GG)ユーザーなら、ネット上で配布されている「暗号化されたLuaスクリプト」を見たことがあるはずです。

「このスクリプトの中身はどうなっているの?」「勉強のためにコードを読みたい」

そう思ったことはありませんか?本記事では、GGで使用されるLuaスクリプトの基本的な仕組みと、教育目的での解析・復号化のアプローチ(Hooking)について技術的に解説します。

⚠ 注意

本記事は技術的な仕組みを理解するための学習用コンテンツです。著作権を侵害する行為や、有料スクリプトのクラッキング、悪用を推奨するものではありません。解析は自己責任で行ってください。

Luaスクリプトの「暗号化」の正体とは?

一般的に「暗号化」と呼ばれているものの多くは、実は以下の2つのパターンのどちらか(あるいは組み合わせ)です。

1. バイトコード化 (Pre-compiled)

Luaはソースコードをそのまま実行するのではなく、一度「バイトコード」という機械が読みやすい形式に変換します。拡張子が .lua でも、中身を開くと LuaQLuaR で始まる文字化けしたようなファイルになっている場合がこれです。

2. 難読化・ローダーの使用

スクリプト全体を複雑な文字列に変換し、それを実行時に load() 関数などで読み込ませる方法です。実際の処理コードは見えませんが、実行時には必ず元のコードに戻っています。

解析方法:load関数のフック (Hook)

最も汎用性が高いのが、Luaの実行関数を「フック(横取り)」する方法です。

Luaには文字列をコードとして読み込む loadloadstring という関数があります。暗号化されたスクリプトも、最終的にはこの関数を通して実行されます。

つまり、「実行される直前に中身を表示させる」という処理を割り込ませれば、平文のソースコードを取得できます。

解析用スクリプトのコード

以下は、load 関数をフックして、読み込まれるコードの中身をファイルに保存(またはログ出力)するための基本的なコードです。

Lua Hook Script
-- 元のload関数を保存
local old_load = load

-- load関数を上書き(フック)
load = function(chunk, chunkname, mode, env)
    -- 読み込まれたコード(chunk)が存在する場合
    if chunk then
        -- ここでコードの中身を出力または保存
        print("\n=== DECRYPTED CODE START ===\n")
        print(chunk) 
        print("\n=== DECRYPTED CODE END ===\n")
        
        -- 必要であればファイルに保存する処理をここに追加
        -- local file = io.open("/sdcard/dump.lua", "a")
        -- file:write(chunk .. "\n")
        -- file:close()
    end
    
    -- 元のload関数を実行して、通常の動作に戻す
    return old_load(chunk, chunkname, mode, env)
end

-- この後に解析したいスクリプトをrequireまたはdofileで読み込む
print("Hook installed. Now execute the target script.")

使い方の手順

  1. GameGuardianのスクリプト実行画面を開く。
  2. 上記のコードをコピーし、新しいLuaファイル(例:hook.lua)として保存する。
  3. 解析したいスクリプトの実行前に、この hook.lua を実行する(あるいは、解析したいスクリプトの先頭に貼り付ける)。
  4. 暗号化されたスクリプトが実行されると、GGのログ画面等に復号された中身が表示される。

バイトコードのデコンパイルについて

上記の方法で取得したコードが、まだ文字化けしている(バイトコードのまま)場合は、デコンパイラが必要です。

PCツールを使用するのが一般的です。

  • unluac: Java製の有名なデコンパイラ。Lua 5.1系に強い。
  • luadec: 別の強力なデコンパイラ。

GameGuardianは標準でLua 5.3ベース(一部独自仕様)を使用していることが多いですが、スクリプトによっては5.1やJIT互換の場合もあります。

ポイント
完全に元のソースコード(変数名やコメント)に戻るわけではありません。変数名が L0_1 のような機械的な名前になることが多いですが、処理の流れ(ロジック)は理解できるようになります。

まとめ

Luaスクリプトの解析は、プログラミングの学習において非常に勉強になります。他者が書いたコードのロジックを知ることで、自分のスクリプト作成能力も向上します。

ただし、作成者が意図して隠しているロジックを暴く行為には倫理的な問題も伴います。あくまで個人の学習範囲内で留め、悪用しないようにしましょう。

より詳しいLuaの仕様については、公式ドキュメントを参照することをおすすめします。