BTraceシリーズの4:クラック事例


BTraceシリーズの4:クラック事例
判例を解読する
考え方を解読します:BTraceを使って簡単にJavaソフトウェアに対して解読の目的を達成することができます.
1.いくつかの兆候を捉えています.共有ソフトは無許可で使用されていることをみんな知っています.ソフトウェア開発者はまだ多くのお客様に購入・使用させていません.ソフトウェアの機能を制限し、ソフトウェアの使用を制限し、ソフトに対して不友好な表示をすることができます.これらは私達が捉えている兆候です.しかし、有利なことは欠点があります.ソフトウェア開発者はさまざまな制限やヒントを使って、ユーザーに注意したり、使用を強制したりして、確かにある程度のソフトウェアの販売量を増やすことができますが、これらの兆候によってソフトウェアの解読が可能になります.これらの兆候は、いくつかの不法分子のクラック共有ソフトウェアの入口にもなっています.
2.BTraceを使って追跡します.兆候を捕まえたら、BTraceアクチュエータを使ってこれらの兆候を捉えられます.主にBTraceを通じてこれらの兆候の判定ロジックを捕獲します.3.判断ロジックを修正して解読します.相対的にこのステップは簡単です.ステップ2で判断論理位置を見つけました.対応する位置を逆コンパイルして修正すればいいです.あるいはASMを使ってバイトコードの修正を行います.
逆コンパイルを使う場合、バイトコードがひどく混淆されたことがなく、いくつかの共有ソフトの開発者がツールを使ってバイトコードを混淆します.ツールによって混乱の度合いが違います.同じ辞書でも違いますが、確定できることの一つは逆コンパイルの難易度が高くなり、同様に修正判定ロジックが難しくなります.
実際の判例
下記は上記の考え方に基づいて、ある共有ソフトの解読を行います.
あるソフトは未購入の場合、2時間後に自動的に終了する問題があり、お客様の体験に深刻な影響を与えました.また、不友好なヒントもあります.私たちにとって2時間の自動退出はいい兆候です.退却はもちろんSystem.exit(0)によって実現されます.そして退出前にいくつかのヒントがあります.このようにしてSystem.exit(0)を追跡した後、提示情報によって区別します.いったいどれが私たちが本当に欲しいのですか?
BTraceスクリプトを使う:
/* BTrace Script Template */
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class TracingScript {
	/* put your code here */
    @OnMethod(clazz="+java.lang.Object", method="/.*/", location=@Location(value=Kind.CALL, clazz="java.lang.System", method="exit"))
    public static void trace(@ProbeClassName String className, @ProbeMethodName String methodName)
    {
        println("*****************************************");
        print(className);
        println(Strings.strcat(".", methodName));
}
 出力:
XXXX.XXX.A.G.B
このクラスを逆コンパイルします
static void B(String paramString)
    {
        if (N)
            return;
        N = true;
        SwingUtilities.invokeLater(new Runnable(paramString)
        {
            public void run()
            {
                JOptionPane.showMessageDialog(null, C.this
                        + ", System will exit.");
                System.exit(0);
            }
        });
    }
 
発見はこの方法で呼び出されたSystem.exit(0)です.次は簡単です.このクラスを修正して元のクラスファイルに置き換えればいいです.