之前初步的了解了Android逆向,这次动手自己模仿着写个crackme。这是我第一次写Android app,堪称从0开始,所以记录下过程。(实际上是和Android程序破解演示实例的demo一致的)
总体思路:
用户输入用户名和注册码,点击注册后进行本地校验,然后弹出Toast提示。
页面布局也基本一致。。。
实践:
MainActivity中添加checkSn()方法,用于校验;
public boolean checkSN(String userName, String sn) {
if (userName == null || userName.length() == 0)
return false;
if (sn == null || sn.length() == 0)
return false;
MessageDigest digest = null;
try {
digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
digest.reset();
digest.update(userName.getBytes());
byte[] bytes = digest.digest();
String hexstr = toHexString(bytes,"");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hexstr.length(); i += 4){
sb.append(hexstr.charAt(i));
}
String userSn = sb.toString();
if (!userSn.equalsIgnoreCase(sn))
return false;
return true;
}
主要功能是校验用户名和注册码是否匹配。过程是使用MD5算法计算用户输入用户名的Hash,将计算结果转为Hex进制字符串,然后取字符串每隔3位数的字符组成新的字符串,新的字符串就是最终与注册名匹配的注册码。如果相同就return True,不相同返回False。
然后在onCreate中注册按钮的监听事件,如果checkSN为True,就弹成功的Toast,反之则弹错误的Toast。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle(R.string.unregister);
edit_sn = (EditText)findViewById(R.id.edit_sn);
edit_userName = (EditText)findViewById(R.id.edit_userName);
btn_register = (Button)findViewById(R.id.button_register);
btn_register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!checkSN(edit_userName.getText().toString().trim(),
edit_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();
btn_register.setEnabled(false);
setTitle(R.string.registered);
}
}
});
}
然后根据自己的算法,再写个脚本验证下。。。(完全多此一举🤣)
#!usr/bin/python
# -*- coding:utf-8 -*-
import os
import hashlib
import binascii
def check_sn(username):
print "用户名是: ", username
mystr = md5(username)
tem_str = ""
for index in range(0,len(mystr),4):
tem_str = tem_str + mystr[index]
print "注册码是 : ", tem_str
def md5(str):
m = hashlib.md5()
m.update(str)
return m.hexdigest()
if __name__ == '__main__':
username = raw_input("请输入用户名: ")
check_sn(username)
验证:
附件apk:
链接: https://pan.baidu.com/s/1qXXlCOO 密码: 6j5q
网友评论