本文不构成任何技术操作指导或建议,仅供技术交流与学习参考。如发现本文内容存在可能违反法律规定的情况,请立即联系本人删除相关内容。(已对图片中出现的包名和应用名进行处理)
观察
正常打开这个 apk,就能看到会有启动广告,我们可以看到启动过程的调用栈,首先启动的就是 SplashActivity。那清理广告的思路就是替换程序入口。

修改MainActivity.xml文件
首先自然是解包(解包和解压不一样哦)
apktool d base.apk -o output
接下来修改清单文件:

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

<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

然后重新安装上,but:

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


调用栈:
MainActivity->signcheck->Checkdialog

既然是采用 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

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

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