批量检查APK是否具有指定的权限。

为测试组的妹子提供的。

效果如下:

目录结构如下:

源代码思路:

1、将apk文件变为zip文件。这里是修改后缀

2、解压文件到指定目录。可以只解压其中mainfest.xml文件

3、移动xml文件到反编译的工具目录下。运行Bat将二进制xml转为txt文本

4、读取配置文件,比对字符串,得出你想要的结果。

具体代码,请去下载工程吧。

部分代码:

package com.wuwenfu;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

public class FileUtils {

    // 修改apk为zip
    /**
     * @author Administrator
     * @param apk文件路径
     *            c:\\1.apk
     * @param zip文件保存的路径
     *            如c:\\1
     * @param b
     *            源文件是否删除。false表示不删除 true 表示删除
     * @return 返回zip文件的路径
     *
     */
    public static String apkToZip(String apkPath, String zipPath, Boolean b) {
        // TODO Auto-generated method stub
        File apk = new File(apkPath);

        // 获取apk文件的名字。去掉后缀。作为zip文件名
        String apkName = apk.getName();
        int p = apkName.indexOf(".apk");
        String zipName = apkName.substring(0, p) + ".zip";

        File zip = new File(zipPath + File.separatorChar + zipName);

        // 检查文件是否存在、存在则删除
        if (zip.exists()) {
            zip.delete();
        }

        if (b) {
            // 重命名
            apk.renameTo(zip);
        } else {
            // 读取文件 到另一个文件
            FileInputStream fis = null;
            FileOutputStream fos = null;

            try {
                fis = new FileInputStream(apk);
                fos = new FileOutputStream(zip);
                int c = 0;
                byte[] bys = new byte[1024];

                while ((c = fis.read(bys)) != -1) {
                    // fos.write(bys);
                    fos.write(bys, 0, c);
                    fos.flush();
                }

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                try {
                    fos.close();
                    fis.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }

        return zip.getAbsolutePath();

    }

    /**
     * @description 移动文件到指定路径.是剪切操作
     * @param 源文件的路径
     *            c:\\1.txt
     * @param 指定的目录
     *            c:\\1
     */
    public static void moveTo(String from, String to) {
        // TODO Auto-generated method stub
        File fromF = new File(from);
        String toName = to + File.separatorChar + fromF.getName();
        File toF = new File(toName);
        fromF.renameTo(toF);

    }

    public static void log(String logPath, String logstr) {
        File f = new File(logPath);
        FileOutputStream fos = null;

        try {
            fos = new FileOutputStream(f, true);
            try {
                fos.write(logstr.getBytes());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                fos.flush();
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    /**
     * @param mainfest文件的路径
     * @return String[2]。第一个参数表示 有多少权限。第二个参数则是权限的字符串.第三个参数。是否具有配置文件中的3个权限
     */
    public static String[] readPermission(String mainfesttxtPath) {

        // 读取配置文件的参数
        InputStream in;
        String pr1 ="";
        String pr2 ="";
        String pr3 ="";

        try {
            in = new BufferedInputStream(new FileInputStream("e:\\test\\per.properties"));

            Properties pr = new Properties();

            pr.load(in);

            pr1 = pr.getProperty("pr1").toLowerCase();
            pr2 = pr.getProperty("pr2").toLowerCase();
            pr3 = pr.getProperty("pr3").toLowerCase();
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        String[] returnArray = new String[3];
        File f = new File(mainfesttxtPath);

        FileInputStream fis = null;
        StringBuffer sb = new StringBuffer();

        try {
            fis = new FileInputStream(f);

            int c = 0;
            byte[] bys = new byte[1024];

            try {
                while ((c = fis.read(bys)) != -1) {
                    // fos.write(bys);
                    sb.append(new String(bys, 0, c));
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                fis.close();

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        String temp = sb.toString().toLowerCase();

        // 判断有多少权限
        int count = 0;

        // 获得最后一次出现的位置
        String findStr = "<uses-permission";

        int p = temp.indexOf(findStr);
        while (-1 != p) {
            count++;
            // System.out.println("第"+count+"权限");
            p = temp.indexOf("<uses-permission", p + findStr.length());
        }

        returnArray[0] = count + "";

        // 截取权限的字符串
        // 找到第一次的位置。
        // 找到最后一次的位置。
        // 截取字符串即可
        int p1 = temp.indexOf("<uses-permission");
        int p2 = temp.lastIndexOf("</uses-permission>");

        String perStr = temp.substring(p1, p2);

        returnArray[1] = perStr + "</uses-permission>";

        //判断是否具备制定的3个权限。这里全部转换为小写字母进行比对
        String configPerStr = "";
        if(temp.indexOf(pr1) > 0){
            configPerStr +="[具备"+pr1+"权限]";
        }
        if(temp.indexOf(pr2) > 0){
            configPerStr +="[具备"+pr2+"权限]";
        }
        if(temp.indexOf(pr3) > 0){
            configPerStr +="[具备"+pr3+"权限]";
        }

        returnArray[2] = configPerStr;

        return returnArray;

    }

    /**
     * 获得目录下的文件。这里只获取一级。不递归。
     *
     * @param 目录的路径
     * @return 目录下文件的数组.
     */
    public static File[] getDirFile(String dirPath) {
        // TODO Auto-generated method stub
        File f = new File(dirPath);

        File[] fs = null;

        if (f.isDirectory()) {

            fs = f.listFiles();
        }

        return fs;

    }

    /**
     * apk文件。获取权限数据方法。
     */
    public static void apkPer(File af) {

        // String apk = "e:\\test\\TTXL-FengWang-release-1504271406.apk";
        String apk = af.getAbsolutePath();
        // String apk ="e:\\test\\AndroidManifest.apk";
        String zipTargetPath = "e:\\test\\zips";
        String logPath = "e:\\test\\log.txt";

        String resultPath = "e:\\test\\result.txt";

        //当前的时间
        Date d = new Date();
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        FileUtils.log(logPath,
                "\r\n\r\n\r\n--------------------" + af.getName()
                        + "开始--------"+format.format(d)+"-----------------");

        // 将apk文件变成zip文件
        String zipPath = FileUtils.apkToZip(apk, zipTargetPath, false);

        FileUtils.log(logPath, "\r\n--->>获得zip文件");

        // 取得zip文件路径
        // System.out.println(zipPath);

        // 解压zip文件。

        try {
            FirstZip.unzip(zipPath, "e:\\test\\unzips");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 解压需要时间。这里需要等待
        try {
            Thread.sleep(1000 * 3);
        } catch (InterruptedException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }

        FileUtils.log(logPath, "\r\n--->>完成解压");

        // 移动main.xml文件到指定目录下。执行bat
        FileUtils.moveTo("e:\\test\\unzips\\AndroidManifest.xml",
                "e:\\test\\apktools");

        FileUtils.log(logPath, "\r\n--->>移动完成");

        // 执行cmd命令.
        String cmd = "cmd /c start e:\\test\\apktools\\AXMLPrinter.bat";
        Runtime rt = Runtime.getRuntime();

        try {
            Process p = rt.exec(cmd);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        FileUtils.log(logPath, "\r\n--->>运行bat");

        try {
            Thread.sleep(1000 * 5);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 解析mainfest.txt文件。
        // 这里读取txt文件。取出里面的权限字符串。
        // 这里可以转成xml。读取里面的节点
        // 权限字符串。以<uses-permission 与</uses-permission>之间。
        String mainfestPath = "e:\\test\\apktools\\AndroidManifest.txt";
        String[] perArray = FileUtils.readPermission(mainfestPath);

        // 组合下字符串。
        String result = "\r\n---------" + af.getName()
                + "---------------------";
        result += "\r\n拥有的权限数量为" + perArray[0];
//        result += "\r\n具体权限为" + perArray[1];
        result +="\r\n制定的权限是否具备:"+perArray[2];

        result += "\r\n------------------------------";

        FileUtils.log(resultPath, result);

        FileUtils.log(logPath, "\r\n--->>处理权限");

        FileUtils.log(logPath, "\r\n-------------------" + af.getName()
                + "结束-------------------------");

        // System.out.println(perArray[0]);
        // System.out.println("-------------------------");
        // System.out.println(perArray[1]);

    }

}

最后补充。这里的解压缩包,使用了apache的ant.jar。自己去下载下吧。博客园没附件功能。。。。

工程下载地址:http://download.csdn.net/detail/douniwan123654/8645939

时间: 2024-11-02 21:18:44

批量检查APK是否具有指定的权限。的相关文章

php批量检查域名是否已注册并获取注册域名的注册公司

一个小任务,给了一个包含了几千条域名的Excel,检测是否已经注册,注册的话获取注册公司,并获取对应网站是否能正常打开,最终以Excel文件呈现. 1.起初,想到的就是读取域名,通过http调用 xinnet或者是万网的 whois查询接口查询,而后将页面结果正则匹配Registrant:,registrant organization:,registrant name:字段,获取该行:后边的内容.这样的结果就是很乱,很多注册公司不用这三个字段,没有一个统一的标准来判定是否注册及注册公司. 2.

企业Shell实战-批量检查多个网站地址是否正常

批量检查多个网站地址是否正常 要求:shell数组方法实现,检测策略尽量模拟用户访问思路 http://www.etiantian.org http://www.taobao.com http://oldboy.blog.51cto.com http://10.0.0.7 思路: 1.url列表作为数组 2.check_url 3.判断输出. 解答: 脚本如下: [[email protected] oldboy26]# cat ms6.sh  #!/bin/bash [ -f /etc/ini

使用matlab批量处理图像后在指定文件夹存储

使用matlab批量处理图像后在指定文件夹存储 clear;clc;close all; Files=dir('D:\文件及下载相关\文档\MATLAB\postgraduate\Kodak\*.jpg'); N=length(Files); Names={}; Images={}; for k=1:N Names{k}=Files(k).name; Images{k}=imread(['D:\文件及下载相关\文档\MATLAB\postgraduate\Kodak\' Names{k}]);

linux批量设置部分文件与文件夹权限

批量设置web目录下文件.文件夹名为sitemap.xml.sitemap 属性为777 cd /www/web find ./ -name 'sitemap' -exec chmod -R 777 {} \; find ./ -name 'sitemap.xml' -exec chmod -R 777 {} \; 或者 find /www/web/ -name 'sitema*' -exec chmod -R 777 {} \; linux批量设置部分文件与文件夹权限

[Android Pro] 查看 keystore文件的签名信息 和 检查apk文件中的签名信息

1: 查看 keystore文件的签名信息 keytool -list -v -keystore keystoreName -storepass keystorePassword 2: 检查apk文件中的签名信息 解出apk中RSA文件,然后用keytool即可查看签名信息: keytool -printcert -file ~/test/CERT.RSA

Linux创建指定用户特定指定目录权限

指定用户特定指定目录权限 需要注意要指定好文件夹的权限,不然会导致nginx不能访问,最好是在root下建立目录,然后 # useradd -d /usr/www -m tempuser# passwd tempuser   回车输入密码 注意一定要带用户名,不然就是修改root!!!# chown tempuser -R /usr/www 这样不能上传到其他目录,但是可以下载可以看,只读. # chmod 755 /usr/www  如果要给特定 但是需要注意 在linux shell中不显示

整理的Unity导出安卓工程利用ANT进行多渠道批量打包APK

Unity导出的安卓工程利用ant进行多渠道循环批量打包 一:设置JAVA环境变量 做android开发的配置这个是基础. win7 下配置java环境变量,下面是链接 http://www.cnblogs.com/zhj5chengfeng/archive/2013/01/01/2841253.html 二:配置Android的SDK环境变量 除了需要Java的环境变量,我们还需要配置Android的sdk的位置,名字是ANDROID_HOME,值就是你的android的sdk的位置,比如我的

PSFTP自动登录SFTP服务器,批量自动上传上传下载指定文件

1.putty官方下载 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 下载安装版  putty-0.67-installer.msi 2.安装完成之后,打开putty安装目录,找到PSFTP.EXE,复制到新的文件夹 D:/Download 3.双击打开pstftp.exe,连接Linux服务器 4. 设置下载到windows的本地目录 5.psftp常用命令(操作服务端的文件则是Linux常用命令) lcd+路径

B/S模式实现批量打包apk

界面流程 界面例如以下: 这是一个使用html编写的界面,界面分为两半.两个frame.左边为操作栏,右边为控制台输出. 打包流程: 选择须要打包的渠道后,点击打包,等待server打包,并把日志输出到右边的frame. 打包完毕后.点击"点击打开下载界面"链接.跳转到下载界面. 实现思路 环境说明 server使用的是apache server2.4.12,所以与浏览器的交互是使用cgi,关于cgi能够參考这里. 自己主动化的实现使用ant.关于ant能够參考这里. 开发工具:vs2