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)

验证:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,327评论 25 709
  • 原作者:http://blog.csdn.net/u014727709/article/details/72673...
    f9895fb9acee阅读 5,317评论 0 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,384评论 19 139
  • 我以为伤疤已经结嘎,却不想姐姐的一句问候,再一次让我流㴰;我知道我把痛遮盖了起来,自欺欺人似的让自己开心,可是当别...
    勿忘勿扰阅读 1,527评论 0 0
  • 01 回头看,累的源头在哪里? 2015年元旦,参加iCourt的演讲课程,作为一名助教和一名学员,参加夜聊和夜话...
    陈小冬阅读 3,440评论 0 0