这里开发使用的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
这样再次进入就是破解版的了!!