样本2crackme与注册码破解
apk运行
apk运行效果:随意输入不能注册
目标:破解注册码
分析apk
GDA打开
从onclick到access2最后到checkSN函数,发现最后的注册码逻辑
该关键函数代码如下,解读代码逻辑就是:
读取username,将其转换成md5,然后将md5字符串间隔(2个2个)生成一个子串。子串则是username对应的sn。对比用户输入的sn和由用户名生成的规则的sn,如果一致,那么就能成功注册。
private boolean MainActivity.checkSN(String userName,String sn) //method@0b9d
{
MessageDigest v1;
byte[] bytes;
String v3;
StringBuilder v5;
int v4;
String userSN;
boolean v7 = false;
if ((!userName)||((userName.length())&&((sn)&&(sn.length() == 16)))) {
v1 = MessageDigest.getInstance("MD5");
v1.reset();
v1.update(userName.getBytes());//获取字符串bytes数组
bytes = v1.digest();//md5加密
v3 = MainActivity.toHexString(bytes, "");//变成hex
v5 = new StringBuilder();
v4 = 0;
while ((v4 < v3.length())) {
v5 = v5.append(v3.charAt(v4));//charAt获取对应index的字符
v4 = v4+2;
}
userSN = v5.toString();
if (userSN.equalsIgnoreCase(sn)) {
v7 = true;
}
}
return v7;
}
破解注册码
- 方法1:网上md5在线计算
将结果隔一个取成新的字符串。
- 方法2:自己编写脚本
import hashlib
data = input()
data = bytes(data,encoding='utf-8')###注意在md5加密之前,要将字符串变成bytes类型
m = hashlib.md5() # 创建md5对象
m.update(data) # 更新md5对象
t= m.hexdigest() # 返回md5对象
print(t[::2])
方法1 2 结果都是一样的。
验证并破解apk
注:该apk是一次性的,也就是说,点过注册按钮之后,关掉重新启动才会正常。