本文不构成任何技术操作指导或建议,仅供技术交流与学习参考。如发现本文内容存在可能违反法律规定的情况,请立即联系本人删除相关内容。(已对图片中出现的包名和应用名进行处理)

观察

正常打开这个 apk,就能看到会有启动广告,我们可以看到启动过程的调用栈,首先启动的就是 SplashActivity。那清理广告的思路就是替换程序入口。

screen1.png

修改MainActivity.xml文件

首先自然是解包(解包和解压不一样哦)

apktool d base.apk -o output

接下来修改清单文件:

Pastedimage20250513194604.png


把这个 Activity 统统注释掉。
然后把 MainActivity 设置为入口:

Pastedimage20250513194805.png
        <activity android:configChanges="screenLayout|screenSize" android:exported="true" android:name="com.xxxx.xxxx.MainActivity" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan|stateHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>    
        </activity>

接着就可以重新打包了。
签名:

keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore

 jarsigner -verbose -keystore demo.keystore base1.apk demo.keystore
Pastedimage20250513195215.png


然后重新安装上,but:

screen.png

排查检测点

可以看到,我们的篡改行为被识别出来了,但是好在观察到了启动过程的调用栈
启动 MainActivity 之后跳转到了 CheckDialog 方法,那我们就在 jadx 中找到这个方法,但是审计之后,发现这只是一个很普通的日志弹窗的方法,那我们接着查看调用栈,发现有个叫 signcheck 的类在调用此方法,而 MainActivity 就是调用了这个检测类。

Pastedimage20250513201557.png
Pastedimage20250513202045.png


调用栈:
MainActivity->signcheck->Checkdialog

Pastedimage20250513122410.png


既然是采用 Java 层方法来检测重打包,那就好办了

绕过检测点

1.frida 绕过检测
脚本:

Java.perform(
        function(){
            let SignCheck = Java.use("com.xxxx.xxxx(包名).utils.SignCheck");
            SignCheck["check"].overload('android.app.Activity').implementation = function (activity) {
            return true;
        };
    })

2. 修改 smali
定位 ~\output\smali\com\xxxx\xxxx\MainActivity.smali

Pastedimage20250514171233.png


给它删咯,再打包。
这样就行了。
3. 其他思路

Pastedimage20250513225056.png


如果继续深扒,signcheck.check 调用的是 SignCheckUtil.check(),而 SignCheckUtil.check() 中有字符串 b,b 就是源文件的 SHA1,可以想办法把这串字符改成修改过后 APK 哈希值