Xposedフレームワークによる携帯電話録音カメラの無効化機能(hook android下位実装)


それとも以前の会社の需要を満たすために、お客様の需要を満たすために、携帯電話のカメラと録音機能を遠隔制御する必要があり、以前は設備マネージャを使ってカメラを無効にすることができたが、結局携帯電話の使用者が手動でクリックしてアクティブ化の選択肢を確定する必要があるのは美しくない.そのクリックの操作は自動化サービスで実現できるが、しかし、ちょっと大げさで効果的ではありませんので、私が使っているandroidの下位カメラと録音を無効にしたapiは、androidの下位コードを修正することで機能が失効し、携帯電話に付属しているカメラの録音を逆コンパイルするapkでも失効することができますが、結局これはapkにすぎません.他の写真や録音のappをダウンロードしています.あなたはやはり人に仕方がなくて、すべての関連する応用はすべてCamera、AudioRecordあるいはMediaRecorder類が実現した写真と音声を録画する機能を使って、私たちに関連する下位のコードを調べて、一部のコードを修正して一挙にこの3つの種類のすべてのappを呼び出すことができてすべて失効しました~
    话は多くなくて直接コードに行きます~xposedモジュールの配置の方面について私は绍介しません...できない学友は私のその他の招待状を见ることができてあるいはgoogleに行ってちょっと见て、あの3つの种类についてASの上でこの3つの包みを引き出すことができて、それからctri+左ボタンをクリックして入ってソースコードを见て、中のAPIの绍介のとても全面的で、英语が分からない学生に対して更にASの中で1つの自动的な翻訳のプラグインを诘めることができて、私は1つのASの翻訳のプラグインを推荐することができますあなた达は试みることができます~ネットがなくて使うことができません
クリックしてリンクを開く
 private void hookCamera(XC_LoadPackage.LoadPackageParam loadPackageParam) {
        try {
            XposedHelpers.findAndHookMethod("android.hardware.Camera", loadPackageParam.classLoader, "open", new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    if (ModelHelper.getGZipModel("Audio.qwer.com","disable").equals("disable")){
                        param.setResult(null);
                        Log.e("pptppt", "   ");
                    }
                }
            });

            XposedHelpers.findAndHookMethod("android.hardware.Camera", loadPackageParam.classLoader, "open",
                    int.class, new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    if (ModelHelper.getGZipModel("Audio.qwer.com","disable").equals("disable")){
                        param.setResult(null);
                        Log.e("pptppt", "       ");
                    }
                }
            });

        } catch (Exception e) {

        }
    }

CameraのAPIを読むことでopenメソッドの戻り値を無効にするだけでカメラを開くことができず、次に音声録音機能を無効にすることができます.
private void hookRecord(XC_LoadPackage.LoadPackageParam loadPackageParam) {
        try {
            Class> aClass = XposedHelpers.findClass("android.media.MediaRecorder", loadPackageParam.classLoader);
            XposedBridge.hookAllMethods(aClass, "setOutputFile", new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    super.beforeHookedMethod(param);
                    if (ModelHelper.getGZipModel("Audio.qwer.com","disable").equals("disable")){
                        param.args[0] = null;
                        Log.e("pptppt", "lalala1");
                    }
                }
            });
            /*********************************************************************************/
            XposedHelpers.findAndHookMethod("android.media.AudioRecord", loadPackageParam.classLoader, "getState", new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    if (ModelHelper.getGZipModel("Audio.qwer.com","disable").equals("disable")){
                        param.setResult(0);
                        Log.e("pptppt", "getState");
                    }
                }
            });

        }catch (Exception e){

        }
    }

以上が録音無効化機能を実現するコードであり,AudioRecordとMediaRecorderクラスを無効化することで無効化効果を実現した.
パラメータを変更したり値を返したりするときは、外側にif判断を付けて圧縮ファイルのstring文字列を読み込み、条件を満たさないときは禁止します.これは、無効化効果をより柔軟に実現するためです.無効にする必要がない場合は圧縮ファイルの内容を書き直せばいい~~以下はModelHelperクラスのコードです.
import android.util.Log;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;


public final class ModelHelper {
    public static final String DIR = "/sdcard/";

    /**
     * by kevin 07-03
     *        string  
     * @param modelName    
     * @param value                    
     * @return         modelName         value    
     */
    public static String getGZipModel(String modelName, String value) {
        try {
            File file = new File(DIR + modelName);
            if (!file.isFile() || !file.exists()) {
                return value;
            }
            byte [] buffer = new byte[10240];
            GZIPInputStream gis = new GZIPInputStream(new FileInputStream(file));
            int cnt = gis.read(buffer);
            gis.close();
            return new String(buffer, 0, cnt, "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
            return value;
        }
    }

    /**
     * by kevin 07-03
     * set cloud.sv       
     * @param fileName       
     * @param value      
     */
    public static void setGZipModel(String fileName,String value){
        try {
            FileOutputStream fos = new FileOutputStream(DIR + fileName);
            GZIPOutputStream gos = new GZIPOutputStream(fos);
            gos.write(value.getBytes());
            gos.flush();
            gos.finish();
        }catch (Exception e){
            Log.e("qswx", "            ");
        }
    }


    /**
     * by kevin 06-20
     *       
     * @param modelName    
     * @param value                    String    
     * @return               String  
     */
    public static String getModel(String modelName, String value) {
        try {
            File file = new File(DIR + modelName);
            if (!file.isFile() || !file.exists()) {
                return value;
            }
            Reader inputStreamReader = new InputStreamReader(new FileInputStream(file), "UTF-8");
            String str3 = new BufferedReader(inputStreamReader).readLine();
            inputStreamReader.close();
            return str3;
        } catch (Exception e) {
            e.printStackTrace();
            return value;
        }
    }

    /**
     * by kevin 06-20
     *   String            
     * @param modelName          
     * @param value       String   
     *
     * BufferedWriter       
     * .flush()          
     */
    public static void setModel(String modelName, String value) {
        BufferedWriter bufferedWriter = null;
        try {
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(DIR + modelName), false), "UTF-8"));
            bufferedWriter.write(value);
            bufferedWriter.flush();
            bufferedWriter.close();
        } catch (Exception e3) {
            e3.printStackTrace();
            try {
                if(bufferedWriter != null) {
                    bufferedWriter.close();
                }
            } catch (Exception e5) {

            }
        }
    }
}

通常のファイル内容を書き込む方法よりも、このようなロック解凍によってファイルプログラムのセキュリティが向上することは、セキュリティを強調することにすぎません.セキュリティの重要性はよく知られています.多すぎるxposedモジュールのソースコードは谁も分かち合いたくないのが多すぎて、私もこれもとても小さい机能はきっと失望する人がいるに违いありません. 私もシロ~