以下实验环境是在 Ubuntu 下,使用 eclipse kepler, java 1.7

多版本java管理

注意!soot不支持java 1.8版本,请在eclipse 中设置JRE是1.7的版本。

使用如下方法安装java

java的默认路径为 /usr/lib/jvm

安装命令

1

2

3

4$ sudoadd-apt-repositoryppa:webupd8team/java

$ sudo apt-get update

$ sudo apt-get install oracle-java8-installer

$ sudo apt-get install oracle-java7-installer

临时切换java版本

1

2sudo update-java-alternatives -s java-8-oracle

sudo update-java-alternatives -s java-7-oracle

eclipse soot 插件安装

注意!soot的eclipse plugin 不支持 kepler 以上的版本。

所以需要安装 eclipse kepler 的版本。

注意!soot不支持java 1.8版本,请在eclipse 中设置JRE是1.7的版本。

在 Window -> preference -> Java -> Installed JREs 修改。

进入

Help -> Install New Software -> add

然后一路next即可。

之后对 .class,或.java 文件按右键即可出现soot的选项。按提示步骤操作即可。

建立soot项目

File -> New -> Example -> A simple BodyTransformer

可以修改 SOOTCLASSES 路径

Project -> Properties -> Java Build Path:Library

Android class 文件的产生

首先将 apk 文件进行 unzip ,然后对 classes.dex 文件进行dex2jar,之后再次unzip产生的jar文件后即可生成 MainActivity.class 等文件

1

2

3unzip crackme.apk -d ~/crackme

./d2j-dex2jar.sh classes.dex

unzip classes-dex2jar.jar -d ~/crackme-jar

soot 的基本使用方法

本示例是将一个 Android 的 class 文件转换成 Jimple 的 IR 表示方式

–keep-line-number 保持行数不变

–xml-attributes 对生成的jimple文件进行着色

–f J 输出类型时 Jimple

–cp usr/lib/jvm/java-7-oracle/jre/lib/ext/zipfs.jar:…. soot的class-path

–d 输出路径

1java -cp soot-2.5.0.jar soot.Main --keep-line-number --xml-attributes --f J --cp /usr/lib/jvm/java-7-oracle/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-7-oracle/jre/lib/rt.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-7-oracle/jre/lib/resources.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-7-oracle/jre/lib/jfr.jar:/home/gary/workspace-kepler/Test/bin/:/usr/lib/jvm/java-7-oracle/jre/lib/jsse.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-7-oracle/jre/lib/jce.jar:/usr/lib/jvm/java-7-oracle/jre/lib/charsets.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/dnsns.jar:/home/gary/workspace-kepler/Test/src/:/home/gary/Android/Sdk/platforms/android-24/android.jar:/Test/src::null --d /home/gary/workspace-kepler/Test/sootOutput com.droider.crackme0201.MainActivity

利用 CFGViewer 生成程序控制流图

以下是以soot作为命令行工具的使用方法。

生成 dot 文件

首先使用 CFGViewer 生成 dot 文件

–graph=BriefUnitGraph 生成图的类型

–ir=jimple 使用jimple作为中间语言

–soot-class-path soot的classpath

1java -cp soot-2.5.0.jar soot.tools.CFGViewer --graph=BriefUnitGraph --ir=jimple --soot-class-path /usr/lib/jvm/java-7-oracle/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-7-oracle/jre/lib/rt.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-7-oracle/jre/lib/resources.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-7-oracle/jre/lib/jfr.jar:/home/gary/workspace-kepler/Test/bin/:/usr/lib/jvm/java-7-oracle/jre/lib/jsse.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-7-oracle/jre/lib/jce.jar:/usr/lib/jvm/java-7-oracle/jre/lib/charsets.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/dnsns.jar:/home/gary/workspace-kepler/Test/src/:/home/gary/dev/android-platforms/android-17/android.jar:/home/gary/dev/android-platforms/android-17/android-17-api.jar:/Test/src::null --d /home/gary/workspace-kepler/Test/sootOutput com.droider.crackme0201.MainActivity

使用 graphviz 将dot文件转化为png1

2sudo apt-get install graphviz

dot -Tpng android.widget.Button(com.droider.crackme0201.MainActivity\).dot > output.png

之后可以用以下脚本处理,一个是替换生成的文件名,去除一些特殊字符,另一个是批量生成png图片。

发现shell的交互模式、以及不同的shell,可能造成脚本运行失败,建议用bash执行脚本。

bash script_name.sh,如果用 ./script_name.sh 可能会执行失败。

replace_spaces.sh

1

2

3

4

5

6

7

8

9#/bin/bash

find . -type f -name "*.dot" -print |

while read name; do

