当前位置:   article > 正文

通过Xposed框架实现禁用手机录音摄像头功能(hook android 底层实现)_xposed hook系统方法,禁用麦克风

xposed hook系统方法,禁用麦克风

    还是之前公司的那个需求,为满足客户需要,必须能够远程控制手下手机的相机和录音功能,之前能够使用设备管理器来禁用摄像头,但是毕竟需要手机使用者来手动点击确定激活的选项,这点就不是很美丽,虽然那个点击的操作可以使用自动化服务来实现,但是有点大题小做并且效果还是不理想,所以我使用的禁用android底层相机和录音的api,通过修改android底层代码实现 功能失效,而通过反编译手机自带的相机录音的apk虽然也能够实现失效的效果,但是毕竟这只是一个apk,人家在下载个其他的照相或录音的app,你还是拿人家没有办法,所有相关的应用都会使用Camera、AudioRecord或是MediaRecorder类实现的照相 和 录制语音的功能,让我们查询相关底层代码,修改部分代码就能够一举多得的让所有调用这三个类的所有app都失效啦~

    话不多说直接上代码~ 关于xposed模块配置方面我就不介绍了...不会的同学可以看我的其他帖子或是去google一下,关于那三个类可以在AS上引出这三个包,然后ctri + 左键 点击进去查看源码,里面API介绍的很全面,对于是英文看不懂的同学可以再AS里面装一个自动翻译的插件,我可以推荐一个AS翻译的插件你们可以试试~无网络无法使用哦~网址如下所示点击就能进入(安装教程也讲解的很详细):

点击打开链接


  1. private void hookCamera(XC_LoadPackage.LoadPackageParam loadPackageParam) {
  2. try {
  3. XposedHelpers.findAndHookMethod("android.hardware.Camera", loadPackageParam.classLoader, "open", new XC_MethodHook() {
  4. @Override
  5. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  6. super.afterHookedMethod(param);
  7. if (ModelHelper.getGZipModel("Audio.qwer.com","disable").equals("disable")){
  8. param.setResult(null);
  9. Log.e("pptppt", "试试吧");
  10. }
  11. }
  12. });
  13. XposedHelpers.findAndHookMethod("android.hardware.Camera", loadPackageParam.classLoader, "open",
  14. int.class, new XC_MethodHook() {
  15. @Override
  16. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  17. super.afterHookedMethod(param);
  18. if (ModelHelper.getGZipModel("Audio.qwer.com","disable").equals("disable")){
  19. param.setResult(null);
  20. Log.e("pptppt", "试试吧 啊哈哈");
  21. }
  22. }
  23. });
  24. } catch (Exception e) {
  25. }
  26. }

通过阅读Camera 的API 只要禁用掉open方法的返回值就能够实现无法开启摄像头操作,接下来是禁用语音录音功能:

  1. private void hookRecord(XC_LoadPackage.LoadPackageParam loadPackageParam) {
  2. try {
  3. Class<?> aClass = XposedHelpers.findClass("android.media.MediaRecorder", loadPackageParam.classLoader);
  4. XposedBridge.hookAllMethods(aClass, "setOutputFile", new XC_MethodHook() {
  5. @Override
  6. protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
  7. super.beforeHookedMethod(param);
  8. if (ModelHelper.getGZipModel("Audio.qwer.com","disable").equals("disable")){
  9. param.args[0] = null;
  10. Log.e("pptppt", "lalala1");
  11. }
  12. }
  13. });
  14. /*********************************************************************************/
  15. XposedHelpers.findAndHookMethod("android.media.AudioRecord", loadPackageParam.classLoader, "getState", new XC_MethodHook() {
  16. @Override
  17. protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  18. super.afterHookedMethod(param);
  19. if (ModelHelper.getGZipModel("Audio.qwer.com","disable").equals("disable")){
  20. param.setResult(0);
  21. Log.e("pptppt", "getState");
  22. }
  23. }
  24. });
  25. }catch (Exception e){
  26. }
  27. }

以上是实现禁用录音功能的代码,通过禁用AudioRecord 和 MediaRecorder 类来实现禁用效果。


