Android Google马甲包处理

这篇具有很好参考价值的文章主要介绍了Android Google马甲包处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这是整理其他人的plugin代码,最后有亮点,耐心看下吧

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'xml-class-guard'
//    id 'AndResGuard'
//    id 'com.bytedance.android.aabResGuard'
//    id 'stringfog'
    id 'android-junk-code'
//    id 'kotlin-android-extensions'
}

gradle文件增加以下代码

/**
 * 第一步执行这个操作,先生成字典,混淆用
 * https://blog.csdn.net/nnmmbb/article/details/129492332
 */
/*** 生成字典Task*/
task geneDictTask {
    doFirst {
        def dictPath = rootDir.getAbsolutePath() + '/app/dict.txt'
        def random = new Random()
        def lowercase = "abcdefghijklmnopqrstuvwxyz"
        def wordList = new HashSet()
        for (int i = 0; i < 1000; i++) {
            def word = new StringBuilder()
            def wordLength = random.nextInt(5) + 4
            for (int j = 0; j < wordLength; j++) {
                word.append(lowercase.charAt(random.nextInt(lowercase.length())))
            }
            wordList.add(word.toString())
        }
        def f = new File(dictPath)
        f.getParentFile().mkdirs()
        f.withWriter("UTF-8") { it.write(wordList.join(System.lineSeparator())) }
    }
}

///批量修改文件名
ext {
    //需要批量重命名的Been路径
    renameBeenPath = "src/main/java/com/mosen/xxx/huawei"
    //如果有productFlavors 就多次执行下
    renameResPath = "src/main/res"
}

/**
 * 第二步修改名字,不然修改包名就不好在改了
 *
 * */
task renameBeenProcesser {
    doLast {
        FileTree beenTree = fileTree(renameBeenPath) {
            include '**/*.java'
            include '**/*.kt'
        }
        def start = System.currentTimeMillis()
        println(">>>>>> renameBeenProcesser start")
        beenTree.each { File beenFile ->
            //println(beenFile.path + " Processing...")
            def sname = beenFile.name
            def fileEx = sname.substring(sname.lastIndexOf("."))
            sname = sname.replace(fileEx, "")

            if (sname == "PrintStream" || sname == "StringFog") {
                return
            }
            def tName = ""
            def random = new Random()

            def lowercase = "abcdefghijklmnopqrstuvwxyz"
            def word = new StringBuilder()
            def wordLength = random.nextInt(5) + 4
            for (int j = 0; j < wordLength; j++) {
                word.append(lowercase.charAt(random.nextInt(lowercase.length())))
            }
            tName = word.toString() + random.nextInt(999)
            beenFile.renameTo(beenFile.parentFile.path + File.separator + tName + fileEx)
            //生成一个文件树,替换import后面的路径
            FileTree processTree = fileTree("src") {
                include '**/*.java'
                include '**/*.kt'
                include '**/layout/*.xml'
                include '**/AndroidManifest.xml'
            }
            processTree.each { File f ->
                ImportBeenReplacer(f.path, sname, tName)
            }
        }
        def cost = (System.currentTimeMillis() - start) / 1000
        println(">>>>>> renameBeenProcesser end(cost:${cost}s)")
    }
}


/**
 * 修改layout,不支持viewbinding和databinding,我谁知道怎么改,有人可以告诉吗
 *
 * */
