李跳跳使用、逆向、脱壳和原理介绍

news2024/12/23 4:47:28
加我拉你入群黑糖安全公众号

前言

你可以独善其身 但你不能兼济天下

简介

其实这部分是使用教程,github上面有备份的下载链接,只是可能不更新了,V2.2安装之后
100a1565ff1581ce70cfe9290ab015d.jpg
一把快刀,很简洁的界面
6105fa532260202636383961fc9538c.jpg
点击界面里面的开启按钮即可,我这里就是在无障碍里面设置了
9c72d6b41ab06a6033cf82cb5815f15.jpg
现在打开淘宝京东之后就只会看到一闪而过或者没有开屏广告的情况了

反编译

转成jar
image.png
代码如下
image.png
解压APK之后目录为
image.png
蒽…还有lib库和kotlin文件,怎么还有JNI编程啊~
res文件夹里面的文件直接乱成一堆了,反编译问题
image.png
考虑换一个工具来修复静态文件 apktool
image.png
然后就得到了正常的 res,终于整洁了一点orz
image.png
源代码的话还是看从 jd-gui 解析出来的吧 各部分比较完整
结果发现进行了加固,其实我之前是没有脱加固APK的经验的,为啥发现了加固 是因为我把代码放到自己的Android工程之后看了半天没看懂,感觉就是实现了一个类加载器
image.png
主工程代码就只是去继承 WrapperProxyApplication 抽象类,给我整不会了,我以为这是什么高端写法
主工程还原为

public class MyWrapperProxyApplication extends WrapperProxyApplication {
    protected void initProxyApplication(Context paramContext) {
        String str = (paramContext.getApplicationInfo()).sourceDir;
        ZipFile zipFile = null;
        try {
            ZipFile zipFile1 = new ZipFile(str);
            zipFile = zipFile1;
        } catch (IOException iOException) {
            iOException.printStackTrace();
        }
        if (zipFile == null) {
            Process.killProcess(Process.myPid());
            System.exit(0);
        }
        Util.PrepareSecurefiles(paramContext, zipFile);
        try {
            zipFile.close();
        } catch (IOException iOException) {
            iOException.printStackTrace();
        }
        System.loadLibrary(Util.libname);
    }

    public void onCreate() {
        super.onCreate();
    }
}

然后我觉得这个类加载器可能是一个公用库 结果就
image.png
原来是腾讯的,还是逆向APK的经验太少了orz
为什么李跳跳要加壳,应该也是为了防止应用商店或者手机厂商那批人通过特征检测到APK然后报毒
为了防止我自己看错 用工具检测一下 结果PKID居然检测不出来,额
image.png
打开MT管理器

可以看到确实腾讯御安全

判断加壳

手动判断是腾讯御安全加壳的特征有三种方式

step1

将APK解压缩
image.png

step2 特征一

根目录下存在 tencent_stub 文件
image.png

step3 特征二

assets目录存在

  • 0OO00l111l1l
  • o0oooOO0ooOo.dat
  • t86
  • tosversion

image.png

step4 特征三

lib文件夹下存在

  • libshell-super.2019.so
  • libshella-x.so (x代表版本)

image.png

MT脱壳

查了一下资料怎么都需要用MT管理器~
MT管理器使用文档

https://mt2.cn/guide/

adb 安装到测试机上面
image.png
运行之
image.png
接下来安装李跳跳
image.png
在MT管理器里面安装包提取寻找李跳跳
image.png
可以看到确实是使用腾讯御安全进行加壳的
image.png
点击dex选择dex++
image.png
找到这个东西
image.png
复制包名
image.png
粘贴到 AndroidManifest.xml 里面,保存
用blackdex脱dex的壳
image.png
然后到MT管理器 ,右边是已脱的
image.png
删除左边的classes.dex,把右边的移过去,然后保存
已经实现了脱壳
image.png
最后安装不上 orz ,流泪了
image.png
难道是我工具用的有问题~

frida

只好掏出大杀器 frida 了

frida是平台原生app的Greasemonkey,说的专业一点,就是一种动态插桩工具,可以插入一些代码到原生app的内存空间去,(动态地监视和修改其行为),这些原生平台可以是Win、Mac、Linux、Android或者iOS。而且frida还是开源的

Frida官网:https://www.frida.re/
Frida源码:https://github.com/frida

安装frida

windows安装客户端

pip3 install frida

image.png

安装frida-tools

pip3 install frida-tools

