车机--android安全[app测试]

1. adb基础命令

adb devices                            # 查看设备的驱动是否连接
adb kill-server
adb start-server
adb shell mkdir /dev/simgle            # 创建目录
adb install d:\1.apk                # 安装软件
adb shell pm list packages             # 列出手机中的软件
adb uninstall com.skype.raider        # 卸载应用
adb forward tcp:8700 jdwp:19509     # 转发8700端口到 在线的19509端口
adb shell netcfg
adb shell ifconfig eth0                # 查看网络信息
adb shell pm path com.example.scr 		# 列出路径
adb shell pm list permission-groups 	# 列出权限
adb shell pm list permissions

2.反编译android程序
apktool作用:主要查看res文件下xml文件、AndroidManifest.xml和图片。(注意:如果直接解压.apk文件,xml文件打开全部是乱码)
dex2jar作用:将apk反编译成Java源码(classes.dex转化成jar文件)
jd-gui作用:查看APK中classes.dex转化成出的jar文件,即源码文件

apktool d test.apk /a  # 反编译android程序
dex2jar xxx.dex        # dex2jar反编译出java源代码

3.重新打包android程序

apktool b test -o test1.apk 

apksign: 开发者用于程序签名的工具,android的各类IDE也是用这个工具在签名。使用方法如下,将signapk.jar,testkey.pk8,testkey.x509.pem放在一个目录下,写一个signapk.bat文件,如下:
signapk.bat test1.apk test1signed.apk
java -jar signapk.jar testkey.x509.pem testkey.pk8 test1.apk test1signed.apk


获取其它程序的签名:

private static String getSignture(Application paramApplication) {
    try {
        String packageName = "packageName";
        List<PackageInfo> packages = paramApplication.getPackageManager().getInstalledPackages(PackageManager.GET_SIGNATURES);
        for (PackageInfo packageInfo : packages) {
            Signature[] signs = packageInfo.signatures;
            Signature sign = signs[0];
            String signString = sign.toCharsString();
            System.out.println(signString);
            return signString;
        }
    } catch (Exception e) {
        return "";
    }
    return "";
}


APK签名校验:

#!java
public class getSign {
    public static int getSignature(PackageManager pm , String packageName){
    PackageInfo pi = null;
    int sig = 0;
    Signature[]s = null;
    try{
        pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
        s = pi.signatures;
        sig = s[0].hashCode();//s[0]是签名证书的公钥,此处获取hashcode方便对比
    }catch(Exception e){
        handleException();
    }
    return sig;
    }
}
主程序代码参考:
#!java
pm = this.getPackageManager();
int s = getSign.getSignature(pm, "com.hik.getsinature");
if(s != ORIGNAL_SGIN_HASHCODE){//对比当前和预埋签名的hashcode是否一致
    System.exit(1);//不一致则强制程序退出
}

程序可被任意调试


allowBackup 风险位置:AndroidMannifest.xml 文件 android:allowBackup 属性
allowBackup 风险触发前提条件:未将 AndroidMannifest.xml 文件中的 android:allowBackup 属性值设为 false
allowBackup 风险原理:当 allowBackup 标志值为 true 时,即可通过 adb backup 和 adb restore 来备份和恢复应用程序数据

如果开启了调试模式,使用一下命令查看Dalvik虚拟机监听在模拟器的哪一个端口,在apk运行前后执行进行对比开启的端口
# adb jdwp
比较两次命令执行的结果,发现运行测试应用后多出来的端口,这就是我们测试应用对应的端口,我们需要用JDB去连接该端口
# adb forward tcp:54321 jdwp:多出来的端口
提示:JDWP就是 Java Debug Wire Protocol(Java调试线协议),如果一个应用可被调试,该应用的虚拟机会打开一个唯一端口以便JDB连接调试。Android的Dalvik虚拟机也支持该协议。
jdb -attach localhost:54321 # 连接以后可以进行远程代码注入
查看类的命令: classes
查看 MainActivity$1类中的方法: methods com.example.debug.MainActivity$1
在MainActivity$1.onClick方法中设置断点: stop in com.example.debug.MainActivity$1.onClick(android.view.View)
查看局部变量: locals
执行下一行代码: next
使用”step”命令进入”setText”方法动态修改显示的值: setup
使用”set”命令将”text”变量的值从”Try Again”改为”Hacked”: set text = "Hacked"
执行方法: run

程序数据任意备份

debug 风险位置: AndroidMannifest.xml 文件 android:debuggable 属性
debug 风险触发前提条件:未将 AndroidMannifest.xml 文件中的 android:debuggable 属性值设为 false
debug 风险原理:其debug属性为true, 允许程序可以在手机上进行调试,那么攻击者就可以在该应用的进程中注入并运行自己的代码。

蔚来app:
<application android:allowBackup="false" android:icon="@mipmap/nio_app_logo" android:label="@string/app_name" android:largeHeap="true" android:name="com.tencent.StubShell.TxAppEntry" android:supportsRtl="true" android:theme="@style/TranslucentTheme">

驾校宝典:
<application android:allowBackup="true" android:icon="@drawable/mucang__ic_launcher" android:label="@string/app_name" android:largeHeap="true" android:name="com.handsgo.jiakao.android.system.MyApplication" android:supportsRtl="true" android:theme="@style/jiakaoAppTheme">

adb backup -f allowBakup.ab -noapk com.handsgo.jiakao.android.system.MyApplication
java -jar ubpack_backup.jar unpack allowBackup.ab allowBackup.tar
tar zxvf allowBackup.tar # 如果是登陆的地方,也许能查看到密码
adb restore allowBackup.ab # 恢复之前数据,如果之前登陆了,打开应用可直接进入

tools:
https://github.com/nelenkov/android-backup-extractor

组件暴露


exported 风险位置:AndroidMannifest.xml 文件 android:exported 属性
exported 风险触发前提条件:未将 AndroidMannifest.xml 文件中的 android:exported 属性值设为 false
exported 风险原理:如果包含有intent-filter 默认值为true; 没有intent-filter默认值为false。 如果设置了导出权限也就是 true,都可能被系统或者第三方的应用程序直接调出并使用,组件导出可能导致登录界面被绕过、信息泄露、数据库SQL注入、DOS、恶意调用等风险。exported是Android中的四大组件 Activity,Service,Provider,Receiver 四大组件中都会有的一个属性。 

# 启动activity
adb shell am start -n com.zxc.criminalintent/.CrimeCameraActivity

# 启动service
adb shell am startservice -n com.android.traffic/com.android.traffic.maniservice

# 发送broadcast,比如在模拟器中发生关机的broadcast
adb shell am broadcast -a android.intent.action.ACTION_SHUTDOWN -c android.intent.category.HOME -n com.andy.androidtest/.ShutdownBroadcastReceiver


 

 

猜你喜欢

转载自blog.csdn.net/qq_39325340/article/details/81352396
今日推荐