task renameLayoutProcesser {
    doLast {
        FileTree beenTree = fileTree(renameResPath) {
            include '**/layout/*.xml'
        }
        def start = System.currentTimeMillis()
        println(">>>>>> renameBeenProcesser start")
        beenTree.each { File beenFile ->
            //println(beenFile.path + " Processing...")
            def sname = beenFile.name
            def fileEx = sname.substring(sname.lastIndexOf("."))
            sname = sname.replace(fileEx, "")
            def tName = ""
            def random = new Random()

            def lowercase = "abcdefghijklmnopqrstuvwxyz"
            def word = new StringBuilder()
            def wordLength = random.nextInt(5) + 4
            for (int j = 0; j < wordLength; j++) {
                word.append(lowercase.charAt(random.nextInt(lowercase.length())))
            }
            tName = word.toString() + random.nextInt(999)
            beenFile.renameTo(beenFile.parentFile.path + File.separator + tName + fileEx)
            //生成一个文件树,替换import后面的路径
            FileTree processTree = fileTree("src") {
                include '**/*.java'
                include '**/*.kt'
                include '**/layout/*.xml'
                include '**/AndroidManifest.xml'
            }
            processTree.each { File f ->
                ImportResReplacer(f.path, sname, tName)
            }
        }
        def cost = (System.currentTimeMillis() - start) / 1000
        println(">>>>>> renameBeenProcesser end(cost:${cost}s)")
    }
}

/***
 * 第三步,执行 先执行移动目录在修改包名
 * //以下均为非必须
 */
xmlClassGuard {
    /*
     * 是否查找约束布局的constraint_referenced_ids属性的值,并添加到AabResGuard的白名单中,
     * 是的话,要求你在XmlClassGuard前依赖AabResGuard插件,默认false
     */
    findAabConstraintReferencedIds = false

    /*
     * 是否查找约束布局的constraint_referenced_ids属性的值,并添加到AndResGuard的白名单中,
     * 是的话,要求你在XmlClassGuard前依赖AndResGuard插件,默认false
     */
    findAndConstraintReferencedIds = false
    //用于增量混淆的 mapping 文件
    mappingFile = file("xml-class-mapping.txt")
    //更改manifest文件的package属性,即包名
    packageChange = ["com.mosen.xxx.huawei": "com.mosen.target.huawei"]
    //移动目录
    moveDir = ["com.mosen.xxx.huawei": "com.mosen.target.huawei"]
}


// 导入RandomKeyGenerator类,如果不使用RandomKeyGenerator,可以删除此行
import com.github.megatronking.stringfog.plugin.kg.RandomKeyGenerator

stringfog {
    // 必要:加解密库的实现类路径,需和上面配置的加解密算法库一致。
    implementation 'com.github.megatronking.stringfog.xor.StringFogImpl'
    // 可选:加密开关,默认开启。
    enable true
    // 可选:指定需加密的代码包路径,可配置多个,未指定将默认全部加密。
    fogPackages = ['com.mosen.xxx.huawei']
    // 可选(3.0版本新增):指定密钥生成器,默认使用长度8的随机密钥(每个字符串均有不同随机密钥),
    // 也可以指定一个固定的密钥:HardCodeKeyGenerator("This is a key")
    kg new RandomKeyGenerator()
    // 可选(4.0版本新增):用于控制字符串加密后在字节码中的存在形式, 默认为base64,
    // 也可以使用text或者bytes
    mode com.github.megatronking.stringfog.plugin.StringFogMode.bytes
    //应用的包名
    packageName = "com.mosen.xxx.huawei"
    //开启调试
    debug false
    //辣鸡代码类
    junkCodeClass = "com.mosen.xxx.huawei.PrintStream"
}

/**
 * 根据第三步定义的名字, 调整辣鸡代码的名字和混淆配置的名字
 * repackageclasses
 */
androidJunkCode {
    //com.mosen.target.huawei
    def config = {
        def random = new Random()
        packageBase = "com.mosen.xxx.huawei.ui"
        packageCount = random.nextInt(5) + 1
        activityCountPerPackage = random.nextInt(5) + 1
        excludeActivityJavaFile = false
        otherCountPerPackage = random.nextInt(1) + 1
        methodCountPerClass = 0
        def lowercase = "abcdefghijklmnopqrstuvwxyz"
        def word = new StringBuilder()
        def wordLength = random.nextInt(5) + 5
        for (int j = 0; j < wordLength; j++) {
            word.append(lowercase.charAt(random.nextInt(lowercase.length())))
        }
        resPrefix = word.toString() + "_"
        drawableCount = random.nextInt(1) + 1
        stringCount = random.nextInt(10) + 1
    }
    variantConfig {
        a1Debug config
        a1Release config
    }
}