image.png
安装 frida-dexdump

pip3 install frida-dexdump

安装成功

frida --version

image.png

安卓安装frida服务端

查看Android手机的cpu架构

adb shell getprop ro.product.cpu.abi

image.png
根据CPU版本下载对应的Frida server https://github.com/frida/frida/releases
image.png
下载解压推到手机目录下
image.png
设置端口转发

adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043

image.png
设置权限并运行

chmod 777 frida-server64
./frida-server64

image.png
出现报错

./frida-server64

{“type”:“error”,“description”:“Error: invalid address”,“stack”:“Error: invalid address\n at Object.value [as patchCode] (frida/runtime/core.js:207:1)\n at ln (frida/node_modules/frida-java-bridge/lib/android.js:1209:1)\n at pn.activate (frida/node_modules/frida-java-bridge/lib/android.js:1275:1)\n at mn.replace (frida/node_modules/frida-java-bridge/lib/android.js:1323:1)\n at Function.set [as implementation] (frida/node_modules/frida-java-bridge/lib/class-factory.js:1185:1)\n at Function.set [as implementation] (frida/node_modules/frida-java-bridge/lib/class-factory.js:1099:1)\n at installLaunchTimeoutRemovalInstrumentation (/internal-agent.js:424:24)\n at init (/internal-agent.js:51:3)\n at c.perform (frida/node_modules/frida-java-bridge/lib/vm.js:12:1)\n at _performPendingVmOps (frida/node_modules/frida-java-bridge/index.js:250:1)”,“fileName”:“frida/runtime/core.js”,“lineNumber”:207,“columnNumber”:1}

查看当前是否关闭了SELINUX

getenforce

确实开着的
image.png

setenforce 0

关闭selinux,运行frida-server
然后重新打开一个shell查看是否存在
image.png
运行成功

frida升级

pip3 install -U frida
pip3 install -U frida-tools

frida脱壳

手机上打开需要脱壳的软件
image.png
adb shell启动frida-server
image.png
如果你跟我一样配置了python script的环境变量,那就可以直接在命令行启动frida-dexdump
image.png
输入命令 frida-dexdump -FU,如下图(参数说明,参数 U 是usb,参数 F是前台活动app)
image.png
得到脱壳的dex文件
image.png
检查之后发现是classes.dex为源dex文件

还原APK

脱壳之后对APK进行还原
用baksmali工具,把dex转换成smali

java -jar baksmali.jar d classes.dex

image.png
用 apktool d ./com.xxx.mobile.apk,反编译,得到加固的apk解压包
image.png
替换 smali 文件夹,用前面的 smali 文件夹替换掉 解压包中的 smali,替换
image.png
打开原文件的dex,找到com/wrapper/proxyapplication/WrapperProxyApplication
进去复制入口后到AndroidManifest.xml中替换入口
这里是原本的AndroidManifest.xml
image.png
入口我直接用MT管理器看吧
image.png
我们需要替换成 hello.litiaotiao.app.LttApp
image.png
然后删除腾讯加固的相关文件,一般在assets、lib目录下
也就是我们前面说的那些特征

  • tencent_stub
  • tosversion
  • 0OO00l111l1l
  • o0oooOO0ooOo
  • 文件名带有shell的

用 apktool b com.xxx.mobile 编译apk
最后就是使用AndroidKiller进行重打包
image.png
打包完成进行安装即可
结果还是安装不了
image.png
菜是原罪~

原理

利用安卓系统的无障碍权限,帮助用户自动点击广告上的跳过按钮

关于无障碍服务

AccessibilityService(无障碍服务)是 Android 操作系统中的一个功能,旨在帮助用户具有视觉、听觉或运动上的障碍更轻松地使用设备。它是 Android 提供的一种特殊服务,可以接收设备上发生的各种事件,并提供自定义的反馈或处理方式。

AccessibilityService 可以在用户界面上监控和操作应用程序,并为用户提供额外的辅助功能。它可以接收系统级别的事件,如按键、触摸、通知等,还可以访问应用程序的视图层次结构,以便分析和操作应用程序的界面元素

李跳跳的广告跳过包含了两个部分

  • 开屏广告跳过
  • 应用内弹窗跳过

开屏广告跳过

