gpt4 book ai didi

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

转载 作者:我是一只小鸟 更新时间:2023-09-07 22:52:06 41 4
gpt4 key购买 nike

前言

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

简介

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

反编译

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

                        
                      

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

判断加壳

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

step1

将APK解压缩 。

step2 特征一

根目录下存在 tencent_stub 文件 。

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

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 。

安装 frida-dexdump 。

pip3 install frida-dexdump 。

安装成功 。

frida --version 。

image.png

安卓安装frida服务端

查看Android手机的cpu架构 。

adb shell getprop ro.product.cpu.abi 。

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

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

设置权限并运行 。

chmod 777 frida-server64 ./frida-server64 。

出现报错 。

./frida-server64 。

查看当前是否关闭了SELINUX 。

getenforce 。

确实开着的 。

setenforce 0 。

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

frida升级

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

                        
                      

frida脱壳

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

还原APK

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

java -jar baksmali.jar d classes.dex 。

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

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

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

原理

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

关于无障碍服务 。

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

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

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

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

开屏广告跳过

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

                        
                          @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" />

                        
                      

应用内弹窗跳过

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

                        
                          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可以说是李跳跳的闺蜜了 把里面的很多地方都裁剪了,只留下了开启广告跳过的按钮 这个时候再打开知乎就可以看到有跳过效果了 。

参考链接

  • 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/
  • 还有很多其他的资料

END

建了一个微信的安全交流群,欢迎添加我微信备注 进群 ,一起来聊天吹水哇,以及一个会发布安全相关内容的公众号,欢迎关注 😃 。

加我拉你入群 黑糖安全公众号

最后此篇关于李跳跳使用、逆向、脱壳和原理介绍的文章就讲到这里了,如果你想了解更多关于李跳跳使用、逆向、脱壳和原理介绍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com