APP爬虫技术总结

APP爬虫技术总结APP常用抓包技术-工具Charles,fiddler,burpsuite,PacketCapture等,具体操作可以查找百度-抓包方法 a.常规操作直接抓 b.使用Xposed+JustTrustMe关闭SSL证书验证抓包关闭SSL证书校验之前抓包

大家好,又见面了,我是你们的朋友全栈君。

一、APP常用抓包技术

  • 工具
    Charles,fiddler,burpsuite,Packet Capture等,具体操作可以查找百度
  • 抓包方法
    a.常规操作直接抓
    b.使用Xposed+JustTrustMe关闭SSL证书验证抓包
    关闭SSL证书校验之前抓包
    在这里插入图片描述
    关闭SSL证书校验之后抓包
    关闭SSL证书校验之后抓包
    c.使用Packet Capture抓取TCP数据包
    在这里插入图片描述
    d.通过写xposed hook插件打印请求url和请求参数(示例可参照下面的案例)

二、APP脱壳

  • .加壳的原理
    给dex文件加层壳,反编译后的代码就是加壳的代码,看不到原dex代码,在一定程度上来说,还是可以起到防破解的,也可以防止二次打包
  • .常用的APP加固壳
    360 腾讯乐固、百度、网易、阿里、爱加密、梆梆、娜迦、顶象等
  • 手写脱壳工具:
    脱壳方式有好多种,企业壳最难搞,这里分享一种使用xposed插件脱免费壳,主要的代码如下:
public class PackageHook {
    Class Dex;
    Method Dex_getBytes;
    Method getDex;
    String packagename;
    public PackageHook(XC_LoadPackage.LoadPackageParam sharePkgParam) {
        packageHook(sharePkgParam);
    }

    private void packageHook(final XC_LoadPackage.LoadPackageParam lpparam) {
        Log.i("jyy", lpparam.packageName);

        final String packagename = "你要脱壳的app包名";
        //添加程序包名
        initRefect();
        XposedBridge.log("目标包名:" + lpparam.packageName);
        String str = "java.lang.ClassLoader";
        String str2 = "loadClass";

        XposedHelpers.findAndHookMethod(str, lpparam.classLoader, str2, String.class, Boolean.TYPE, new XC_MethodHook() {
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                super.afterHookedMethod(param);
                Class cls = (Class) param.getResult();
                if (cls == null) {
                    //XposedBridge.log("cls == null");
                    return;
                }
                String name = cls.getName();
                XposedBridge.log("当前类名:" + name);
                byte[] bArr = (byte[]) Dex_getBytes.invoke(getDex.invoke(cls, new Object[0]), new Object[0]);
                if (bArr == null) {
                    XposedBridge.log("数据为空:返回");
                    return;
                }
                XposedBridge.log("开始写数据");
                String dex_path = "/data/data/" + packagename + "/" + packagename + "_" + bArr.length + ".dex";
                XposedBridge.log(dex_path);
                File file = new File(dex_path);
                if (file.exists()) return;
                writeByte(bArr, file.getAbsolutePath());
            }
        } );
    }
        public void initRefect() {
            try {
                Dex = Class.forName("com.android.dex.Dex");
                Dex_getBytes = Dex.getDeclaredMethod("getBytes", new Class[0]);
                getDex = Class.forName("java.lang.Class").getDeclaredMethod("getDex", new Class[0]);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }

        }

    public  void writeByte(byte[] bArr, String str) {
        try {
            OutputStream outputStream = new FileOutputStream(str);
            outputStream.write(bArr);
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
            XposedBridge.log("文件写出失败");
        }
    }

通过代码可以发现就是反射拿到Android中com.android.dex.Dex对象然后调用getDex方法然后把字节写到文件,其实就是脱壳后dex文件。Fdex2脱壳工具的核心原理就是上述代码。