有一个简单的规则 也就是字符串 跳过
逆向李跳跳的源代码查看规则
hashSet里面存储了一些关键字
image.png
另外还有在文件内部的 2131755075 位置 ,转成十六进制是 7F100043
image.png
可以看出这里的hashSet里面装的就是开屏跳过的关键字
image.png
但是这里有两个是从文件读取的,转换一下可以在public.xml里面找到
image.png
在李跳跳掘金的主页中可以找到答案
image.png
所以这里是用户自己导入的规则,这里我们直接把这几个跳过的关键字都加到我们的逻辑里面,以后遇到了其他的再处理
翻翻xml文件里面还发现有一个白名单列表
image.png
应该是为了节省内存进行了一次包名判断
所以对于开屏广告的检测核心是

@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
    onAccessibilityEventPre();
    AccessibilityNodeInfo source = accessibilityEvent.getSource();
    if (source == null)
        return;

    // 判断是否开启了检测
    if (!mMKV.decodeBool(SWITCHMAIN_KEY))
        return;

    CharSequence packageName = accessibilityEvent.getPackageName();
    if (packageName == null)
        return ;
    String currentPackageName = packageName.toString();

    // 读取白名单数组
    String[] whiteListArray = getResources().getStringArray(R.array.whitelist);
    List<String> whiteList = Arrays.asList(whiteListArray);

    if (whiteList.contains(currentPackageName)) {
        return; // 如果是白名单内的包名,则不执行后续的检测逻辑
    }

    for (int i = 0; i < source.getChildCount(); i++) {
        AccessibilityNodeInfo childNode = source.getChild(i);
        if (childNode.getText() == null) {
            continue;
        }

        String text = childNode.getText().toString();

        for (String keyword : keywords) {
            if (text.contains(keyword)) {
                Log.i(TAG, "检测到开屏广告关键字:" + keyword);
                childNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                Toast.makeText(this, SKIP_PROMPT, Toast.LENGTH_LONG).show();
                break;
            }
        }
    }
}

往 AndroidManifest(清单文件)上配置:

<service android:exported="false" android:label="♥张得乖1.0" android:name="hello.beautifulz.app.ZdgService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService"/>
    </intent-filter>
    <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibility_service_config"/>
</service>

label是这个无障碍服务的名称
serviceconfig 配置文件如下

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service android:description="@string/accessibility_service_description" android:settingsActivity="hello.beautifulz.app.MainActivity" android:accessibilityEventTypes="typeAllMask" android:accessibilityFeedbackType="feedbackGeneric" android:notificationTimeout="100" android:accessibilityFlags="flagDefault" android:canRetrieveWindowContent="true" android:canPerformGestures="true" android:isAccessibilityTool="true"
  xmlns:android="http://schemas.android.com/apk/res/android" />

应用内弹窗跳过

第二种是应用内的弹窗规则
image.png
关于这一点在 https://github.com/Snoopy1866/LiTiaotiao-Custom-Rules 上面有相关规则
image.png
跳过应用内的弹窗需要自己编写解析规则的框架,类似于下面这种

public class MyAccessibilityService extends AccessibilityService {

    @Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
        // 获取弹窗内容
        CharSequence popupContent = accessibilityEvent.getText();
        if (popupContent != null) {
            String popupText = popupContent.toString();

            // 调用规则匹配函数
            boolean matched = checkPopupRules(popupText);

            if (matched) {
                // 执行关闭弹窗的操作,例如执行返回键动作
                performGlobalAction(GLOBAL_ACTION_BACK);
            }
        }
    }

    private boolean checkPopupRules(String popupText) {
        // 将规则字符串解析为规则对象,可以使用 JSON 或其他格式进行解析
        // 这里假设规则已经解析为 Rule 对象

        Rule rule = new Rule("+检测到&-用户体验", "=以后再说");

        // 进行规则匹配判断
        if (popupText.startsWith(rule.getKeywordStart()) &&
            popupText.endsWith(rule.getKeywordEnd())) {
            if (rule.getAction().equals("=以后再说")) {
                return true;
            }
        }

        return false;
    }

    // 其他回调方法...

}

这个暂时作为保留节目吧~

后台保活

APP的后台保活是一门智慧~为了让APP一直在后台运行来跳过广告,我们需要让它不被系统杀死
无障碍服务本身权限就很大,借助无障碍服务我们来实现强力保活,可以从以下几个方向入手:

  • 前台服务保活
  • 申请REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 忽略电池优化开关
  • 开启自启动无障碍服务

这里就不再详细说明了

效果

最后实现的小demo可以说是李跳跳的闺蜜了
image.png
把里面的很多地方都裁剪了,只留下了开启广告跳过的按钮
image.png
这个时候再打开知乎就可以看到有跳过效果了

