【Android安全】Soot 静态分析教程

参考教程

https://github.com/noidsirius/SootTutorial

1. Windows Soot 环境配置

下载代码

git 拷贝仓库

git init
git clone https://github.com/noidsirius/SootTutorial.git
./gradlew.bat build

报错:Unsupported class file major version 57

./gradlew.bat build时,报错如下:

* What went wrong:
Could not compile settings file 'E:\AcademicWorkplace\Soot\Soot1\SootTutorial\settings.gradle'.
> startup failed:
  General error during semantic analysis: Unsupported class file major version 57

原因:
这是因为Gradle 5 is incompatible with Java 13

需要:
或者update Gradle (the wrapped version in your project) to Gradle 6 or later
或者use a lower version of the JRE

解决方法:
需要进入\SootTutorial\gradle\wrapper
修改gradle-wrapper.properties
改为:distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip

参考:https://stackoverflow.com/a/63548566

报错:\Library\Android\sdk\platforms does not exist!

./gradlew.bat build时,报错如下:
例如

dev.navids.soottutorial.android.CGPTATest > testPointsToAnalysis FAILED
    soot.AndroidPlatformException: Android platform directory 'C:\Users\juruo\Library\Android\sdk\platforms' does not exist!

原因:
Soot代码中使用了Android-SDK,但是系统环境变量中没有"ANDROID_HOME"
例如AndroidCallgraph.java中:
在这里插入图片描述
解决方法:
添加系统环境变量:
在这里插入图片描述

build成功

./gradlew.bat build

在这里插入图片描述

2. Linux Soot 环境配置

build报错:-bash: ./gradlew: Permission denied

$ ./gradlew build
-bash: ./gradlew: Permission denied

解决:

chmod +x gradlew

3. 生成Android app的call graph

命令格式:

./gradlew.bat run --args="AndroidCallGraph <CG_Algorithm> (draw)"

例如:

./gradlew.bat run --args="AndroidCallGraph SPARK draw"

首先会进入Main.java
位于\SootTutorial\src\main\java\dev\navids\soottutorial\Main.java
会根据"AndroidCallGraph"调用到AndroidCallgraph.main方法。
AndroidCallgraph.main方法的参数为--args中除了"AndroidCallGraph"以外的其余部分。
在这里插入图片描述
AndroidCallgraph.main方法在AndroidCallgraph.java

在这里插入图片描述

Example APK在/SootTutorial/demo/Android/st_demo.apk
结果:
在这里插入图片描述
每次修改代码后,要重新运行一次./gradlew.bat build

添加功能

创建
\SootTutorial\src\main\java\dev\navids\soottutorial\android\AndroidReachMethod.java
在这里插入图片描述
写AndroidReachMethod.main方法:

// ./gradlew.bat run --args="AndroidReachMethod <CG_Algorithm> <apkPath> <apkMainActivityName> <targetMethodCls> <targetMethodRet> <targetMethodName>"

在这里插入图片描述
此处省略具体代码

改Main.java:

在这里插入图片描述
在这里插入图片描述
测试

./gradlew.bat build
./gradlew.bat run --args="AndroidReachMethod SPARK E:\AcademicWorkplace\DeviceIntegrity\LargeScalScan\testCase\st_demo.apk dev.navids.multicomp1.MainActivity dev.navids.multicomp1.ClassParent void unreachableMethod()"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Soot 进行静态分析找出代码中的空指针,可以按照以下步骤进行: 1. 使用 Soot 的解析器解析目标类文件。您可以使用以下代码来解析一个类文件: ``` String className = "com.example.MyClass"; SootClass sootClass = Scene.v().loadClassAndSupport(className); ``` 这将加载类“com.example.MyClass”并构建其 SootClass 对象。 2. 将 SootClass 对象转换为 SootMethod 对象。您可以使用以下代码获取类的所有方法: ``` List<SootMethod> methods = sootClass.getMethods(); ``` 您可以遍历该列表并对每个方法执行以下步骤。 3. 使用 Soot 的 BodyTransformer 类来获取方法体。例如: ``` BodyTransformer bodyTransformer = new BodyTransformer() { protected void internalTransform(Body body, String phaseName, Map options) { // 代码分析逻辑 } }; ``` 您可以覆盖 internalTransform() 方法并在其中编写代码分析逻辑。这个方法将被 Soot 自动调用,并传递 Body 对象。 4. 在 internalTransform() 方法中,使用 Soot 的 Jimple 语言分析方法体。例如: ``` UnitPatchingChain units = body.getUnits(); Iterator<Unit> unitIt = units.snapshotIterator(); while (unitIt.hasNext()) { Stmt stmt = (Stmt) unitIt.next(); // 代码分析逻辑 } ``` 这将获取方法体中的所有语句,并将其转换为 Jimple 语言中的 Stmt 对象。您可以遍历这些语句,查找可能导致空指针的代码逻辑。 5. 编写代码分析逻辑。您可以使用 Soot 的 API 检测代码中的空指针。例如,以下代码将检查一个引用是否为空: ``` Value ref = ...; if (ref instanceof Local || ref instanceof FieldRef || ref instanceof ArrayRef) { if (RefType.typeOf(ref).getClassName().equals("java.lang.Object")) { // 检测到可能的空指针异常 } } ``` 您可以在代码中使用类似的逻辑来检测其他类型的空指针异常。 以上是使用 Soot 进行静态分析找出代码中的空指针的基本步骤。由于每个应用程序都有不同的结构和逻辑,因此您可能需要根据自己的情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值