//替换有导入目标been的文件内容
def ImportBeenReplacer(String filePath, sourceBeenName, targetBeenName) {
    if (sourceBeenName.equals("PrintStream") || sourceBeenName.equals("StringFog")) {
        return
    }
    def readerString = ""
    def hasReplace = false
    def xml = filePath.endsWith(".xml")
    file(filePath).withReader('UTF-8') { reader ->
        reader.eachLine { String it ->
            if (it.find(sourceBeenName)) {
                if (xml) {
                    //println("###$filePath: $sourceBeenName->$targetBeenName")
                    it = it.replaceAll("(?<![a-zA-Z0-9]+)(?<=[\\.]+)$sourceBeenName(?=[ \"\\./>]*)(?![a-zA-Z0-9]+)", targetBeenName)
                } else {
                    it = it.replaceAll("(?<![a-zA-Z0-9]+)(?<=[ \\.<:\\s\\,(]+)$sourceBeenName(?=[ \"\\.>\\?\\:\\(]*)(?![a-zA-Z0-9]+)", targetBeenName)
                }
                hasReplace = true
            }
            readerString <<= it
            readerString << '\n'
        }
    }
    if (hasReplace) {
        if (readerString.toString().endsWith("\n")) readerString = readerString.subSequence(0, readerString.length() - 1)
        //替换文件
        //println(filePath + " has replace been.")
        file(filePath).withWriter('UTF-8') {
            writer ->
                writer.append(readerString)
        }
    }
}
//替换有导入目标been的文件内容
def ImportResReplacer(String filePath, sourceBeenName, targetBeenName) {
    def readerString = ""
    def hasReplace = false
    def xml = filePath.endsWith(".xml")
    file(filePath).withReader('UTF-8') { reader ->
        reader.eachLine { String it ->
            if (it.find(sourceBeenName)) {
                if (xml) {
                    //println("###$filePath: $sourceBeenName->$targetBeenName")
                    it = it.replaceAll("/$sourceBeenName", "/$targetBeenName")
                } else {
                    it = it.replaceAll("(?<![a-zA-Z0-9]+)(?<=[ \\.<:\\s\\,(]+)$sourceBeenName(?=[ \"\\.>\\?\\:\\(]*)(?![a-zA-Z0-9]+)", targetBeenName)
                }
                hasReplace = true
            }
            readerString <<= it
            readerString << '\n'
        }
    }
    if (hasReplace) {
        if (readerString.toString().endsWith("\n")) readerString = readerString.subSequence(0, readerString.length() - 1)
        //替换文件
        //println(filePath + " has replace been.")
        file(filePath).withWriter('UTF-8') {
            writer ->
                writer.append(readerString)
        }
    }
}

root.gradle

buildscript {
    dependencies {
        //https://github.com/shwenzhang/AndResGuard
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.21'
        //https://github.com/bytedance/AabResGuard
        classpath "com.bytedance.android:aabresguard-plugin:0.1.0"

        classpath "com.github.liujingxing:XmlClassGuard:1.2.3"

        classpath 'com.github.megatronking.stringfog:gradle-plugin:5.0.0'
        // 选用加解密算法库,默认实现了xor算法,也可以使用自己的加解密库。
        classpath 'com.github.megatronking.stringfog:xor:5.0.0'

        //https://github.com/qq549631030/AndroidJunkCode
        classpath 'com.github.qq549631030:android-junk-code:1.2.5'
        //classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.5.3"
    }
}

在人家的基础上

1、我优化了名字的随机性

2、androidJunkCode这个感觉意义不到,基于asm我自己定义了一版逻辑

这是我处理后的结果,插入了很多无用代码在每个方法上

android 马甲包,android,开发语言,google

 3、stringfog优化支持了buildConfig的字符混淆文章来源地址https://www.toymoban.com/news/detail-723944.html

