web-dev-qa-db-ja.com

クラスがパッケージのどこかに存在するかどうかを確認する方法は?

現在、有料アプリケーションに関する特定の問題を扱っています。内部には、ライセンスチェックが含まれています。ハッカーはアプリのapk/jarを変更することで、アプリにパッチを適用します。ライセンスチェックのバイパスに役立つ新しいクラスを追加しています。

私の目標は、何らかの形でこの特定のパッチを確認することです。見つかった場合、アプリが危険にさらされていることがわかります。

パッケージで何かが変更されたことを知る方法に関するヒント私の場合、アプリにハッシュをかけることは実際には選択肢ではありません。

このクラスが存在するかどうかを確認するのが役立つと思いましたが、クラスの名前を変更したらどうなるでしょうか次に、クラスに追加された予期しないインクルードを何らかの方法でチェックするという別のアイデアがあります。

可能なものはどれですか?任意の提案が役立ちます:)

28
Jona

Androidについてはわかりませんが、標準JDKでは次のようなことを行います。

try {
 Class.forName( "your.fqdn.class.name" );
} catch( ClassNotFoundException e ) {
 //my class isn't there!
}
53
Liv

Android-標準Javaで使用したものは次のとおりです。

public boolean isClass(String className) {
    try  {
        Class.forName(className);
        return true;
    }  catch (ClassNotFoundException e) {
        return false;
    }
}

実装例:

if (isClass("Android.app.ActionBar")) {
    Toast.makeText(getApplicationContext(), "YES", Toast.LENGTH_SHORT).show();
}
14
Jared Burrows

使用できます

public static Class<?> forName (String className)

ClassNotFoundExceptionを確認します

http://developer.Android.com/reference/Java/lang/Class.html#forName%28Java.lang.String%29

4
Aleadam

ランダムパッケージのランダムクラスの場合、どのようにロードされますか?

とはいえ、 http://download.Oracle.com/javase/6/docs/api/Java/lang/System.html#getProperties%28%29 およびJava.class.pathを参照してください。通常のJavaアプリの場合、クラスパスを歩いてから、エントリ(jarの場合)またはディレクトリ(.classファイルの場合)を検索する必要があります。しかし、コンテナクラスローダー環境では、これは動作に失敗します(そして、それがAndroid環境)にどのように適用されるかわかりません。

1
Paul Webster