我的 Android 应用程序如何扫描自己的内存映射以查找已知的不良关键字,例如“Xposed”或“Frida”?

问题描述 投票:0回答:1

我正在工作中开发的一个应用程序最近经过了笔测试。报告中提到的风险之一是它没有适当的 Hook 检测。我已经实现了 RootBeer 库,但这很容易避免。

测试人员为Android应用程序创建了Frida脚本,用于在运行时修改根检测逻辑。该脚本挂钩到 System.exit 方法以返回 false 而不是 true。这可以防止应用程序在检测到设备已获得 root 权限后退出。

渗透测试人员建议我们实施尽可能多的不同检查,以阻止逆向工程师。

其中一项检查是让 Android 应用程序扫描其自己的内存映射文件(位于

/proc/<pid>/maps

哪里

<pid>

是应用程序的进程 ID (PID)。

我检查了Android文档,只能找到有关处理内存的信息,但没有找到有关扫描内存的信息。例如。 https://developer.android.com/topic/performance/memory

我看到你可以“获取设备当前内存状态的 MemoryInfo 对象”。但这仅显示系统上的可用内存。

有没有人能解决这个问题?

android memory detection xposed frida
1个回答
0
投票

存在许多用于检测逆向工程工具(例如 Frida 和 Xposed)的技术。根据 OWASP 的 Android 反逆向防御指南,最有效的方法是“扫描进程内存以查找已知工件”。逆向工程工具检测的详细信息和其他方法可以在OWASP-mastg中找到。

简要概述

由于 Android 操作系统基于 Linux 内核,因此您可以在根目录中找到 /proc。它包含所有运行时系统信息,包括系统内存信息。 /proc 基本上是一个虚拟文件系统,这是一个 UNIX 术语。有关 /proc 的更多信息可以在here找到。

通过使用任何终端应用程序或使用 adb shell 打开终端,您将能够使用以下命令列出所有进程

 ls /proc

在里面您可以进一步访问我导航到的任何正在运行的进程的信息

ls /proc/{Process-Id}

根据here找到的Linux内核实现,我们可以通过读取里面的内容来访问当前正在运行的进程

/过程/自我

可以在下面找到当前运行进程的可执行文件和库文件的内存映射。

/proc/self/地图

通过查看内存映射,可以跟踪文件类型为 .so 和 .jar 的 Xposed 和 Frida 库,从而检查签名。 /proc/self/maps 的输出可以通过 adb shell 或某些终端应用程序使用 Android 终端查看和检查。

cat /proc/self/maps

科特林

这是我用 kotlin 编写的方法,如果在 Android 应用程序内存中找到 Xposed 或 Frida,该方法将返回 true。

 private fun detectHooking(): Boolean{
  val libraries: MutableSet<String> = mutableSetOf("")
  var mapsFilename : String
  mapsFilename= "/proc/" + Process.myPid() + "/maps"
  val file = File(mapsFilename)
  var n : Int
  var lineSubstring: String

try {
  file.bufferedReader().forEachLine {
    if(it != null){
      if ((it.endsWith(".so") || it.endsWith(".jar"))) {
        n = it.lastIndexOf(" ")
        lineSubstring = it.substring(n + 1)
        libraries.add(lineSubstring)
      }
    }

  }
  for (library in libraries) {
    if (library.contains("XposedBridge.jar")) {
      Log.wtf("HookDetection", "Xposed JAR found: $library")
      return true
    }
    if (library.contains("frida") || library.contains("LIBFRIDA")) {
      Log.wtf("Frida Detection: ", "Frida Artifact Found : $library")
      return true
    }
  }

} catch (e: Exception) {
  return false
}
return false    
}

请注意,检测开源工具的技术会随着时间的推移而过时。经验丰富的逆向工程师可以绕过大多数检测方法,但是当这些检测方法结合起来时,它只会变得更困难,而不是不可能。

祝你好运:)

© www.soinside.com 2019 - 2024. All rights reserved.