参考链接

  • https://mp.weixin.qq.com/s/MvpIvmQtha0glvvcApZqsA
  • https://www.cnblogs.com/gezifeiyang/p/16229721.html
  • https://www.52pojie.cn/thread-1453091-1-1.html
  • https://www.freebuf.com/articles/system/190565.html
  • https://www.cnblogs.com/gezifeiyang/p/16207042.html
  • https://www.jianshu.com/p/c349471bdef7
  • https://juejin.cn/post/6938590373740544007
  • https://www.bilibili.com/read/cv12200073/
  • https://www.bilibili.com/read/cv11826368/
  • 还有很多其他的资料

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

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

相关文章

YOLOV7改进-对小目标有提点的Omni-Dimensional Dynamic Convolution

ODConv 比普通卷积时间长&#xff0c;对小目标也有作用 1、models下建立文件&#xff0c;复制进来 2、yolo.py文件下导入模块&#xff0c;下面添加解析函数 3、改下面的1->2&#xff0c;不改会报错 4、修改配置文件&#xff0c;改网络模型&#xff0c;conv->ODConv2d 5…

​怎么安全无损地将操作系统转移到固态硬盘?

为什么需要转移系统到固态硬盘&#xff1f; 现如今&#xff0c;许多用户想要将自己的操作系统转移到固态硬盘&#xff0c;这是为什么呢&#xff1f;我们在下面向大家简单地介绍了一下迁移系统的优势&#xff1a; ​提升计算机性能&#xff1a;硬盘&#xff08;HDD…

VM安装RedHat7虚机ens33网络不显示IP问题解决

1、今天在VMware中安装RedHat7.4虚拟机&#xff0c;网络连接使用的是 NAT 连接方式&#xff0c;刚开始安装成功之后输入ifconfig 还能看到ens33自动分配的IP地址&#xff0c;但是当虚机关机重启后&#xff0c;再查看IP发现原来的ens33网络已经没有了&#xff0c;只变成了这两个…

Excel周报制作

Excel周报制作 文章目录 Excel周报制作一、理解数据二、数据透视表三、常用函数1.sum-求和2.sumif-单条件求和3.sumifs-多条件求和4.sum和subtotal的区别5.if函数6.if嵌套7.vlookup函数和数据透视表聚合8.index和match函数 四、周报开发五、报表总览 一、理解数据 这是一个线上…

内存泄露排查思路

1、泄露情况 启动闪退运行一段时间宕机 2、排查步骤 获取堆内存快照dump使用VisualVM分析dump文件通过查看堆信息的情况&#xff0c;定位内存溢出问题 jmap -dump:formatb,fileheap.hprof pid -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath输出路径 3、在VisualVM中分…

公网访问群辉相册Synology Photos ,快速搭建群辉相册同时远程访问【无公网IP内网穿透】

文章目录 前言本教程解决的问题是&#xff1a;按照本教程操作完成能够达到的效果是&#xff1a;1.在群辉中下载并安装Synology Photos套件2.设置共享文件夹3.添加您想共享的照片4.cpolar搭建隧道5.公网ip地址访问您的分享相册6.移动端app使用公网上传照片并及时分享 前言 很多…

Linux学习之基础工具一

1.Linux 软件包管理器 yum 首先我们需要知道的是在Linux下&#xff0c;现存的软件和指令是一定的&#xff0c;而有的时候我们想需要更多的指令或者软件&#xff0c;而这在Linux本身下是没有的&#xff0c;故我们可以利用指令yum指令安装或卸载你想要或者不需要的软件&#xff…

【Java基础篇 | 面向对象】—— 封装详解

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、封装1.1什么是封装…

无涯教程-JavaScript - IMCONJUGATE函数

描述 IMCONJUGATE函数以x yi或x yj文本格式返回复数的复共轭。 语法 IMCONJUGATE (inumber)争论 Argument描述Required/OptionalInumberA complex number for which you want the conjugate.Required Notes 使用COMPLEX将实系数和虚系数转换为复数。 复数的共轭是- $$…

数字自我主权的起点,DID 如何为下一代网络居民提供身份入口?

随着 Web3 浪潮逐渐影响社交、文化、娱乐行业&#xff0c;现存的数字身份模式已无法满足未来的网络世界&#xff0c;DID&#xff08;去中心化身份&#xff09;以超越 Web2 身份验证体系的高度去中心化、开放自由度等属性引来了行业人士的关注与讨论。然而&#xff0c;在 DID 领…

