android+生成控制,用 soot 生成安卓App的控制流 Day 1
以下实验环境是在 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相关推荐
- Android Studio 运行HyperLPR开源项目安卓APP
Android Studio 运行HyperLPR开源项目安卓APP 前提:已安装Android Studio 作为一个安卓小白,我学uni-app只是机缘巧合,只是想看看微信小程序怎么开发的,然后一 ...
- android 快传 源码_安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端...
适用范围:安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端 演示地址:(以截图为准) 运行环境:Android+PC+web 其他说明: 本项目是一个基于安卓的类似茄子 ...
- win10兼容android下载安装,Win10手机运行安卓App兼容工具下载!
[PConline 资讯]不久前有人从泄漏的Windows 10手机版build 10240中,解包出了微软内置的可以让Windows 10手机版兼容安卓App的模块,详情可以点此查看.不过,Wind ...
- android能播放4k视频格式,安卓APP,无广告支持多种格式的万能视频播放器
原标题:安卓APP,无广告支持多种格式的万能视频播放器 万能视频播放器 万能视频播放器是一款专业的视频播放工具.它支持所有视频格式,支持 4K/超高清视频文件,并且能够高清播放.它是安卓手机和平板上欣 ...
- android icon 圆角半径,iOS和安卓APP启动图标的尺寸和圆角值详解
今天在APP设计交流群里,又有不少的初学的APP设计小伙伴都在问ios端和安卓端的启动图标尺寸大小和圆角半径大小. 第一部分:我们先来看看iOS端的图标的尺寸和圆角大小详解 A.iOS6和之前版本,应 ...
- 搭建Android开发环境 以及 ionic 编译安卓app步骤
1. 下载安装JDK 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...
- android 按钮控制线程,关于手机安卓-线程测试
如题,我测试时,只执行了一次,第二次卡住时间到后,没有调用超时判断,特请教一下,代码如下: '/**********线程控制******* Dim 检测线程 Thread.SetShareVar &q ...
- Android如何控制iPhone,王者荣耀安卓转苹果怎么操作 安卓转苹果操作方法
王者荣耀怎么安卓转苹果?通过一下方法王者荣耀安卓和苹果的数据就可以互通了,不仅数据互通还可以将安卓中的角色转到苹果系统,对很多玩家来讲简直不要太惊喜,下面就随小编一起来看一下关于安卓转苹果的操作方法介 ...
- Android按back后执行过程,安卓app测试获取接口返回数据,然后处理数据,放在一个button点击事件里面 执行顺序有问题?无法获取数据?...
private JSONArray jsonArray; btn1.setOnClickListener(new View.OnClickListener() { @Override public v ...
最新文章
- Myeclipse+mysql出现中文乱码情况
- 枚举详解之EnumSet、EnumMap用法
- Linux系列:Ubuntu/fedora实用小技巧—禁止自动锁屏、设置免密码自动登录、免密码执行sudo操作...
- qpython怎么添加pip_Q: 在Windows上安装Python 2.7的pyHook和pip
- DropDownList选中值,不存在的时候不出错的写法
- 2017-05-12-Linux文件操作
- Spring查找方法示例
- PHP与Spring的强势接口设计_微课介绍
- Struts2_HelloWorld_3
- 怎么查自己电脑服务器信息吗,怎么查看自己云服务器信息吗
- Android实现计算器布局(线性布局)
- ZFS的ashift参数解读
- 音视频篇 - Android 音视频涉及到的技术
- 网页屏蔽右键,另存功能
- 【编译原理】第8讲 语法制导翻译(习题答案)——MOOC哈尔滨工业大学陈鄞
- google chrome F11全屏快捷键
- 命令行配置电脑IP(Windows下设置、增加、删除)
- Element UI table 修改定位
- 使用Golang开发手游服务器的感想
- R12_专题知识总结提炼-AP模块