精华内容
下载资源
问答
  • iOS安全之在模拟器中安装APP

    千次阅读 2019-07-05 19:22:13
    我一直在想iOS 模拟器如何安装 微博、UC等一些非系统自带的应用? Xcode提供了simctl命令来对模拟器进行各种操作,这个命令的路径是: /Applications/Xcode.app/Contents/Developer/usr/bin/simctl 1. 要去网上...

    我一直在想iOS 模拟器如何安装 微博、UC等一些非系统自带的应用?

    Xcode提供了simctl命令来对模拟器进行各种操作,这个命令的路径是:

    /Applications/Xcode.app/Contents/Developer/usr/bin/simctl
    

    1. 要去网上找别人已经打好的包,这里附上钉钉的开发包点击下载

    2. 打开模拟器

    3. 打开终端,并使用cd命令进入开发包所在的目录中

    4. 在终端中输入命令以下命令

    /Applications/Xcode.app/Contents/Developer/usr/bin/simctl install booted ~/Downloads/DingTalk.app
    

    5. 等待安装完毕即可使用

    6. 解释下这行命令的意思

    /// simctl命令的位置
    /Applications/Xcode.app/Contents/Developer/usr/bin/simctl
    
    /// 执行安装操作
    install
    
    /// 安装到当前启动的模拟器
    booted
    
    /// 开发包所在的位置,如果在当前目录下,直接输入开发包名字即可
    ~/Downloads/DingTalk.app
    

    通过以上方法的确能安装到模拟器中,但是打开之后就闪退。暂时不知道什么原因。

    Mac 如何下载ipa

    这里介绍下Mac 如何下载ipa

    1.首先:下载爱思助手

    在这里插入图片描述

    2. 安装后打开软件,搜索微博

    在这里插入图片描述

    3. 点击下载:微博国际版,完成后左上角下载按钮。找到下载文件,有机打开文件位置。

    在这里插入图片描述

    4. 选中下载的ipa右键打开方式:归档实用工具

    在这里插入图片描述

    5.得到解压的文件包:Paylaod:微博国际版.app 其中后缀被隐藏了。

    在这里插入图片描述

    6.快捷方法直接把Paylaod:微博国际版.app 直接拉到模拟器中。

    但是模拟器中一打开就闪退。真机正常。

    参考文章:
    iOS开发:如何在模拟器中安装APP

    展开全文
  • 介绍  项目中需要引入腾讯手机管家做安全防护功能,因此需要检测用户手机是否安装了腾讯手机管家,以此来引导用户下载手机管家,这个功能其实也很简单。首先需要拿到手机管家的包名,不用多说,包名是APP的唯一...

    介绍

      项目中需要引入腾讯手机管家做安全防护功能,因此需要检测用户手机是否安装了腾讯手机管家,以此来引导用户下载手机管家,这个功能其实也很简单。

    首先需要拿到手机管家的包名,不用多说,包名是APP的唯一标识。

    取得APP包名的方式有很多,但是个人感觉最方便的还是采用appt工具来对apk进行解析获得apk的详细信息。

    aapt简介

    aapt即Android Asset Packaging Tool,我们可以在SDK的platform-tools目录下找到该工具。aapt可以查看、 创建、 更新ZIP格式的文档附件(zip, jar, apk)。 也可将资源文件编译成二进制文件,尽管你可能没有直接使用过aapt工具,但是build scripts和IDE插件会使用这个工具打包apk文件构成一个Android 应用程序。

    主要用法

    下面的这个参数列表基本向我们展示了如何使用aapt以及aapt的基本功能了。

    aapt l[ist]:列出资源压缩包里的内容。
    aapt d[ump]:查看APK包内指定的内容。
    aapt p[ackage]:打包生成资源压缩包。
    aapt r[emove]:从压缩包中删除指定文件。
    aapt a[dd]:向压缩包中添加指定文件。
    aapt v[ersion]:打印aapt的版本。
    

    我们关注aapt d[ump]命令参数的用法,这个命令用来查看APK指定的内容,values 参数指定了想要查看的内容

    aapt d[ump] [--values] [--include-meta-data] WHAT file.{apk} [asset [asset ...]]
       strings          输出字符串资源
       badging          查看apk包的packageName、versionCode、applicationLabel、launcherActivity、permission等各种详细信息
       permissions      输出权限列表
        resources       输出资源列表
       configurations   输出configurations 配置项
       xmltree          以树形结构输出的xml信息。
       xmlstrings     输出xml文件中所有的字符串信息。
    

    如下图所示,我们拿到了app的包名 com.tencent.qqpimsecure
    这里写图片描述

    判断APP是否安装

    PackageManager类用来获取当前安装在设备上的所有应用的各种信息。
    SDK 说明如下:

    /* Class for retrieving various kinds of information related to
    the application * packages that are currently installed on the
    device. * * You can find this class through {@link
    Context#getPackageManager}. */

    其中getInstalledPackages方法可以返回设备所有已安装的所有packages信息,参数为过滤条件,此处我们不需要对返回信息做过滤,传入0即可。

      /**
         * Return a List of all packages that are installed
         * on the device.
         */
        public abstract List<PackageInfo> getInstalledPackages(int flags);
    

    通过PackageManager可以拿到系统安装所有的APP 的 PackageInfo 列表,PackageInfo 封装了一个app所有的信息,其实就是在APP安装过程中,系统通过解析AndroidManifest.xml文件 拿到APP信息并封装保存在PackageInfo中的。

    以下是PackageInfo的SDK 说明:

    /* Overall information about the contents of a package. This
    corresponds * to all of the information collected from
    AndroidManifest.xml. */

    其中成员变量packageName表示应用的包名。

     /**
         * The name of this package.  From the &lt;manifest&gt; tag's "name"
         * attribute.
         */
        public String packageName;
    

    了解了这些,我们可以写代码了。
    代码如下:

    
     public static boolean isAppInstalled(Context context, String packageName) {
            final PackageManager packageManager = context.getPackageManager();
            //取得所有的PackageInfo
            List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
            List<String> pName = new ArrayList<>();
            if (pinfo != null) {
                for (int i = 0; i < pinfo.size(); i++) {
                    String pn = pinfo.get(i).packageName;
                    pName.add(pn);
                }
            }
            //判断包名是否在系统包名列表中
             return pName.contains(packageName);
    

    利用DownLoadManager下载

    如果尚未安装指定的应用,则应该从网络下载并安装应用。一个完整的下载服务需要考虑如下一些问题:

    1. 网络通信模块编写
    2. 用户网络类型判断,是否允许移动网络下载
    3. 断点续传或进度控制,中间暂停之后,之后可以继续下载
    4. 下载进度条展示
    5. 文件保存I/O操作
    6. 下载完成进行安装

    总之 一个下载模块需要考虑的问题还是很多的,有时候还要做很多适配工作,例如 你通过通知栏进度条展示下载进度,往往在不同的机器上得到形形色色的UI 展示,你还得费心费力去做适配,的确很坑,实际上,我们只需要一个下载服务就可以了。

      从Android 2.3(API level 9)开始,Android用系统服务(Service)的方式提供了Download Manager来优化处理长时间的下载操作。Download Manager处理HTTP连接并监控连接中的状态变化以及系统重启来确保每一个下载任务顺利完成。

    在大多数涉及到下载的情况中使用Download Manager都是不错的选择,特别是当用户切换不同的应用以后下载需要在后台继续进行,以及当下载任务顺利完成非常重要的情况(DownloadManager对于断点续传功能支持很好)。要想使用Download Manager,使用getSystemService方法请求系统的DOWNLOAD_SERVICE服务。

    使用步骤如下:

    1. 得到DownloadManager

      DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
    2. 得到连接请求对象

      DownloadManager.Request   request=new DownloadManager.Request (Uri.parse(uri));//请求的uri
    3. 对请求设置参数(常用的)

      //设置允许使用的网络类型,移动网络与wifi都可以
      request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE|DownloadManager.Request.NETWORK_WIFI);
      
      //显示在下载界面,即下载后的文件在下载管理里显示
      down.setVisibleInDownloadsUi(true);
      
      /**
      设置下载后文件存放的位置,不设置会存在data/data/com.Android.provider.downloads/cache/下面,设置后存在sd上的Android/data/<包名>/files/下面。第2个参数是files下再建目录的目录名,第3个参数是文件名,如果第3个参数带路径,要确保路径存在,第2个参数路径随便写,会自己创建 
      */
      down.setDestinationInExternalFilesDir(mContext, Environment.DIRECTORY_MUSIC, "我的歌声里.mp3"); 
      
      
      /**在通知栏显示下载详情,比如百分比。默认是true,改为false需要权限*android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
       此方法被setNotificationVisibility(int visibility)(API11)取代.
      */     
       down.setShowRunningNotification(true)(API 9); 
      
      //以sd卡路径为根路径,与上方法只有一个有效。第一个参数创建文件夹用的是mkdir
      
                      down.setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC, "我的歌声里.mp3");
    4. 开始下载

      //将下载请求放入队列
      manager.enqueue(down);

    其他

    1. 可以通过广播接收下载完成信息,Action为DownloadManager.ACTION_DOWNLOAD_COMPLETE

    2. 点击正在下载的notification将会受到Action为DownloadManager.ACTION_NOTIFICATION_CLICKED的广播。

    3. 得到下载完成的文件存在数据库中的ID:

      long downId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
    4. 得到文件存储的URI
      getUriForDownloadedFile(long id)

    5. 通过Cursor查询数据库获取下载信息

      new一个DownloadManager.QuerysetFilterById(long... ids),接着用DownloadManagerquery(DownloadManager.Queryquery)来得到Cursor对象。下载百分比也是这么获取,数据库里有两个字段其中current_bytes是当前下载bit数,在等于total_bytes之前是更新的。

    记得加权限

    <uses-permission android:name="android.permission.INTERNET"/>  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  

    代码实现

    布局文件activity_main.xml

    
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:orientation="vertical">
    
            <TextView
                android:id="@+id/tvShow"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
    
            <Button
                android:id="@+id/btn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="下载手机管家" />
    
        </LinearLayout>
    
    
    </RelativeLayout>

    AppUtils.java

    public class AppUtils {
    
        /**
         * 判断某个App是否安装
         *
         * @param context
         * @param packageName
         * @return
         */
        public static boolean isAppInstalled(Context context, String packageName) {
            final PackageManager packageManager = context.getPackageManager();
            List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
            List<String> pName = new ArrayList<>();
            if (pinfo != null) {
                for (int i = 0; i < pinfo.size(); i++) {
                    String pn = pinfo.get(i).packageName;
                    pName.add(pn);
                }
            }
            return pName.contains(packageName);
        }
    
        /**
         * 根据包名启动对应的APP
         *
         * @param context
         * @param packageName
         */
    
        public static void startApp(Context context, String packageName) {
            Intent LaunchIntent = context.getPackageManager().getLaunchIntentForPackage(packageName);
            context.startActivity(LaunchIntent);
        }
    
        /**
         * 安装apk
         *
         * @param context
         * @param uri
         */
    
        public static void installApp(Context context, Uri uri) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(uri,
                    "application/vnd.android.package-archive");
            context.startActivity(intent);
        }
    
    
    }
    

    MainActivty.java

    import android.app.DownloadManager;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
        private TextView tvShow;
    
        private Button btn;
    
    
        private DownloadReceiver mReceiver;
    
        private DownloadManager mDownloadManager;
    
        private final String URL = "http://f3.market.xiaomi.com/download/AppStore/0f55a4edf525573555d6ee71b9f8b7b2a0e40d6d0/com.tencent.qqpimsecure.apk";
    
        private final String APP_PACKAGE = "com.tencent.qqpimsecure";
    
        private final String APP_NAME = "腾讯手机管家";
        //下载完成标识
        private boolean dFlag = false;
        //是否安装标识
        private boolean iFlag = false;
    
        private Uri downLoadUri;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initViews();
        }
    
        private void initViews() {
            tvShow = (TextView) findViewById(R.id.tvShow);
            btn = (Button) findViewById(R.id.btn);
    
            //注册下载接收器
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
            intentFilter.addAction(DownloadManager.ACTION_NOTIFICATION_CLICKED);
            mReceiver = new DownloadReceiver();
            registerReceiver(mReceiver, intentFilter);
            //启动应用
    
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AppUtils.startApp(MainActivity.this, APP_PACKAGE);
                }
            });
    
            //按钮
            btn.setOnClickListener(new View.OnClickListener() {
                                       @Override
                                       public void onClick(View v) {
                                           //如果已经安装,点击启动
                                           if (iFlag) {
                                               AppUtils.startApp(MainActivity.this, APP_PACKAGE);
                                           }
                                           //如果已经下载完毕,点击安装
                                           else if (dFlag) {
                                               AppUtils.installApp(MainActivity.this, downLoadUri);
                                           }
                                           //如果尚未下载,点击下载
                                           else {
                                               mDownloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                                               DownloadManager.Request request = new DownloadManager.Request(Uri.parse(URL));
                                               //设置允许下载的网络类型
                                               request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
                                               //通知栏进度可见
                                               request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                                               request.setTitle(APP_NAME);
                                               //设置下载的文件位置
                                               request.setDestinationInExternalFilesDir(MainActivity.this, Environment.DIRECTORY_DOWNLOADS, APP_NAME + ".apk");
                                               mDownloadManager.enqueue(request);
                                               btn.setText("下载中...");
                                           }
    
                                       }
                                   }
    
            );
    
    
        }
    
    
        @Override
    
        protected void onResume() {
            super.onResume();
            if (AppUtils.isAppInstalled(this, APP_PACKAGE)) {
                tvShow.setText("已启用安全防护");
                btn.setText("启动手机管家");
                iFlag = true;
    
            } else {
                tvShow.setText("尚未安装手机管家");
                iFlag = false;
                if (dFlag) {
                    btn.setText("点击安装");
                } else {
                    btn.setText("点击下载");
                }
    
            }
    
    
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d("app", "onDestroy");
            unregisterReceiver(mReceiver);
        }
    
        /**
         * 广播接收器,接受ACTION_DOWNLOAD_COMPLETE
         */
        class DownloadReceiver extends BroadcastReceiver {
    
            @Override
            public void onReceive(Context context, Intent intent) {
    
                if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
    
                    long downId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
                    downLoadUri = mDownloadManager.getUriForDownloadedFile(downId);
                    String mimeType = mDownloadManager.getMimeTypeForDownloadedFile(downId);
                    Log.d("app", "下载完成->" + downLoadUri.toString() + "mimeType->" + mimeType);
                    AppUtils.installApp(context, downLoadUri);
                    dFlag = true;
                    btn.setText("点击安装");
                }
    
            }
        }
    }
    

    运行效果

    20161112224737713 20161112224812338 20161112224832823
    展开全文
  • mac app store无法下载安装应用程序

    千次阅读 2015-01-26 00:58:24
    app store中安装有道词典时报错: 无法完成您的请求。 App Store 出错,请稍后重试。(null) 有人说更改dns可以解决,我尝试了,还是没有解决,一直报同样的错。 后来突然看到app store的菜单 “商店” 里有一...

    在app store中无法下载安装应用程序,具体表现是这样的:

    1. 点击 “获取” 按钮时,按钮文字立马变成 ”安装“,(正常情况是点击获取后会有一个下载过程,在其它mac上得知)
    2. 点击 ”安装“ ,提示输入apple id 密码, 输入密码确定后,等待一会,然后提示下面的错误:
      无法完成您的请求。App Store 出错,请稍后重试。(null)
      App Store 出错,请稍后重试。(null)
    3. 点击确定后会跳到一个界面,让我输入三个安全问题,用来保存apple id的安全。

    有人说更改dns可以解决,我尝试了,还是没有解决,一直报同样的错。

    后来突然看到app store的菜单 “商店” 里有一个子菜单 “显示我的帐户(此处是你自己的帐户)“ ,就进去看了一下,结果发现里面有一项是 ”重设所有关于购买和下载产品的警告“,我怀着期待的心情点了一下 ”重设“ 按钮,再回到app store界面,奇迹出现了,有道词典已经装好,心情顿时大好,特将经验分享给大家大笑



    ------补充,崩溃了,今天安装The Unarchiver又报同样的错,看来昨天只是运行,谁碰到过这种情况啊,麻烦留言给个解决方案。


    -----再补充,终于弄好了,原来是我第一次用apple id, 必须要我填写安全问题,之前我都忽略,因为嫌麻烦不想填写,直接点取消了,导致总是无法下载应用,真是坑爹啊

    展开全文
  • APP安全测评

    千次阅读 2017-02-07 10:03:27
    APP安全测评checklist

    转载自http://www.cnblogs.com/permanent2012moira/p/5271495.html
    仅作学习之用

    APP安全测评checklist

        <div class="postBody">
            <div id="cnblogs_post_body"><p style="text-align: left;">leader不要打我啊,我要借用一下我组app的安全测评检查方案,这些最基本的安全防范措施应该是每个app都要注意的吧:</p>
    

    对了,首先,你的app得先混淆啊~:AndroidStudio 混淆打包

    先来个checklist:

    编号

    检查项目

    测评结果

    1

    明文传输用户名、密码和验证码等敏感信息。

     

    2

    不安全的本地存储。

     

    3

    泄漏后台服务器地址,导致服务器可控

     

    4

    边信道信息泄漏

     

    5

    未使用有效的token机制,导致可以绕过鉴权

     

    6

    传输数据可修改,造成越权访问

     

    7

    登录设计缺陷,存在被暴力破解风险

     

    8

    利用业务逻辑缺陷制作短信炸弹

     

    9

    关键页面存在钓鱼劫持风险,导致用户信息泄露

     

    10

    可以重新编译打包

     

    11

    WebView漏洞

     

    12

    Web表单设计缺陷,存在SQL注入漏洞

     

    13

    组件Content Provider配置错误,导致数据泄漏

     

    14

    组件Activity配置错误,导致登录页面被绕过

     

    15

    组件Service配置错误,导致非法权限提升

     

    16

    组件Broadcast Receiver配置错误,导致拒绝服务、非法越权

     

    17

    开启allowbackup备份权限,存在备份数据泄露风险

     

    18

    开启Debuggable属性,存在应用信息篡改泄露风险

     

    19

    下载非官方开发工具,导致IOS版本APP被植入恶意代码

     

    20

    开发者证书不规范,导致开发者身份信息不明

     

    具体的解释:

    1、明文传输用户名、密码和验证码等敏感信息

    问题描述:用户登录过程中,在与服务器端交互时明文传输用户名、密码或者验证码等,可导致用户敏感信息泄露。

    检测结果:手机连接Fiddler代理,在Fiddler代理中抓包测试。APP登录操作: 账号、登录凭证不安全传输。

    密码虽然是MD5散列后的数值,但是传输使用的是http协议,存在被嗅探窃取的可能性,一旦泄漏,黑客能够直接通过该用户名和Password登录。

    整改建议:登录凭证信息需加密传输,建议使用自定义加密协议或使用https方式传输。

    2、 不安全本地存储

    问题描述:安卓开发者使用多种方法将数据存储在安卓应用中,而存储在本地的数据文件如果未加密,易造成敏感信息泄漏。

    检测结果:Shared Preferences用户名和登录凭证明文存储在healthConfig.xml文件中。

    SQLite 未发现敏感数据存储

    SD卡敏感数据存储 未发现数据写入。

    整改建议:对存储在本地的敏感数据进行加密。

    3、泄漏后台服务器地址,导致服务器可控

    问题描述:在使用BurpSuite等工具对应用进行监听的过程中,发现后台服务器地址。对后台服务器进行测试,若后台服务器存在漏洞,则可控制后台服务器。

    检测结果:后台服务器地址为**********,未发现可导致服务器可控的安全漏洞。

    4、边信道信息泄漏

    问题描述:当APP处理用户或其它数据源输入的数据时,可能会把数据放在不安全的位置,容易导致边信道被攻击者利用造成信息泄露。

    检查结果:用户登录凭证、设备ID等敏感数据出现在log中。

    整改建议:对logcat的打印数据进行过滤,敏感数据不能出现在log中。

    5、未使用有效的token机制,导致可以绕过鉴权

    问题描述:如果被测应用没有使用有效的token机制,对登陆响应中的服务器返回的鉴权信息进行修改,即可绕过服务器鉴权,直接访问系统内部信息。

    检测结果:从代理抓包分析,APP登录是会将一个deviceid和用户凭证一起提交,用户登录成功后,该deviceid将作为后续接口调用的凭证,即Token。

    经查,该deviceid为设备中某些公开信息(IMEI、设备型号、操作系统版本等)的Base64编码结果,不具备隐私性,黑客可以通过获取这些公开信息伪造用户身份。

    整改建议:在deviceid中加入随机数据。

    6、传输数据可修改,造成越权访问

    问题描述:利用已有的用户名密码登录应用,当应用访问某一模块时,使用BurpSuite等代理工具进行监听,对访问该模块时的关键信息进行替换,则可越权访问他人的应用模块。

    检测结果:同第5条。

    7、登录设计缺陷,存在被暴力破解风险

    问题描述:用户登录过程中,未对同一用户的登录失败次数做限制,导致存在被暴力破解的风险。

    问题详情:对登录接口进行暴力破解,错误50次后,输入正确用户名和密码仍然成功登录,表明没有对登录接口做暴力破解防护。

    整改建议:限制账号登录错误次数,超过阀值时需要提供验证码机制。

    8、利用业务逻辑缺陷制作短信炸弹

    问题描述:如果在用户注册过程中存在逻辑设计缺陷,可对指定手机号码随意发送短信,造成短信炸弹攻击,可能造成用户投诉或恶意软件传播等。

    测试结果:用户选择注册或忘记密码功能时,会触发短信验证码发送,多次调用验证码发送接口,每分钟能收到多条短消息,且没有发现总量限制。

    整改建议:如果已经限制了每个用户每分钟的短信条数(如果没有限制,请做限制处理),建议进一步限制每个用户每天的短信条数。

    9、关键页面存在钓鱼劫持风险,导致用户信息泄露

    问题描述:劫持钓鱼,指恶意应用针对正常应用的特定界面进行仿冒替换,诱骗用户在仿冒界面操作,达到钓鱼目的。此类攻击,多针对APP的鉴权或支付场景,诱骗用户输入关键隐私信息,如账号、登陆密码和支付密码等,达到隐私窃取的目的。

    检测结果:恶意应用可以通过监测进程机制实现对APP的劫持,当APP启动时,弹出伪造的登录Activity,实现钓鱼劫持。

    整改建议:

    1. 建议在登录Activity的onpause方法中实现钓鱼劫持防护功能,如提示用户当前登录也已切换等。
    2. 使用HTML5架构或android+HTML5混合开发,实现登陆、支付等关键页面,降低被劫持的风险。

    10、可以重新编译打包

    问题描述:破解者通过反编译后得到程序源代码,修改后重新编译、签名并安装。在重新打包的过程中,破解者可能注入恶意代码,或者修改软件逻辑绕过鉴权等。

    检测结果:通过反编译工具对APP进行反编译后,修改部分源代码后,可以重新打包安装,并成功安装在手机中运行。

    整改建议:通过检查程序安装后classes.dex文件的Hash值,判断软件是否被重打包并进行提示。(这个具体使用时判断了打包keystore的SHA1值,不过前提是这个jks文件没被劫持啊)

    11、WebView漏洞

    问题描述:在WebView下有一个非常特殊的接口函数addJavascriptInterface,能实现本地java和js的交互。被测应用中存在WebView漏洞,没有对注册JAVA类的方法调用进行限制,导致攻击者利用addJavascriptInterface这个接口函数穿透webkit控制android本机。

    检测结果:通过反编译源码发现BrowserActivity中存在WebView组件,并使用了addJavascriptInterface接口,但是对该接口使用@JavascriptInterface进行了保护,无需整改。(说实话这个不太熟悉)

    12、Web表单设计缺陷,存在SQL注入漏洞

    问题描述:开发过程中未对特殊字符进行过滤,攻击者可以通过把SQL命令插入到Web表单提交或者输入域名或者页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令的目的,这样攻击者就能够对内部数据库进行增删改操作。

    检测结果:未发现SQL注入漏洞

    13、组件Content Provider配置错误,导致数据泄漏

    问题描述: Content Provider是安卓应用组件,以表格的形式把数据展现给外部的应用。每个Content Provider都对应一个以”content://”开头的特定URI,任何应用都可以通过这个URI操作Content Provider 应用的数据库。如果应用对权限控制不当就会造成信息泄露。

    检测结果:使用drozer工具检测,未发现可被非法访问的URI。

    14、组件Activity配置错误,导致登录页面被绕过

    问题描述:Activity是安卓应用组件,提供与用户进行交互的界面。如果应用对权限控制不当,可以绕过登录界面直接显示该界面。

    检测结果:使用drozer工具检测,发现多个可被外部应用直接调用的Activity组件,其中有的Activity可以跳过登录直接启动,存在安全风险。

    整改建议:对风险Activity显式设置android:exported=false权限。

    命令:dz> run app.activity.info -a <packageName>   

    15、组件Service配置错误,导致非法权限提升

    问题描述:Service是Android中四大组件进行后台作业的主要组件,如果被测应用对权限控制不当,导致其他应用可以启动被测应用的Service。

    检查结果:使用drozer工具检测,发现可被外部应用直接调用的Service组件,但未发现非法调用风险。

    整改建议:请自确认暴露出来的两个Service是否存在非法调用风险,对风险Service显式设置android:exported=false权限。

    命令:dz> run app.service.info -a <packageName> 

    16、组件Broadcast Receiver配置错误,导致拒绝服务、非法越权

    问题描述:Broadcast Receiver是Android中四大组件用于处理广播事件的组件,若存在配置不当则其他应用可以伪装发送广播从而可造成信息泄露,拒绝服务攻击等。

    检查结果:使用drozer工具检测,发现多个暴露的Broadcast组件,通过drozer发送这些自定义的Receiver对应的广播分别会造成系统弹框和程序奔溃,可能会被恶意应用利用,造成拒绝服务攻击。

    整改建议:对外暴露的Broadcast组件显式设置android:exported=false权限。

    命令:dz> run app.broadcast.send –component <packageName>  <Customer Receiver Name>

    17、开启allowbackup备份权限,存在备份数据泄露风险

    问题描述: 被测应用的AndroidManifest.xml文件中allowBackup属性值被设置为true,可通过adb backup对应用数据进行备份,在无root的情况下可以导出应用中存储的所有数据,造成用户数据泄露。

    检测结果:反编译查看AndroidManifest.xml,发现allowBackup属性被设置为true

    整改建议:如无特殊需求,将allowBackup设置为false

    18、开启Debuggable属性,存在应用信息篡改泄露风险

    问题描述:被测应用的AndroidManifest.xml文件中Debuggable属性值被设置为true,可以设置断点来控制程序的执行流程,在应用程序运行时修改其行为。

    检测结果:未发现开启Debuggable属性

    19、下载非官方开发工具,导致IOS版本APP被植入恶意代码

    检查结果:此项仅针对IOS客户端。请项目组自检,确保开发工具为官方下载。

    (Xcode后门事件影响不小啊)

    20、开发者证书开发者证书不规范,导致开发者身份信息不明

    问题描述: 被测应用的开发者证书不规范,导致被测应用的开发者身份信息不是与本公司相关的信息。

    (这个在生成jks或者keystore的时候要填写公司或者个人合理的信息)

    展开全文
  • app安装检测技术原理

    千次阅读 2017-07-31 18:04:09
    由于安全隐私的原因,目前网页端无法通过js脚本直接判断某个APP是否已安装,只能首先通过js尝试性的启动app,然后再进入安装流程。web网页上启动app的方式有两种: 1).schema android与ios均支持自定义schema,...
  • Mac安装app store下载的软件

    千次阅读 2015-11-19 15:52:38
    由于网络原因,MacBook上的app store会出现无法连接的情况,这时候我们可以选择在网上下载所需的软件自行安装,具体步骤如下: 1.点击屏幕左上角苹果标志; 2.点击“系统偏好设置”; 3.在弹出的窗口点击“安全...
  • APP安全测试总结

    千次阅读 2018-05-16 11:42:57
    收集整理网上的资料以及自己测试过程中遇到的问题前言APP 安全一直是开发者头痛的事情,越来越多的安全漏洞,使得开发者越来越重视app安全,目前app安全主要有由以下几部分APP组件安全Android 包括四大组件:...
  • adb下载安装及使用

    万次阅读 多人点赞 2019-05-23 12:00:15
    adb下载安装: 一共有两种方法: 首先第一种就是最简单的方法,只下载adb压缩包去解压即可:链接:https://pan.baidu.com/s/1SKu24yyShwg16lyIupO5VA 提取码:ih0i (备注:如果下载放入到D盘去解压,打开dos窗口...
  • 经常有人为了下载某些热门APP,苦于寻找美区、港区等中区以外账号注册,这里我们分享给大家一些港区 App Store 的 Apple ID账户,并把切换Apple ID...这里请注意,选择的是App Store,为了您的隐私安全,请勿尝试使...
  • Android在一个app安装并卸载另一个appapp→src→main下新建文件夹asserts,将准备安装的apk文件放在asserts内 在app→src→main→res下新建文件夹xml,右击xml文件夹,选择new→XML Resource File,File name...
  • 下面是下载安装的具体逻辑 首先在服务中创建DownloadManager public class DownloadService extends Service { private DownloadFinishReceiver mReceiver; public DownloadService() { } @Override ...
  • APP安全测试

    千次阅读 2016-01-12 10:33:48
     App安全问题首先是数据安全App本地存储的数据和网络请求数据中有没有涉及到用户的隐私数据。  本地存储数据可以查看看应用的shared_prefs文件和数据库文件中的数据(root后在应用安装目录内,或者查看外部...
  • APP安全漏洞学习笔记

    千次阅读 2016-12-28 21:46:16
    APP安全漏洞学习笔记 本文首先明确了APP安全的目标,然后对常见的APP漏洞进行了整理分析,并研究学习了APK的静态分析与动态分析技术,最后介绍了安卓的渗透测试技术和常见的安全评估工具。附录处整理了2014年和...
  • 1、检测app是否安装  检测app是否安装的方法有很多,以下列举几种。基本都是利用packageManager来完成。  a、通过packagemanager获取已经安装的包,然后对比得出是否安装。代码: public boolean isAppInstalled...
  • 客户网站以及APP在正式上线之前,都会找专业的安全公司进行渗透测试,检测网站、APP是否存在漏洞,以及一些安全隐患,大多数的运营者觉得安装一些安全防护软件就足以防止攻击了,越这样,网站APP越容易受到篡改数据...
  • 上一篇《iOS安全系列之一:HTTPS》被CocoaChina转载,还顺便上了下头条: 打造安全App!iOS安全系列之 HTTPS,高兴之余也有些诚惶诚恐,毕竟那篇文章只是介绍了比较偏应用的初级知识,对于想要深入了解HTTPS的...
  • Android hook原理及APP安全

    千次阅读 2019-08-18 13:34:29
    如何保证APP安全。 这篇文章不对逆向和hook进行分析,如有不知道的,请看我之前的文章。 原理: 通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个...
  • 我们都知道,在系统不完整的手机上,例如被root过,运行App将面临被恶意攻击、窃取隐私等威胁,尤其是商城类App,购买环节的环境安全性至关重要,因此在App中增加能快速检测手机系统风险的功能必不可少。 这一重要...
  • App安全(一) Android防止升级过程被劫持和换包

    万次阅读 热门讨论 2016-08-17 17:46:21
    前言APP 安全一直是开发者头痛的事情,越来越多的安全漏洞,使得开发者越来越重视app安全,目前app安全主要有由以下几部分APP组件安全Android 包括四大组件:Activitie、Service、Content Provider、Broadba
  • 在微信里面打开APP下载链接

    万次阅读 2015-05-21 11:55:11
    关于公众号里面关于微官网里面的app下载,如果你将你的应用中在微信开发平台认证过来,这个是要掏钱的;你点微官网app的下载,是可以直接跳到APP Store里面,检测这个应用是否已经下载,如果下载,直接打开; 而...
  • Android APP自动升级安装失败

    千次阅读 2018-09-24 17:32:45
    ##Android APP自动升级安装失败 ###概述 自动升级在APP中是一个非常常见的功能,当你的应用有更新时,可以提醒用户升级甚至在必要时可强制用户升级。但随着系统版本的更新,安装apk的权限也在收紧,导致一些APP在高...
  • 这次的分享是关于如何在 AppStore 实现 App 的自动下载,理想中的目标是只需要一部手机,不需要人来干预,就可以模拟用户的真实下载,并在下载完成以后,可以自动更改手机参数,使之变为另外一部苹果手机,进行...
  • Android手机App安全漏洞整理

    千次阅读 2017-03-07 23:04:09
    APP安全漏洞整理 1.源码安全漏洞 1.1 代码混淆漏洞 当前APK文件的安全性是非常令人堪忧的。APK运行环境依赖的文件/文件夹 res、DEX、主配文件Lib 只有简单的加密或者甚至没有任何加密。诸如apktool这类工具可轻易...
  • 昨天准备给电脑上安装“SEED”,然后别人给我一个压缩包安装,结果安装之后,打开软件却弹出提示框,提示“打不开SEED,因为它来自身份不明的开发者。 。。。”,点击“好”,弹框关闭,SEED却打不开。 一、 ...
  • //获取安全支付单例并调用安全支付接口 AlixPay * alixpay = [AlixPay shared]; int ret = [alixpay pay:orderString applicationScheme:appScheme]; if (ret == kSPErrorAlipayClientNotInstalled)
  • 前言不少android用户在使用手机的时候都遇到部分APP不能够安装的问题,如何解决这个问题呢。给当前打包的APP进行加固很重要,什么叫做加固呢,就是传说中的加壳,也是现在使用最常见最常见的方法,下面是小编整合的...
  • 最近在做支付宝支付,需要验证客户端是否安装支付宝钱包App,可通过Url Scheme框架实现。 参考文档 :http://www.jianshu.com/p/28f517775214  1、 以支付宝为例,验证是否安装支付宝开发步骤:  step1. 验证...
  • Dynamics 365 app for ios的Appappstore就能下载,但Dynamics 365 app for android微软只发布在了google play,而众所周知的原因国内的用户上不了google play,而国内市场也没得下载,这给很多没法上google play的...
  • 方式一:黑果小兵镜像下载【推荐】 本人一直用这种方式,使用简单方便,极力推荐。 黑果小兵的部落阁:https://blog.daliansky.net/ 黑果小兵的镜像更新很快,做工精良。最新版本的,自行当他的官方博客下载。 当前...
  • 平时在使用豌豆荚或者360手机助手下载软件时,我们可以设置软件静默安装和智能安装,这两种情况允许用户无需操作任何界面就能够实现软件的一键下载安装,用户体验大大提高。我们知道静默安装主要是针对于已经Root的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,827
精华内容 34,330
关键字:

安全中心app下载安装