移动专项测试之 App 反编译分析学习总结_20190316

耗电量测试

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

http://www.owasp.org.cn/

Zap

https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project

WTE

https://www.owasp.org/index.php/OWASP_Web_Testing_Environment_Project

OWASP Top Ten Project

https://www.owasp.org/index.php/Category: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)

安装

brew cask install owasp-zap

微信朋友圈XSS攻击

OWASP Mobile Top 2016

OWASP 官方提供的安全检查 checklist

The Mobile Security Testing Guide (MSTG)

https://github.com/OWASP/owasp-mstg/blob/master/Checklists/Mobile_App_Security_Checklist-English_1.1.xlsx

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/

http://localhost:8090/

用户名: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

https://ibotpeaches.github.io/Apktool/

下载安装 https://ibotpeaches.github.io/Apktool/install/

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

参考北京第三期_安全测试基础_20181111

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
关闭