APP爬虫技术总结

一、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() {@Overrideprotected 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.httpClass hookclasss = cl.loadClass("com.loopj.android.http.RequestParams");XposedHelpers.findAndHookMethod(hookclass, "a",hookclasss,String.class, new XC_MethodHook() {@Overrideprotected 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);}@Overrideprotected 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() {@Overrideprotected 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);}@Overrideprotected 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() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {String params = (String) param.args[0];XposedBridge.log("g param1:"+params);super.beforeHookedMethod(param);}@Overrideprotected 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() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {String params = (String) param.args[0];XposedBridge.log("h param1:"+params);super.beforeHookedMethod(param);}@Overrideprotected 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方法的参数和返回值也打印出来了。其他的参数都可以按照这种思路去操作,图片中打码部分为手机号,你换成你们注册发送短信的手机号码即可。


加密算法和加密参数已经知道了,CLIENT_KEY基本搞定了,这些都是一些初级的操作,还有很多app算法套路更深需要不断提升自己的实力才能击破他。其实这种Java基础加密完全可以写一套常用算法hook也就是可以直接打印出加密参数和加密结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/254920.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

H5 引用vue 打开app(如何该手机内有某个app则直接打开app,如果没有则跳转app下载页面)

H5 引用vue 打开app&#xff08;如何该手机内有某个app则直接打开app&#xff0c;如果没有则跳转app下载页面&#xff09; **ps&#xff1a; 一定一定一定一定先向 ios要 &#xff08; ios下载地址 和 ios对应的app协议 &#xff09;&#xff0c;找安卓要&#xff08; android…

使用uni-app开发App简易教程

使用uni-app开发App简易教程 前言app端开发步骤1、 申请uniapp开发者账号2、登录后开始新建应用3、下载安装 HBuildder X 。4、新建项目5、开启webview&#xff0c;在pages-index里面写一点点代码6、配置mainifest.json7、打包 h5工程配置在html中引入uniapp-sdk解决后退问题 上…

instant app入门和开发指南

本文由玉刚说写作平台提供写作赞助&#xff0c;赞助金额&#xff1a;300元原作者&#xff1a;AndroFarmer版权声明&#xff1a;未经本公众号许可&#xff0c;不得转载 概述 instant app 是谷歌推出的类似于微信小程序&#xff08;或者说小程序类似于instant app&#xff09;的一…

逆向技巧-快速定位App请求协议加密解密位置的方法

在App的逆向破解或者渗透测试过程中&#xff0c;经常会遇到网络请求协议被加密的情况&#xff0c;这个时候如果不对请求协议封包进行解密&#xff0c;找到其加密解密方法&#xff0c;就无法再进行下一步的操作。之前还好&#xff0c;大多数APP的加密解密方式为国际通用的算法&a…

uniApp实现h5页面唤醒app

如果想app跳app看这篇文章&#xff1a;app跳转app 说一下最近公司的需求 公司目前需要后台向每个用户发送一个带链接的短信&#xff0c;然后点击链接唤醒app。 注意 app配置ios&#xff0c;androi。app记得打包h5需要window.location.href进入 逻辑 当用户点击链接进入h5…

app采集的10个经典方法

app采集的抓取数据、app抓包、网页爬虫、采集网站数据、app数据采集软件、python爬虫、HTM网页提取、APP数据抓包、APP数据采集、一站式网站采集技术、BI数据的数据分析、数据标注等成为大数据发展中的热门技术关键词。那么app采集数据的方法有哪些呢&#xff1f;我给大家分享一…

辣椒app软件测试,testflight辣椒视频APP

辣椒视频test flight其实是一款关于系统类型的工具软件&#xff0c;看起来很像是影视播放器但其实并不是。testflight辣椒视频最近非常的红包&#xff0c;不少的小伙伴都想要知道辣椒视频test flight邀请码、兑换码&#xff0c;一起来看看吧~ 辣椒视频test flight简介 testflig…

app反编译

在进行安卓开发或者爬虫开发过程中&#xff0c;偶尔会遇到需要将app进行反编译分析参考源码的需求&#xff0c;接下来&#xff0c;笔者将自己实践过程记录下来&#xff0c;給需要的朋友一个参考。仅供学习之用&#xff0c;勿做坏事儿&#xff0c;哈哈哈&#xff01; 准备工作&…

这些旅行必备APP,你知道几个?

虽说疫情还在继续&#xff0c;但是有时候我们仍然会控制不住自己想要旅游想要呼吸其他地方空气的心情。在了解知悉目的地的防疫政策并做好充足的防疫准备后&#xff0c;我们不妨来一场告别已久的旅行。但在旅行前&#xff0c;请先马住这些旅游必备app。 1.穷游行程助手 行程攻…