三、App逆向分析

  • 目标:xxx.apk 用户注册短信校验接口分析(仅仅用于学习,违法使用后果自负)
  • 工具:jadx,jeb, Android studio等
  • 抓包:注册短信校验包
    在这里插入图片描述
    如果没有逆向分析APP的看到请求参数是不是有点傻眼了,下面来探探究竟,先脱壳然后使用jadx打开脱壳后的dex,然后搜索关键词
    在这里插入图片描述
    继续跟踪代码,发现CLIENT_KEY是通过一个算法得到这个值
    在这里插入图片描述
    继续跟进代码(选中该方法按ctrl+鼠标左键)
    在这里插入图片描述
    先看h方法其实就是一个MD5算法
    在这里插入图片描述
    继续跟进上述a方法中的a方法:
    在这里插入图片描述
    其实f方法就是做了一些字符串拼接操作,g方法就是做了数组排序,可以自行继续追踪下去,如果是Java开发则只需要拷贝就行,其他语言改写就可以。到这里算法基本已经明确,现在最主要的问题就是a方法的参数:在这里插入图片描述
    常规操作是去找这个方法在哪里调用,这里先介绍一个技巧可以使用xposed 写一个hook插件把参数打印出来,如果打出来的参数还有加密,还是得去找它被调用的地方。不熟悉xposed框架可以去百度,一个神器的框架,hook插件代码:
private void cgvHook(final XC_LoadPackage.LoadPackageParam lpp) {
        Log.i("jyy", lpp.packageName);
        if (!lpp.packageName.contains("com.cgv.cn.movie")) {
            return;
        }

        XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                ClassLoader cl = ((Context) param.args[0]).getClassLoader();
                Class<?> hookclass = null;
                try {
                    hookclass = cl.loadClass("com.cgv.cn.movie.b.ar");
                } catch (Exception e) {
                    Log.e("jyy", "寻找xxx.xxx.xxx报错", e);
                    return;
                }
                //cn.ikicker.moviefans.ui.activity.b
                //a(String str, String str2, String str3)
                Log.e("jyy", "寻找xxx.xxx.xxx成功");
                //com.loopj.android.http

                Class hookclasss = cl.loadClass("com.loopj.android.http.RequestParams");
                XposedHelpers.findAndHookMethod(hookclass, "a",hookclasss,String.class, new XC_MethodHook() {

                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        Object params =  param.args[0];
                        String param1 = (String) param.args[1];
                        XposedBridge.log("a params:"+params.toString());
                        XposedBridge.log("a param1:"+param1);
                        super.beforeHookedMethod(param);
                    }
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        String result = (String) param.getResult();
                        XposedBridge.log("a result:"+result);
                        super.afterHookedMethod(param);
                    }
                });

                XposedHelpers.findAndHookMethod(hookclass, "a",hookclasss,String.class, String.class,new XC_MethodHook() {

                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        Object params =  param.args[0];
                        String param1 = (String) param.args[1];
                        String param2 = (String) param.args[2];
                        XposedBridge.log("aa params:"+params.toString());
                        XposedBridge.log("aa param1:"+param1);
                        XposedBridge.log("aa param2:"+param2);
                        super.beforeHookedMethod(param);
                    }
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        String result = (String) param.getResult();
                        XposedBridge.log("aa result:"+result);
                        super.afterHookedMethod(param);
                    }
                });


                XposedHelpers.findAndHookMethod(hookclass, "g",String.class, new XC_MethodHook() {

                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        String params = (String) param.args[0];
                        XposedBridge.log("g param1:"+params);
                        super.beforeHookedMethod(param);
                    }
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        String result = (String) param.getResult();
                        XposedBridge.log("g result:"+result);
                        super.afterHookedMethod(param);
                    }
                });


                XposedHelpers.findAndHookMethod(hookclass, "h",String.class, new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        String params = (String) param.args[0];
                        XposedBridge.log("h param1:"+params);
                        super.beforeHookedMethod(param);
                    }
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        String result = (String) param.getResult();
                        XposedBridge.log("h result:"+result);
                        super.afterHookedMethod(param);
                    }
                });

            }

        });
    }

打开ddms就可以查看aa params打印出来的就是我们a方法的第一个参数,aa param1打印出的就是第二参数,其实就是请求URL,换句话如果抓不到包也就可以使用这种办法把请求URL打出,也就是上面描述抓包方法中的第四种。aa result打印出的就是a方法的返回值,发现和抓包的的值是完全一样的,h方法的参数和返回值也打印出来了。其他的参数都可以按照这种思路去操作,图片中打码部分为手机号,你换成你们注册发送短信的手机号码即可。