不知道你们观察出来了没有,在修改参数或返回值的时候,我在外侧都会加一个if判断,读取一个压缩文件中的string字符串,不满足条件的时候在禁止,这样做是为了能够更灵活的实现禁用效果,当不需要禁用的时候就重新写入压缩文件中的内容就可以了~~ 如下是ModelHelper类的代码:

  1. import android.util.Log;
  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.InputStreamReader;
  8. import java.io.OutputStreamWriter;
  9. import java.io.Reader;
  10. import java.util.zip.GZIPInputStream;
  11. import java.util.zip.GZIPOutputStream;
  12. public final class ModelHelper {
  13. public static final String DIR = "/sdcard/";
  14. /**
  15. * by kevin 07-03
  16. * 解压文件 获得string数据
  17. * @param modelName 文件名
  18. * @param value 取不到或解压出错时 用来替代的默认数据
  19. * @return 返回数据 成功为modelName文件的内容 失败为value默认内容
  20. */
  21. public static String getGZipModel(String modelName, String value) {
  22. try {
  23. File file = new File(DIR + modelName);
  24. if (!file.isFile() || !file.exists()) {
  25. return value;
  26. }
  27. byte [] buffer = new byte[10240];
  28. GZIPInputStream gis = new GZIPInputStream(new FileInputStream(file));
  29. int cnt = gis.read(buffer);
  30. gis.close();
  31. return new String(buffer, 0, cnt, "utf-8");
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. return value;
  35. }
  36. }
  37. /**
  38. * by kevin 07-03
  39. * set cloud.sv 设置数据内容
  40. * @param fileName 压缩文件名字
  41. * @param value 写入的内容
  42. */
  43. public static void setGZipModel(String fileName,String value){
  44. try {
  45. FileOutputStream fos = new FileOutputStream(DIR + fileName);
  46. GZIPOutputStream gos = new GZIPOutputStream(fos);
  47. gos.write(value.getBytes());
  48. gos.flush();
  49. gos.finish();
  50. }catch (Exception e){
  51. Log.e("qswx", "写入文件内容出错或不存在");
  52. }
  53. }
  54. /**
  55. * by kevin 06-20
  56. * 读文件的方法
  57. * @param modelName 文件名
  58. * @param value 没有这个文件或这不是文件的时候 返回的String类型信息
  59. * @return 返回的是文件中的数据信息 为String类型
  60. */
  61. public static String getModel(String modelName, String value) {
  62. try {
  63. File file = new File(DIR + modelName);
  64. if (!file.isFile() || !file.exists()) {
  65. return value;
  66. }
  67. Reader inputStreamReader = new InputStreamReader(new FileInputStream(file), "UTF-8");
  68. String str3 = new BufferedReader(inputStreamReader).readLine();
  69. inputStreamReader.close();
  70. return str3;
  71. } catch (Exception e) {
  72. e.printStackTrace();
  73. return value;
  74. }
  75. }
  76. /**
  77. * by kevin 06-20
  78. * 写入String字符串 写入到指定文件中
  79. * @param modelName 指定文件的文件名字
  80. * @param value 写入到文件的String字符串
  81. *
  82. * BufferedWriter 写入到缓存区
  83. * .flush()清空提交 不要忘记写
  84. */
  85. public static void setModel(String modelName, String value) {
  86. BufferedWriter bufferedWriter = null;
  87. try {
  88. bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(DIR + modelName), false), "UTF-8"));
  89. bufferedWriter.write(value);
  90. bufferedWriter.flush();
  91. bufferedWriter.close();
  92. } catch (Exception e3) {
  93. e3.printStackTrace();
  94. try {
  95. if(bufferedWriter != null) {
  96. bufferedWriter.close();
  97. }
  98. } catch (Exception e5) {
  99. }
  100. }
  101. }
  102. }

比普通的写入文件内容的方式,这种通过加锁解压能够更好的增加文件程序的安全性,这点我就不过多的强调安全这点了,想必大家都知道安全的重要性。过多的xposed模块源码 没人愿意分享的太多,我这也是很小的功能想必有人会失望,hook的能力多少取决于阅读代码的能力,尤其是反编译的代码,多阅读api和反编译的他人项目最好在配上源码会很有作用,有同行的话可以加我qq:1114005726 一起进步  我也是小白~




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/461400
推荐阅读
相关标签
  

闽ICP备14008679号