Android开发练习(一)编写自己的第一个Android应用

之前初步的了解了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)

验证:

Android开发练习(一)编写自己的第一个Android应用_第1张图片

附件apk:
链接: https://pan.baidu.com/s/1qXXlCOO 密码: 6j5q

你可能感兴趣的:(Android开发练习(一)编写自己的第一个Android应用)