APP爬虫技术总结
加密算法和加密参数已经知道了,CLIENT_KEY基本搞定了,这些都是一些初级的操作,还有很多app算法套路更深需要不断提升自己的实力才能击破他。其实这种Java基础加密完全可以写一套常用算法hook也就是可以直接打印出加密参数和加密结果,本人写了一个Java基本算法自吐插件,常规算法可以不需要脱壳和逆向app,直接打印加密算法和加密参数,但也有缺陷仅仅是Java层的算法而且是常规算法,如果算法有做修改则还是需要逆向代码,但是可以给我做一些前期的准备,过滤掉一些参数算法逆向操作。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143748.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Q学习(Q-learning)简单理解「建议收藏」

    Q学习(Q-learning)简单理解「建议收藏」第1节Q-learning逐步教程本教程将通过一个简单但又综合全面的例子来介绍Q-learning算法。该例子描述了一个利用无监督训练来学习未知环境的agent。假设一幢建筑里面有5个房间,房间之间通过门相连。我们将这五个房间按照从0至4进行编号,且建筑的外围可认为是一个大的房间,编号为5。房间结构如下图:上图的房间也可以通过一个图来表示,房间作为图的节点,两个房间若有门相连,则相应节点间对应一条边如图2所示图2房间结构对应的图第2节Q-learning手工推演…

    2022年10月3日
    2
  • oracle怎么测试包,用ORACLE自带包测试FUSIONIO的IOPS「建议收藏」

    oracle怎么测试包,用ORACLE自带包测试FUSIONIO的IOPS「建议收藏」settimingonserveroutputondeclarev_max_iopsBINARY_INTEGER;v_max_mbpsBINARY_INTEGER;v_act_latBINARY_INTEGER;begindbms_resource_manager.CALIBRATE_IO(num_physical_disks=>1,max_latency…

    2025年5月22日
    7
  • 置顶文章-波波烤鸭博客文章汇总篇【Java核心,经典开源框架应用及源码分析,企业级解决方案等】强烈建议收藏!!![通俗易懂]

    置顶文章-波波烤鸭博客文章汇总篇【Java核心,经典开源框架应用及源码分析,企业级解决方案等】强烈建议收藏!!![通俗易懂]  因为博客中的文章已经越来越来了,为了便于文章检索,特整理本文,欢迎收藏!!!Java核心1.JDK8新特性Lambda表达式讲解接口新特性函数式接口方法引用Stream流Optional工具类介绍新的日期时间工具类介绍注解的增强2.Java核心Java集合核心内容之数组和链表Java集合核心内容之二叉树2-3-4树详解红黑树详解精讲红黑树删除操作剖析反射的本质3.设计模式3.1创建型模式  都是用来帮助我们创建对象的!模式地址单例模式ht

    2022年9月8日
    3
  • 我国无线2.4g及5g信道-个人笔记

    我国无线2.4g及5g信道-个人笔记中国无线信道规划2.4G频段(2.412GHZ-2.472GHZ)信道中心频率频率范围01   2412  2401-242302   2417  2406-242803   2422  2411-243304   2427  2416-243805   2432  2421-244306   2437  2426-244807   2442  2431-245308   2447  2426-244809   2452  2441-246310   2457  24

    2022年6月1日
    122
  • ajax 面试题_javascript 面试题

    ajax 面试题_javascript 面试题1、什么是AJAX,为什么要使用Ajax(请谈一下你对Ajax的认识)什么是ajax:AJAX是“AsynchronousJavaScriptandXML”的缩写。他是指一种创建交互式网页应用的网页开发技术。Ajax包含下列技术:基于web标准(standards-basedpresentation)XHTML+CSS的表示;使用DOM(DocumentObjectModel)进行动态显

    2022年8月29日
    3
  • 安全帽识别算法

    安全帽识别算法应用背景:安全帽作为一种最常见和实用的个人防护用具,能够有效地防止和减轻外来危险源对头部的伤害。但在现场操作过程中,安全帽的佩戴很容易人为忽略,引发了不少人身伤害事故。为了保证工作人员都能在作业中佩戴安全帽,保障作业人员安全,安全帽识别算法系统应运而生。关键字:安全帽识别算法安全帽识别算法技术原理安全帽识别算法采用最新AI人工智能深度学习技术,基于计算机智能视频物体识别算法,且通过规模化的安全帽数据识别训练,赋予监控系统智能识别能力,从而准确判断识别场景内的作业人员是否佩戴安全帽,若检.

    2022年5月12日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号