APP启动流程解析

前言 当我们点击手机屏幕上的软件图标时&#xff0c;就可以打开这个软件&#xff0c;看似很简单的过程其实包含了许多的底层交互&#xff0c;看了还不明白&#xff0c;欢迎来打我。 一 . 启动流程简介 首先要知道的是&#xff0c;手机屏幕其实就是一个Activity&#xff0c;我…

uniapp实现app跳转app

需要H5唤醒App看这篇文章&#xff1a;H5唤醒App 需求&#xff1a;公司的app跳转公司的另一个app 注意看注释&#xff01;&#xff01;&#xff01; 注意看注释&#xff01;&#xff01;&#xff01; 注意看注释&#xff01;&#xff01;&#xff01; 如何实现呢&#xff0c;…

【Spring】— 动态SQL :<if>元素

动态SQL &#xff1a;元素 在MyBatis中&#xff0c;<if>元素是常用的判断语句&#xff0c;主要用于实现某些简单的条件选择。在实际应用中&#xff0c;我们可能会通过多个条件来精确地查询某个数据。 【示例8-1】下面通过一个具体的案例来演示元素的使用。 &#xff0…

数组及详解冒泡排序

数组及详解冒泡排序 一维数组的创建和初始化一维数组的创建一维数组的初始化一维数组的应用一维数组在内存中的存储 二维数组的创建和初始化二维数组的创建二维数组的初始化二维数组的应用二维数组在内存中的存储 数组越界问题数组作为函数参数数组名的含义及特殊两个例子 冒泡…

chatgpt赋能python:Python中累乘的作用和用法

Python中累乘的作用和用法 在Python编程语言中&#xff0c;累乘指的是连续乘法&#xff0c;或者说是一系列数字的乘积。累乘的概念非常简单&#xff0c;但是实际上它在编程中有着广泛的应用。 累乘在Python中的实现方式 Python中&#xff0c;累乘可以通过多种方式来实现&…

25条关于人生感悟的经典句子

1.活得糊涂的人&#xff0c;容易幸福&#xff1b;活得清醒的人&#xff0c;容易烦恼。这是因为&#xff0c;清醒的人看得太真切&#xff0c;一较真&#xff0c;生活中便烦恼遍地&#xff1b;而糊涂的人&#xff0c;计较得少&#xff0c;虽然活得简单粗糙&#xff0c;却因此觅得…

佛家经典禅语语录句子

【1】&#xff1a;在天地之间觅得一方安详&#xff0c;听风雨&#xff0c;听山语&#xff0c;听禅语。 【2】&#xff1a;心是一方砚&#xff0c;不空亦不满。眼是一片天&#xff0c;不奢亦不贪。字是一盘餐&#xff0c;不腻亦不淡。深邃梅婷花向晚&#xff0c;零落幻影墨里寒。…

知足常乐--每日十问

如果你想走出常规&#xff0c;放松心情&#xff0c;以积极的的心态开始新的一天&#xff0c;那就很有必要以自问的方式开始一天&#xff0c;这些问题会给我们带来力量和好心情. 1、我拥有什么&#xff1f; 通常我们会为自己没有的东西而苦恼&#xff0c;却看不到自己拥有的&…

chatgpt赋能python:Python中的“5“+“5“:了解运算符重载和字符串拼接

Python中的 “5”“5”: 了解运算符重载和字符串拼接 Python中的运算符重载允许我们自定义类型的操作符行为。当我们使用加号运算符将两个对象相加时&#xff0c;Python会动态地确定该使用哪种类型的操作符行为。在使用字符串时&#xff0c;加号可以用于字符串的连接&#xff…

chatgpt赋能python:Python中的提取函数——数据清洗中必不可少的利器

Python中的提取函数——数据清洗中必不可少的利器 数据清洗是数据分析过程中不可或缺的一步&#xff0c;而Python中的提取函数则是数据清洗中必不可少的利器。本文将重点介绍一些Python中常用的提取函数&#xff0c;以帮助数据分析师更好地应对实际问题。 什么是提取函数&…

chatgpt赋能python:Python中的“或”语句:使用方法和示例

Python中的“或”语句&#xff1a;使用方法和示例 在Python编程中&#xff0c;“或"语句表示为"or”&#xff0c;它是逻辑运算符的一种形式。"或"语句可以用于组合两个或多个条件&#xff0c;只要其中一个条件成立&#xff0c;整个语句就会返回True。在本…