耗电量测试
battary-histain
跨平台投屏工具 https://github.com/Genymobile/scrcpy
brew install scrcpy
屏幕尺寸
adb shell wm size
移动光标位置
adb shell input swipe 200 1400 900 500
生成随机数
echo $((1000*(RANDOM%10)/10))
模拟业务操作
while true: do
adb shell input swipe $((1000*(RANDOM%10)/10)) 1400 $((1000*(RANDOM%10)/10)) 500;
sleep 1;
adb shell input tap 949 1311;
sleep 1;
done
#模拟业务行为
for i in {1..100} ; do
echo index = $i
adb shell input swipe $((1000*(RANDOM%10)/10)) 1400 $((1000*(RANDOM%10)/10)) 500 ;
sleep 1;
adb shell input tap 949 1311;
sleep 1;
done
远程连接手机,不使用 usb 充电线。进行用电量统计。
# 连接 wifi 联网的手机
adb connect 192.168.0.100:7777
# 重置耗电量统计数据
adb shell dumpsys batterystats --reset
# 开启 耗电量唤醒记录
adb shell dumpsys batterystats --enable full-wake-history
adb shell keyevent
# 启动 app
adb shell am start -S -W -n com.mobike.mobikeapp/.SplashActivity
# 返回按钮
adb shell keyevent 4
# 收集电量信息
adb bugreport bugreport_$(date +%Y%m%d%H%M).zip
https://developer.android.com/studio/profile/battery-historian
https://developer.android.com/topic/performance/power/battery-historian
docker run -p 9999:9999 gcr.io/android-battery-historian/stable:3.0 --port 9999
adb shell dumpsys batterystats [path/]batterystats.txt
For devices running Android 7.0 and higher:
adb bugreport [path/]bugreport.zip
For devices running Android 6.0 and lower:
adb bugreport > [path/]bugreport.txt
耗电量多个文件对比 diff
客户端安全测试
OWASP
Zap
WTE
OWASP Top Ten Project
Top_Ten_Mobile_Risks
https://www.owasp.org/index.php/OWASP_Mobile_Security_Project#Top_Ten_Mobile_Risks
OWASP_Top_10_2017_中文版v1.3.pdf
https://www.owasp.org/images/d/dc/OWASP_Top_10_2017_中文版v1.3.pdf
接口安全测试
安装 ZAP(OWASP Zed Attack Proxy)
https://github.com/zaproxy/zaproxy/wiki/Downloads
安装
brew cask install owasp-zap
微信朋友圈XSS攻击
OWASP Mobile Top 2016
OWASP 官方提供的安全检查 checklist
The Mobile Security Testing Guide (MSTG)
https://github.com/owasp/owasp-mstg
OWASP 解决方案的问题
这里所有的做法都是面向安全工程师,而非测试工程师
提供的解决方案无法在有限的项目周期内完成
测试工程师安全测试体系。
一切来自于客户端的数据都不可信任
静态破解:启动前修改包内容,篡改应用api
动态破解:运行时篡改系统api,返回定制内容
Android 常见安全工具
- ApkTool
- smali https://github.com/jesusfreke/smali
- Android loadble Kernel Modules
- JEB
- Androguard
- JD-Gui
- APK Studio
- Dex2Jar
- Bytecode-Viewer
- CodeInspect
- dexdisassembler
- Fern Flower
- Fino
- Introspy-Android
服务端安全
安全问题例子
微信跳一跳,可以直接更改分数
https://gist.github.com/feix/6dd1f62a54c5efa10f1e1c24f8efc417
服务端安全分类
应用代码:Java Python PHP Ruby
应用框架:Spring Structs Django ThinkPHP Rails
应用容器:Tomcat JBoss Apache Nginx
dvwa 演练环境
安装 Damn Vulnerable Web Application (DVWA)
docker run -d --rm -it -p 8090:80 vulnerables/web-dvwa:latest
http://jenkins.testing-studio.com:10000/
用户名:admin
密码:password
SQL Injection SQL 注入
1’ or ‘’=’
Brute Force 暴力破解
CSRF
OWASP ZAP
ZAP JxBrowser
安全测试关注维度
传输
敏感信息传递加密
链路加密
接口
访问控制
参数
注入:sql注入、命令注入、文件注入
越权:越过更高权限、越过同级权限
常见安全工具
ZAP
WVS
AppScan
BurpSuite
Sqlmap
业务安全常见的checklist
业务数据传输链路分析
http 是否传输敏感信息
tcp 等协议是否可被解密
资产安全分析
api 清单收集:明确敏感信息分级,可访问性验证
api 参数收集:明确参数分类并针对分析
token 可遍历
文件上传
身份参数的有效性验证
建立安全测试流程
白盒代码分析:自动化
sonar、findbugs 等
黑盒扫描机制:自动化
wvs、burpsuite、appscan、sqlmap
业务流程安全探索:人工检测
burpsuite、zap
BurpSuite
相对开放
定制性强
黑客工具
测试工具
burpsuite 重要特性
代理工具(Proxy)
爬虫(Spider)
暴力破解(Intruder)
漏洞扫描(Scanner)
重放请求(Repeater)
附属工具(decode comparer)
扩展定制(Extender)
Burp的应用场景
服务端攻击:篡改请求
客户端攻击:篡改响应
反编译
- apktool apk反编译与打包
- jd-gui jar包源代码分析
- jadx (apktook+jd-gui)综合性
apktool
brew install apktool
apktool d keep.apk
or
java -jar apktool.jar d keep.apk
实验对象 https://www.gotokeep.com/
keep.apk
smali 指令
https://source.android.com/devices/tech/dalvik/dalvik-bytecode
参考:线上第六期_Android 安全测试_20181013
篡改 smali
java2smali
java 代码转换成 smali。
Java
Log.i("hogworts", String.valueOf(System.currentTimeMillis()))
解包
apktool d keep.apk
打包
apktool b keep
https://testerhome.com/topics/16392
apktool 编译日志
appium demo-api.apk
https://github.com/appium/appium/blob/master/sample-code/apps/ApiDemos-debug.apk
解包
apktool d ApiDemos-debug.apk
vim smali/io/appium/android/apis/ApiDemosApplication.smali
查找 onCreate
onCreate 花费时间
vim smali/io/appium/android/apis/ApiDemos.smali
.method public onCreate(Landroid/os/Bundle;)V
.locals 10
.param p1, "savedInstanceState" # Landroid/os/Bundle;
.prologue
const/4 v9, 0x2
const/4 v8, 0x1
// 此处添加代码
.line 43
invoke-super {p0, p1}, Landroid/app/ListActivity;->onCreate(Landroid/os/Bundle;)V
……
……
……
invoke-virtual {v0, v8}, Landroid/widget/ListView;->setTextFilterEnabled(Z)V
// 此处添加代码,视频 1:17:12 分有代码。
.line 56
return-void
.line 52
nop
:array_0
.array-data 4
0x1020014
0x1020015
.end array-data
.end method
打包
apktool b ApiDemos-debug -o ApiDemos-debug-new.apk
生成证书
[ -f my-release-key.jks ] || keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias myalias
apk 签名
jarsigner -verbose -keystore my-release-key.jks -signedjar ApiDemos-debug-new-signed.apk ApiDemos-debug-new.apk my-alias
针对静态破解防护
Android 动态破解
修改系统 api 和底层 api 工具软件
xposed:Android java语法
frida:全平台 javascript 语法更全能
substrcte: All
xposed 安装
xposed 的原理
需要 root 权限手机
替换 app_process
增加 XposedBridge.jar 的加载
创建 xposed 模块(演示)
创建普通的 Android 项目
设置 meta-data
编写 xposed 的 hook 代码
添加 assets/xposed_init
编译并安装
使用 xposed 启动 mods
xposed https://github.com/rovo89/XposedBridge/wiki/Development-tutorial
源码编译 xposedInstall
需要 ndk
git clone https://github.com/rovo89/XposedInstaller.git
cd XposedInstaller
./gradlew tasks
# ./gradlew assembleRelease
# apk 位置 app/build/outputs/apk/release/
安装 xposed.apk 到真机
签名
jarsigner -verbose -keystore my-release-key.jks -signedjar xposed.apk xposed-new.apk my-alias
新建 xposed 项目
新建 Android Studio 项目
AndroidManifest.xml
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="Easy example which makes the status bar clock red and adds a smiley" />
<meta-data
android:name="xposedminversion"
android:value="53" />
</application>
新建类
package de.robv.android.xposed.mods.tutorial;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
public class Tutorial implements IXposedHookLoadPackage {
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
XposedBridge.log("Loaded app: " + lpparam.packageName);
}
}
assets/xposed_init
写的是上面的类名
de.robv.android.xposed.mods.tutorial.Tutorial.
更改时钟区域显示内容颜色
package de.robv.android.xposed.mods.tutorial;
import android.graphics.Color;
import android.widget.TextView;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class XposedDemo implements IXposedHookLoadPackage {
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (!lpparam.packageName.equals("com.android.systemui"))
return;
findAndHookMethod("com.android.systemui.statusbar.policy.Clock",
lpparam.classLoader, "updateClock", new XC_MethodHook() {
@Override
protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
TextView tv = (TextView) param.thisObject;
String text = tv.getText().toString();
tv.setText(text + " :) hello from hogwarts");
tv.setTextColor(Color.RED);
}
});
}
}
编译 apk
./gradlew assembleRelease
使用签名工具给apk签名
jarsigner -verbose -keystore my-release-key.jks -signedjar app.apk app-unsigned.apk my-alias