到了这里,关于Android Google马甲包处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Google Play发布android app

    本博文只是简单记录使用流程 操作时间是2023.1.12日,后续查看该博文,可能会发现因为Google Play Console版本升级带来操作使用上的差异 google play官方指导 https://support.google.com/googleplay/android-developer/answer/9859152?hl=zh-Hans] 浏览器登录google账户后,如果没有开发者账户,则需要注册开

    2024年02月05日
    浏览(50)
  • Google I/O大会:Android 13

    以 智能手机为场景核心 、 扩大智能终端的应用边界 以及实现 多设备间更好地协同 。具体到系统体验层,安卓13将 支持图标颜色随主题更换、为不同应用设定使用的语言、新的媒体中心界面等等 ,同时谷歌也推出了自家的钱包应用(Google Wallet)。 升级内容 谷歌优化了平板

    2024年01月19日
    浏览(38)
  • Android Google 开机向导定制 setup wizard

    采用 rro_overlays 机制来定制开机向导,定制文件如下: GmsSampleIntegrationOverlay$ tree . ├── Android.bp ├── AndroidManifest.xml └── res └── raw ├── wizard_script_common_flow.xml ├── wizard_script_customize_flow.xml └── wizard_script.xml Android.bp 在项目对应的.mk 文件添加编译引用 Andr

    2024年01月18日
    浏览(44)
  • [Android]模拟器登录Google Play失败

    模拟器登录Google Play失败,提示 couldn\\\'t sign in there was a problem communicating with google servers. try again later. 原因是模拟器没有连接到互联网,打开模拟器中Google浏览器进行搜索一样不行。 国内开发,要登录Google Play调试内购肯定是要合理上网的。 网络配置好之后,打开Android模拟器,

    2024年04月27日
    浏览(32)
  • Android Google登录并获取token(亲测有效)

    背景: Android 需要用到Google的登录授权,用去token给到服务器,服务器再通过token去获取用户信息,实现第三方登录。 我们通过登录之后的email来获取token,不需要server_clientId;如果用server_clientId还需要在google的控制台配置测试的账号,否则登录的时候会返回错误码10. 实现步骤

    2024年02月02日
    浏览(58)
  • com.google.android.material.tabs.TabLayout

        ViewPagerScrollAdapter 

    2024年02月21日
    浏览(50)
  • Android应用添加谷歌登录(Google Sign In)

    Android平台添加Google登录便于读取用户信息,也便于将应用发布到GooglePlay。 具体步骤如下,个人觉得还是比较繁琐的,一步一步来看吧。 服务账号创建项目 developers.google.com/workspace/g… 每个Google账号可以创建12个项目。 点击创建。 创建凭据 这里提示要先创建OAuth同意屏幕。

    2024年02月01日
    浏览(51)
  • Android Compose UI实战练手----Google Bloom欢迎页

    在之前的博客中,我已经介绍了Compose 的基础UI和布局组件,现在我们就利用这些基础UI和布局组件去做一个实战项目。Bloom是Google提供的一个假想产品,我们可以作为练手项目使用,这个产品的详细UI设计稿大家可以自行去百度下,个人决定这里主要是熟练去使用Compose UI,不

    2024年02月09日
    浏览(40)
  • Android 使用Google Map API;云计算概念IaaS,PaaS

    Infrastructure-as-a-Service(基础设施即服务) 第一层叫做IaaS,有时候也叫做Hardware-as-a-Service。 几年前如果你想在办公室或者公司的网站上运行一些企业应用,你需要去买服务器,或者别的高昂的硬件来控制本地应用,让你的业务运行起来。 但是现在有了IaaS,你可以将硬件外包

    2024年03月21日
    浏览(43)
  • Google推出Telecom Jetpack库,让Android通话应用创建更简单

    Telecom Jetpack库的最新Alpha版本已经推出。该库提供了多个API,以简化Android开发者创建语音和/或视频通话应用程序的过程,支持常见功能,例如接听/拒绝、音频路由等等。 https://developer.android.google.cn/jetpack/androidx/releases/core?hl=zh-cn#core-telecom_version_10_2 首先,新库会处理声明前台

    2024年01月22日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包