一、概述
我之前接手了一个项目,刚入职几天就发现应用商场上有一个几乎一样的应用,功能基本一致,唯一不一样的就是启动页面之前加了广告。之后我就对apk混淆加固处理,完美的规避了这个问题。接下来聊聊他们是怎么破解我们的apk,并且在上面添加广告的!
二、工具
几个重要的工具,注意使用最新版本。
Apktool:https://ibotpeaches.github.io/Apktool/
JD-GUI:http://jd.benow.ca/
dex2jar:https://sourceforge.net/projects/dex2jar/
apktools:主要用户反编译和打包;
JD-GUI :主要用于对.class文件展示为源码(比如jar文件)
dex2jar : 主要用于将dex文件转化为jar文件
大家尽可能的下载最新版本,因为出新版本是有一定的原因的。
三、不用资源文件的插入页面
1.首先需要准备一个需要重新打包的Apk,代码如下:
package com.stormful.android.testrepackage;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是原本的App主页"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2.再准备一个假想的广告页面;需要新建一个工程,包名和原始的apk是一致的。
/**
* @description 需要插入的页面
* @author: dzh
* @CreateDate: ${DATE} ${TIME}
*/
public class ADActivity extends AppCompatActivity {
private Handler mHandler = new Handler(Looper.getMainLooper());
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler.postDelayed(mCallback, 3000);
}
private Runnable mCallback = new Runnable() {
@Override
public void run() {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.stormful.android.testrepackage",
"com.stormful.android.testrepackage.MainActivity"));
startActivity(intent);
}
};
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacks(mCallback);
}
}
3.反编译上面两个Apk文件。
apktool d origin.apk //反编译原始的apk
apktool d ad.apk //反编译广告apk
原始反编译后的原始apk信息展示:
image.png
反编译后广告apk的信息展示:
image.png
4.把广告生成的两个smail文件放到原始apk里面:
image.png5.修改原始apk清单文件,把启动的改为广告的页面,当广告页面展示完再跳转到原始app的页面:
image.png6.重新打包原始apk:
apktool b origin -o origin_new.apk //重新打包命名为origin_new.apk
image.png
7.对打包成功的apk进行重新签名:
image.png8.当签名成功之后就可以安装apk了!!!
四、处理广告页面有xml文件的处理方式:
1.重需改广告apk的源代码,并加上activity_ad.xml,代码如下:
public class ADActivity extends AppCompatActivity {
private Handler mHandler = new Handler(Looper.getMainLooper());
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ad);
mHandler.postDelayed(mCallback, 3000);
}
private Runnable mCallback = new Runnable() {
@Override
public void run() {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.stormful.android.testrepackage",
"com.stormful.android.testrepackage.MainActivity"));
startActivity(intent);
}
};
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacks(mCallback);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="i am ad!!!!!" />
</LinearLayout>
2.反编译有xml的广告apk:
image.png3.把布局文件拷到工程:
image.png4.添加布局ID:
image.png5.修改广告页面的布局ID即可:
image.png6.之后需要跟方式一一样的打包、签名就ok了!
五、总结
我是对smail语言不了解,才使用创建一个工程,让其生成smail源码再做简单修改的方式实现的。如果你是大牛,你可以直接操作smail源码实现你想要的效果。还有就是怎么签名的细节,我就不再描述了,可以自行学习!
网友评论