Android-研究Apk重打包

2019-11-29  本文已影响0人  放羊娃华振

一、概述

我之前接手了一个项目,刚入职几天就发现应用商场上有一个几乎一样的应用,功能基本一致,唯一不一样的就是启动页面之前加了广告。之后我就对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.png
5.修改原始apk清单文件,把启动的改为广告的页面,当广告页面展示完再跳转到原始app的页面:
image.png
6.重新打包原始apk:
apktool b origin -o origin_new.apk //重新打包命名为origin_new.apk
image.png
7.对打包成功的apk进行重新签名:
image.png
8.当签名成功之后就可以安装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.png
3.把布局文件拷到工程:
image.png
4.添加布局ID:
image.png
5.修改广告页面的布局ID即可:
image.png
6.之后需要跟方式一一样的打包、签名就ok了!

五、总结

我是对smail语言不了解,才使用创建一个工程,让其生成smail源码再做简单修改的方式实现的。如果你是大牛,你可以直接操作smail源码实现你想要的效果。还有就是怎么签名的细节,我就不再描述了,可以自行学习!

上一篇下一篇

猜你喜欢

热点阅读