Android逆向之一个简单的apk注册机算法分析

一、前言

有的软件加入了注册机需要注册码才可以使用,修改的话有的软件有加固针对强度高的又让部分人无法重打包,HOOK有检测,没root等问题。那么如果针对本地注册机我们可以分析他的算法来编写一个注册机进行注册使用。

二、工具

1.某app
2.jadx
3.idea

三、流程

首先我们打开软件随便输入一个就能看到他提示注册失败

在这里插入图片描述

软件有加固,我这边就不多说了直接扔到脱壳网站上传脱壳就行,脱壳完的的dex全部拖到jadx,然后直接搜索注册失败

!](https://i-blog.csdnimg.cn/direct/a911f248e7d843aebd79ed589c528882.png#pic_center)
在这里插入图片描述

在这个代码中可以看到判断前就是他的注册码计算流程,第一个判断

BigInteger(MD5.md5String(String.valueOf(Util.this.machine) + intValue), 16).toString().substring(0, 5);

是验证了注册码是否过期,说明这个是带时间限制的判断,第二个

BigInteger(MD5.md5String(String.valueOf(Util.this.machine) + Util.this.ps), 16).toString().substring(0, 8);

则是注册成并没有到期限制,说明这个是无限制,我这边直接拿他的无限制注册算法就行。

根据他的代码得出注册是machine(机器码)和ps 拼接后,进行MD5生成取 MD5 中间 16 位,将这 16 位十六进制字符串转换为 BigInteger 对象。从 BigInteger 对象的十进制字符串表示中截取前 8 位就是他的注册码了。

搜索一下 String ps

在这里插入图片描述

然后搜索得到ps值是xcheck225。我这边搞了一个代码

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Main {

public static void main(String[] args) {
// 机器码
String machineCode = "38dec90d";
String registrationCode = generateRegistrationCode(machineCode);
System.out.println("注册码: " + registrationCode);
}

public static String generateRegistrationCode(String machineCode) {
// 1. 将机器码和密码(ps)拼接
String input = machineCode + "xcheck225";
// 2. 计算 MD5 哈希值
String md5Hash = getMD5(input);

// 3. 取 MD5 哈希值的中间 16 位
String middlePart = md5Hash.substring(8, 24);

// 4. 将中间 16 位转换成 BigInteger 对象
BigInteger middlePartBI = new BigInteger(middlePart, 16);

// 5. 从 BigInteger 对象的十进制字符串表示中截取前 8 位
String registrationCode = middlePartBI.toString().substring(0, 8);

return registrationCode;
}

private static String getMD5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(input.getBytes());
BigInteger no = new BigInteger(1, messageDigest);
String hashtext = String.format("%032x", no);
return hashtext;
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("not found", e);
}
}
}

在这里插入图片描述

我这边idea运行一下生成注册码。结果是注册码: 14005263。结果也是注册成功的

在这里插入图片描述

然后也是简单写了一个注册机app。
在这里插入图片描述

四、小结

本文比较简单小白向,为初学者提供一个逆向分析注册码生成的流程,有助于理解软件破解的基本原理和方法。
声明这个软件也是别人求助的,然后我这边也把注册机提取出来了可供参考学习,原调用被加固抽调了,根据samli代码分析,写一个调用也能完成这个注册机调用


 new-instance v0, Lxh/L/Util;

 invoke-direct {v0, p0}, Lxh/L/Util;-><init>(Landroid/app/Activity;)V

invoke-virtual {v0}, Lxh/L/Util;->check()V

即可调用

下面附上原注册机dex和app源码

附件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值