成都睿趣科技:抖音开店初期要注意什么

随着社交媒体和短视频平台的崛起&#xff0c;抖音已经成为了一个风靡全球的短视频应用&#xff0c;拥有着庞大的用户群体。因此&#xff0c;越来越多的创业者开始在抖音上开设自己的线上店铺&#xff0c;希望借助这个平台赚取丰厚的利润。然而&#xff0c;在抖音开店初期&#…

ARMv8 TTBRx寄存器

ARMv8 TTBRx寄存器 1 TTBR0_ELx and TTBR1_ELx2 TTBR0_ELx2.1 TTBR0_EL12.2 TTBR0_EL22.3 TTBR0_EL33 TTBR13.1 TTBR1_EL13.2 TTBR1_EL2 4 访问TTBRx寄存器4.1 TTBR0_ELx4.2 TTBR1_ELx 5 TTBRx保留的是物理地址还是虚拟地址5.1 保存的是物理地址还是虚拟地址5.2 为什么是物理地…

Redisson分布式锁实战

实战来源 此问题基于电商 这周遇见这么一个问题&#xff0c;简略的说一下 由MQ发布了两个消息&#xff0c;一个是订单新增&#xff0c;一个是订单状态变更 由于直接付款之后&#xff0c;这两个消息的发布时间不分先后&#xff0c;可能会造成两种情况&#xff0c;1、订单状态变更…

N5235B是德科技网络分析仪50GHz

181/2461/8938对无源元器件和简单的有源器件执行基本分析 适用于对成本非常敏感的应用&#xff0c;可以在高达 50 GHz 的频率范围内精确测量 S 参数 具有出色的性价比&#xff0c;可用于微波器件制造测试 可以配置经济型解决方案&#xff0c;用于信号完整性测量和材料表征 …

【python自动化】七月PytestAutoApi开源框架学习笔记(一)

前言 本篇内容为学习七月大佬开源框架PytestAutoApi记录的相关知识点&#xff0c;供大家学习探讨 项目地址&#xff1a;https://gitee.com/yu_xiao_qi/pytest-auto-api2 阅读本文前&#xff0c;请先对该框架有一个整体学习&#xff0c;请认真阅读作者的README.md文件。 本文…

ChatGPT AIGC 完成Excel条件求和函数

有一个明细表如下: 现在要根据日期来对销量进行求和。数据量大约200多条。 要写出Excel函数公式可以交给ChatGPT来操作。 公式直接就生成好了, 公众号:BI智能数据分析 =SUMIF($D$2:$D$100,G2,$E$2:$E$100) 然后我们将公式复制到表格中来进行验证。 因为ChatGPT在生成公式…

mac版微信小程序反编译学习

更新时间&#xff1a;2023年07月20日16:57:52 mac版本的微信小程序是没有做加密的&#xff0c;可以直接反编译 反编译的工具是适用于mac和Windows的&#xff0c;其实Windows还有其他更好用的工具。 本文是针对mac下使用微信的小程序进行解密&#xff0c;版本为3.8.1。 小程…

降低银行客户获取成本 (CAC) 的 3 种方法

银行的运营环境以及客户与银行服务互动的方式经历了深刻而彻底的变化。因此&#xff0c;银行业用于获取客户的方法必须经历平行演变。 传统上&#xff0c;客户根据利率和提供的服务范围来决定银行。然而&#xff0c;今天的客户期望更多。他们不仅需要有竞争力的价格和多样化的…

燃料电池FCU开发技术方案

燃料电池FCU电控开发介绍 FCU作为新能源汽车核心部件&#xff0c;对于氢燃料电池&#xff0c;追求的指标有&#xff1a;能量密度、额定功率、最大峰值功率&#xff08;保持有限时间&#xff09;、最小稳定功率&#xff08;小于该功率&#xff0c;功率输出波动大&#xff0c;长…

九号滑板车F2 Pro采用全新折叠设计,为用户带来便捷使用体验

拥挤的城市中&#xff0c;滑板车可以作为一种快速、便捷的交通工具&#xff0c;帮助你避开交通堵塞。而且滑板车轻便&#xff0c;容易携带&#xff0c;你可以将它放在车上、公共汽车上、火车上&#xff0c;甚至在办公室或学校里使用。今天就带大家了解一款适合城市通勤骑行的车…