2016-12-22 8 views
0

メインモデルIDを取得するには、システムモデルにアクセスする必要があります。アンドロイドアプリでSWI Handlerをインストールするには

フォーム私が学んだこと、三つのステップがあるはず:

  • 取得スーパバイザモードでメインをMSR命令を使用して

    1. ユーザモードからスーパーバイザモードに入り、システムモードに切り替え
    2. 命令SWIてシステムモードでのレジスタIDは、次のコードを呼び出します。

      MRC p15, 0, R0, c0, c0, 0 
      

    Android OSでこれを実現したいと思います。正確には、私のアプリケーションが実行されているときにメインレジスタIDを取得したい。

    私はSWIハンドラをインストールする方法を勉強しました。

    ARM docによると、Androidでテストすると、例外が作成されます。

    誰かが同じ問題に出会い、最後にそれを解決しています〜

    PS助ける:?何をしようとする

    /* 
    * my install handler code 
    */ 
    unsigned installHandler(unsigned location, unsigned *vector) { 
        unsigned vec, oldVec; 
        vec = (location - (unsigned) vector - 0x8) | 0xe59ff000; 
        oldVec = *vector; 
        *vector = vec; 
        return oldVec; 
    } 
    
  • +1

    私の推測では、Android OSはアプリケーションがSWIハンドラをインストールすることを許可しないため、セキュリティモデルが壊れる可能性があります。アプリケーションはスーパーバイザモードで独自のコードを実行することはできません。また、OSにはすでにシステムコールを処理するためにSWIハンドラがインストールされている可能性があります。 –

    答えて

    3

    を多くの点で間違っています。あなたがリンクされ、同じ文書の引用


    :SWI命令が実行される

    は、プロセッサは、スーパバイザ・モードに入る

    今、任意のアプリケーションは、これをSWIハンドラをインストールすることができたとしどのアプリケーションもスーパーバイザーモードで実行できるということと同じです。
    これは、アプリケーションがOSの一部であるため、その保護を回避できるということと同じです。

    お金を儲けたいと思うJ.Doeは、携帯電話をロックするたびに彼のpremium-rate numberに電話をかけることで、あなたのクレジットを枯渇させ、お金を稼ぐアプリを書いています。
    OSはそれを行うことができ、アプリケーションはOSなので、それはできますか?
    また、OSはこのアプリケーションを停止することができません。いいこととのOS、特にモバイルのOSは、保護およびユーザーモードスーパーバイザーモードの間に明確な区別を持っている理由ですではないでしょう


    アプリケーションはユーザーモードで実行されるため、OSはそれらをサンドボックス化できます。


    低レベルの観点からも、あなたのしていたことは間違っています。

    • は絶対アドレスを記憶:
      あなたはこの方法で負荷PC方法

      を使用してSWIハンドラをインストールしようとしていた、プログラムカウンタがでハンドラアドレスに直接強制され適切なメモリ位置(ベクトルアドレスの4KB以内)にあるハンドラは、選択されたメモリ位置の内容をプログラムカウンタにロードする命令をベクトルに置く。

    だからlocation引数は、(それがポインタではなく、int型でなければなりません)ハンドラの完全なアドレスが書かれているアドレスではなく、ハンドラのアドレスです。
    しかし、あなたは既にそれを知っていたかもしれませんが、もう一つの落とし穴があります。

    SWIハンドラは、swiによって公開されるすべての可能な関数に対して一意です。一般的な実装では、swi命令が読み込まれ、その「コメント」ビットが正しい関数にジャンプします。
    簡単に言えば、SWIハンドラをインストールすることができたとしても、それはOSのものに置き換わるでしょう。


    おそらくXY problemに直面している、何もまともなユーザーは、それらが唯一のシステムプログラマのために有用であることが意図され、正確ので、アプリへのアクセスに特権レジスタをさせません。

    これらの中には、ユーザーモードアプリケーションに公開されていない機密情報が含まれている場合があります。OSが実際にこのような情報を開示できると判断した場合、読み取り専用のインターフェイスを提供します。
    AndroidがLinuxの場合は、/procファイルシステムなどを確認して、探しているものが見つかるかどうか確認してください。

    +0

    あなたの忍耐の返答に感謝します。非常に役に立ちます。同時に、私の問題の記述がXY問題を引き起こす可能性があることに気付きました。実際に、私が尋ねたいのは、Android App **のARMプラットフォームでメインレジスタIDを取得する方法を見つけることです**。私があなたの答えを見る前に、私は主な内容で説明した手順が最良の方法だと信じています。しかし、それは行き詰まりです。結局、私はそれが起こる実現可能な方法があるかどうかまだ疑問に思います。 – saisam

    +0

    @saisamあなたのアプリが非ARMアンドロイドプラットフォーム上で動作しているときに、何をしたいですか? –

    +0

    @lanこの場合、Cookは無視します。 – saisam

    関連する問題