2017-12-14 7 views
2

私は大規模な独自のネイティブライブラリが必要なAndroidアプリを開発しています。これにより、ASからのデプロイメント時間が大幅に増加します。これは非常に面倒です。私は、各ダウンロードでそれを含めるのではなく、共有ストレージからライブラリを動的にロードしたいと思います。どのようにpropietaryコードがAndroidからのlibをロードしているかを変更するには?

System.load("/data/data/com.package.app/extraLib.so");このライブラリには独自のJavaラッパーも付属しているため、そのラッパーSystem.loadLibrary("Library");が呼び出されているため、私はちょうどSystem.load("/data/data/com.package.app/extraLib.so");を使用できません。したがって、libがASに含まれていない場合、プロプライエタリコードはUnsatisfiedLinkErrorでクラッシュします。

私のアプリケーションの保護されたストレージの/libフォルダにlibを手動でコピーしようとしました。ただし、何らかの理由で/libフォルダが書き込み禁止になっています。 (はい、私は自分のアプリのJavaコードからコピーしていましたので、ファイルエクスプローラアプリではありませんので、rootは必要ありません)

リバースエンジニアリングをせずにプロプライエタリコードがlibをロードする場所を変更する方法はありますか?

答えて

1

警告!あなたは開発のためにこれを行うべきであり、リリースアプリのために決して行うべきではありません!

このアプローチでは、あなたのアプリはコードインジェクション攻撃の脆弱性があります。


まあ、私はそれを行う方法を見つけました。私はこのコードが含まれているダミー1でASのLIBSのフォルダ内の実際のライブラリを置き換える:

int main() 
{ 
    return 0; 
} 

その後、私は.soファイルにすることをコンパイルし、元のライブラリの名前に改名され、それを挿入しました私のプロジェクトのlibsフォルダにコピーします。

File fileOnSharedStorage = new File("/mnt/sdcard/libTest.so"); 
    File fileInProtectedStorage = new File("/data/data/com.package.myapp/extra/libTest.so"); 
    File folder = new File("/data/data/com.package.myapp/extra/"); 

    if (!folder.exists()) 
    { 
     folder.mkdir(); 
    } 

    if(!fileInProtectedStorage.exists()) 
    { 
     try 
     { 
     copyFile(fileOnSharedStorage, fileInProtectedStorage); 
     } catch (IOException e) 
     { 
     e.printStackTrace(); 
     } 
    } 

    System.load("/data/data/com.package.myapp/extra/libTest.so"); 

をそして、それは動作します:

その後、私の主な活動のonCreate()方法では、私がやりました!

+0

コードインジェクション攻撃の影響を受け易い、安全でないアプリの開発方法をデモしていただきありがとうございます! – CommonsWare

+1

@CommonsWareこれは、開発をスピードアップするだけです。 **リリースアプリには通常の方法が含まれています** –

+0

@CommonsWareあなたは[完璧なソフトウェアとテストに関する他の錯覚]を読むべきです(https://www.goodreads.com/book/show/4060560-perfect-ソフトウェアとその他の錯覚について)膨大なネイティブライブラリがコードインジェクションやOSやコードの他の部分に影響されないことをどのようにして知ることができますか? –

関連する問題