# echo $name

na=$(echo $name | tr '[' '_' | tr ']' '_' | tr ' ' '_' | tr '\' '_' | tr '\$' '_')

if [[ $name != $na ]]; then

mv "$name" $na

fi

done

generate_png.sh

1

2

3

4

5

6

7

8#/bin/bash

dotfile=` find . -name '*.dot' -type f`

for fdot in $dotfile

do

dotfname=`basename -s .dot $fdot`

# echo $dotfname.png

dot -Tpng $fdot >$dotfname.png

done

出错处理

报错记录1

解决方法 -soot-class-path 中加入 android-17-api.jar

android-17-api.jar 下载地址

https://github.com/Sable/android-platforms

直接下载 Android sdk 在里面也是能找到的。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45➜ soot-runable java -cp soot-2.5.0.jar soot.tools.CFGViewer --graph=BriefUnitGraph --ir=jimple --soot-class-path /usr/lib/jvm/java-7-oracle/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-7-oracle/jre/lib/rt.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-7-oracle/jre/lib/resources.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-7-oracle/jre/lib/jfr.jar:/home/gary/workspace-kepler/Test/bin/:/usr/lib/jvm/java-7-oracle/jre/lib/jsse.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-7-oracle/jre/lib/jce.jar:/usr/lib/jvm/java-7-oracle/jre/lib/charsets.jar:/usr/lib/jvm/java-7-oracle/jre/lib/ext/dnsns.jar:/home/gary/workspace-kepler/Test/src/:/home/gary/Android/Sdk/platforms/android-24/android.jar:/Test/src::null --d /home/gary/workspace-kepler/Test/sootOutput com.droider.crackme0201.MainActivity

Soot started on Thu Aug 04 18:56:04 CST 2016

Transforming com.droider.crackme0201.MainActivity...

Generate dot file in /home/gary/workspace-kepler/Test/sootOutput/void ().dot

Generate dot file in /home/gary/workspace-kepler/Test/sootOutput/void (java.lang.Object[],com.android.tools.fd.runtime.InstantReloadException).dot

Generate dot file in /home/gary/workspace-kepler/Test/sootOutput/android.widget.EditText access$000(com.droider.crackme0201.MainActivity).dot

Generate dot file in /home/gary/workspace-kepler/Test/sootOutput/android.widget.EditText access$100(com.droider.crackme0201.MainActivity).dot

Generate dot file in /home/gary/workspace-kepler/Test/sootOutput/boolean access$200(com.droider.crackme0201.MainActivity,java.lang.String,java.lang.String).dot

Generate dot file in /home/gary/workspace-kepler/Test/sootOutput/android.widget.Button access$300(com.droider.crackme0201.MainActivity).dot

Exception in thread "main" soot.SootMethodRefImpl$ClassResolutionFailedException: Class android.app.Activity doesn't have method setPersistent([boolean]) : void; failed to resolve in superclasses and interfacesLooking in android.app.Activity which has methods

[

()>,

,

, ,

......

,

,

]

at soot.SootMethodRefImpl.resolve(SootMethodRefImpl.java:183)

at soot.SootMethodRefImpl.resolve(SootMethodRefImpl.java:109)

at soot.BriefUnitPrinter.methodRef(BriefUnitPrinter.java:43)

at soot.jimple.internal.AbstractSpecialInvokeExpr.toString(AbstractSpecialInvokeExpr.java:99)

at soot.AbstractValueBox.toString(AbstractValueBox.java:52)

at soot.jimple.internal.JInvokeStmt.toString(JInvokeStmt.java:71)

at soot.util.cfgcmd.CFGToDotGraph.formatNodeText(CFGToDotGraph.java:502)

at soot.util.cfgcmd.CFGToDotGraph.drawCFG(CFGToDotGraph.java:316)

at soot.util.cfgcmd.CFGGraphType$1.drawGraph(CFGGraphType.java:128)

at soot.tools.CFGViewer.print_cfg(CFGViewer.java:247)

at soot.tools.CFGViewer.internalTransform(CFGViewer.java:76)

at soot.BodyTransformer.transform(BodyTransformer.java:51)

at soot.Transform.apply(Transform.java:104)

at soot.BodyPack.internalApply(BodyPack.java:49)

at soot.Pack.apply(Pack.java:124)

at soot.PackManager.runBodyPacks(PackManager.java:775)

at soot.PackManager.runBodyPacks(PackManager.java:463)

at soot.PackManager.runBodyPacks(PackManager.java:380)

at soot.PackManager.runPacks(PackManager.java:357)

at soot.Main.run(Main.java:198)

at soot.Main.main(Main.java:141)

at soot.tools.CFGViewer.main(CFGViewer.java:101)

参考资料

android+生成控制,用 soot 生成安卓App的控制流 Day 1相关推荐

  1. Android Studio 运行HyperLPR开源项目安卓APP

    Android Studio 运行HyperLPR开源项目安卓APP 前提:已安装Android Studio 作为一个安卓小白,我学uni-app只是机缘巧合,只是想看看微信小程序怎么开发的,然后一 ...

  2. android 快传 源码_安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端...

    适用范围:安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端 演示地址:(以截图为准) 运行环境:Android+PC+web 其他说明: 本项目是一个基于安卓的类似茄子 ...

  3. win10兼容android下载安装,Win10手机运行安卓App兼容工具下载!

    [PConline 资讯]不久前有人从泄漏的Windows 10手机版build 10240中,解包出了微软内置的可以让Windows 10手机版兼容安卓App的模块,详情可以点此查看.不过,Wind ...

  4. android能播放4k视频格式,安卓APP,无广告支持多种格式的万能视频播放器

    原标题:安卓APP,无广告支持多种格式的万能视频播放器 万能视频播放器 万能视频播放器是一款专业的视频播放工具.它支持所有视频格式,支持 4K/超高清视频文件,并且能够高清播放.它是安卓手机和平板上欣 ...

  5. android icon 圆角半径,iOS和安卓APP启动图标的尺寸和圆角值详解

    今天在APP设计交流群里,又有不少的初学的APP设计小伙伴都在问ios端和安卓端的启动图标尺寸大小和圆角半径大小. 第一部分:我们先来看看iOS端的图标的尺寸和圆角大小详解 A.iOS6和之前版本,应 ...

  6. 搭建Android开发环境 以及 ionic 编译安卓app步骤

    1. 下载安装JDK 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...

  7. android 按钮控制线程,关于手机安卓-线程测试

    如题,我测试时,只执行了一次,第二次卡住时间到后,没有调用超时判断,特请教一下,代码如下: '/**********线程控制******* Dim 检测线程 Thread.SetShareVar &q ...

  8. Android如何控制iPhone,王者荣耀安卓转苹果怎么操作 安卓转苹果操作方法

    王者荣耀怎么安卓转苹果?通过一下方法王者荣耀安卓和苹果的数据就可以互通了,不仅数据互通还可以将安卓中的角色转到苹果系统,对很多玩家来讲简直不要太惊喜,下面就随小编一起来看一下关于安卓转苹果的操作方法介 ...

  9. Android按back后执行过程,安卓app测试获取接口返回数据,然后处理数据,放在一个button点击事件里面 执行顺序有问题?无法获取数据?...

    private JSONArray jsonArray; btn1.setOnClickListener(new View.OnClickListener() { @Override public v ...

最新文章

  1. Myeclipse+mysql出现中文乱码情况
  2. 枚举详解之EnumSet、EnumMap用法
  3. Linux系列:Ubuntu/fedora实用小技巧—禁止自动锁屏、设置免密码自动登录、免密码执行sudo操作...
  4. qpython怎么添加pip_Q: 在Windows上安装Python 2.7的pyHook和pip
  5. DropDownList选中值,不存在的时候不出错的写法
  6. 2017-05-12-Linux文件操作
  7. Spring查找方法示例
  8. PHP与Spring的强势接口设计_微课介绍
  9. Struts2_HelloWorld_3
  10. 怎么查自己电脑服务器信息吗,怎么查看自己云服务器信息吗
  11. Android实现计算器布局(线性布局)
  12. ZFS的ashift参数解读
  13. 音视频篇 - Android 音视频涉及到的技术
  14. 网页屏蔽右键,另存功能
  15. 【编译原理】第8讲 语法制导翻译(习题答案)——MOOC哈尔滨工业大学陈鄞
  16. google chrome F11全屏快捷键
  17. 命令行配置电脑IP(Windows下设置、增加、删除)
  18. Element UI table 修改定位
  19. 使用Golang开发手游服务器的感想
  20. R12_专题知识总结提炼-AP模块

热门文章

  1. 百度Deep Voice 1 2 3阅读笔记
  2. ssh卡在debug1: SSH2_MSG_KEXINIT sent解决方法
  3. 留学留学条件forum.php,【俄罗斯留学条件】2021去俄罗斯留学条件
  4. oracle安装问题--测试未成功的问题
  5. OSCache 缓存重建在 Race Condition 下的 NRE 问题
  6. 2018暑期在校培训总结
  7. 简单理解条件随机场CRF
  8. 检信ALLEMOTION非接触式心理情绪测评系统
  9. 如何实现外网 RDP 远控(frp)
  10. 2016年02月29日