Android逆向笔记-破解自己编写的Android应用程序(开发及破解)

这里开发使用的Android studio,使用的模拟器为:

Pixel 2 API 22也就是Android 5的系统。

这里演示下开发的程序:

这里模拟了下激活程序,用户名是用户自己输入的,密码是用户名转md5后所有奇数项。也就是说123456789的密码为:323b453885f5181f的奇数项。

关键代码如下:

package com.example.crakdemo1;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;



public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText eidt_userName = (EditText)findViewById(R.id.userName);
        final EditText eidt_sn = (EditText)findViewById(R.id.password);
        Button btn_register = (Button)findViewById(R.id.button);
        btn_register.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View view) {

                if(!checkSN(eidt_userName.getText().toString().trim(), eidt_sn.getText().toString().trim())){

                    Toast.makeText(MainActivity.this, R.string.unsuccessed, Toast.LENGTH_SHORT).show();
                }
                else{

                    Toast.makeText(MainActivity.this, R.string.successed, Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    public static String bytesToHex(byte[] bytes) {
        StringBuilder buf = new StringBuilder(bytes.length * 2);
        for(byte b : bytes) { // 使用String的format方法进行转换
            buf.append(String.format("%02x", new Integer(b & 0xff)));
        }

        return buf.toString();
    }


    private boolean checkSN(String userName, String sn){

        try {

            if((userName == null) || (userName.length() == 0)){

                return false;
            }
            if((sn == null)){

                return false;
            }

            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.reset();
            digest.update(userName.getBytes());
            byte[] bytes = digest.digest();
            String hexStr = bytesToHex(bytes);
            StringBuffer sb = new StringBuffer();
            for(int i = 0; i < hexStr.length(); i+=2){

                sb.append(hexStr.charAt(i));
            }

            String userSN = sb.toString();

            if(!userSN.equalsIgnoreCase(sn)){

                return false;
            }
        }
        catch (NoSuchAlgorithmException e){

            e.printStackTrace();
            return false;
        }

        return true;
    }
}

上面这个程序源码打包下载地址:

https://github.com/fengfanchen/AndroidReverse/tree/master/CrakDemo1

先说一个工具:

ApkTool是跨平台apk文件反编译工具,生成smali格式的反汇编代码。

下面是破解自己写的程序,首先是要使用Android studio进行apk的生成:

在app下的build的outputs中apk中debug会有打包好的app,将这个拿到,然后新建文件夹,将其放进去:

运行命令:

apktool d ./app-debug.apk -o outdir

这里我使用了notepad++进行查找:

从中可以看到开发时候弹出的失败对应的英文名称为unsuccessed,再继续查这个!!

其中对应的地址为:

0x7f0c001f,再继续查这个!!

从上面的文件可以看到已经定位到ManActivity$1.smali文件了。从中可以看到这样的代码:

当个if-nez v0, : cond_0。

这里在cond_0中0x7f0c001e对应的是成功,所以关键点就是这里了。if-nez为if-not-equal-zero则调到cond_0,所以将其改为if-eqz

下面是从新编译APK并签名

回编译:

apktool b outdir

将其考到signapk文件夹中,进行签名

上面这个signapk.jar.zip可以在Android系统中找,也可以在网上去下载。我是在网上下载的。配置好环境变量,开始重新签名:

signapk app-debug.apk app.apk

使用adb进行安装:

adb install app.apk

这样再次进入就是破解版的了!!

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/106993573