吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9985|回复: 22
收起左侧

[Android 原创] GPS pro 1.x逆向分析之注册机编写

  [复制链接]
qtfreet00 发表于 2015-6-4 13:11
本帖最后由 世事繁华皆成空 于 2015-6-4 13:13 编辑

原创:世事繁华皆成空
工具:apkide,jd-gui,Eclipse
涉及:安卓逆向,安卓开发,需要熟悉java语言成品链接:http://www.52pojie.cn/thread-368752-1-1.html,源码已在教程最后提供

声明:因为在原创区某位大牛想要注册机制作教程,我就粗糙的写了一个,大家如果没有学习过基础的安卓开发,可以不用往下看了

算法关键点地址请参考上面一篇帖子:http://www.52pojie.cn/thread-362119-1-1.html

QQ截图20150604124736.png

关键点如上图,如果

this.val$regEditText.getText().toString().trim().toUpperCase().equals(Algorithm.info(DisplayActivity.access$100(this.this$0)))

成立,则注册成功,追寻该方法来到算法处

[Java] 纯文本查看 复制代码
public static String info(String paramString)
  {
    return MD5_16(new StringBuilder(String.valueOf(MD5_32(MD5_16(new StringBuilder(String.valueOf(MD5_32(new StringBuilder(String.valueOf(MD5_16(new StringBuilder(String.valueOf(paramString)).append("gps").toString()).substring(3))).append("871006").toString()).substring(3))).append("sqs").toString()).substring(3)).substring(2, 15))).append("pk").toString()) + MD5_32(new StringBuilder(String.valueOf(MD5_32(MD5_16(new StringBuilder(String.valueOf(MD5_32(new StringBuilder(String.valueOf(MD5_32(new StringBuilder(String.valueOf(paramString)).append("gps").toString()).substring(3))).append("880612").toString()).substring(3))).append("zzj").toString()).substring(3)).substring(2, 15))).append("zj").toString()).substring(2, 6);
  }


此处可以发现 多次调用了16位 MD5 和 32位 MD5 算法,并添加了一大堆作者自定义信息。

QQ截图20150604125132.png

可以在该类中找到所有的方法,既然有现成的,待会写程序也就简单多了 直接提取即可

提取下列方法:
[Java] 纯文本查看 复制代码
private static String MD5_16(String paramString)
  {
    return getMD5Str(paramString).substring(8, 24).toUpperCase();
  }
  
  private static String MD5_32(String paramString)
  {
    return getMD5Str(paramString).toUpperCase();
  }

private static String getMD5Str(String paramString)
  {
    for (;;)
    {
      int i;
      try
      {
        Object localObject = MessageDigest.getInstance("MD5");
        ((MessageDigest)localObject).reset();
        ((MessageDigest)localObject).update(paramString.getBytes("UTF-8"));
        paramString = ((MessageDigest)localObject).digest();
        localObject = new StringBuffer();
        i = 0;
        if (i >= paramString.length) {
          return ((StringBuffer)localObject).toString();
        }
        if (Integer.toHexString(paramString[i] & 0xFF).length() == 1) {
          ((StringBuffer)localObject).append("0").append(Integer.toHexString(paramString[i] & 0xFF));
        } else {
          ((StringBuffer)localObject).append(Integer.toHexString(paramString[i] & 0xFF));
        }
      }
      catch (Exception paramString)
      {
        return "";
      }
      i += 1;
    }
  }


getMD5Str方法可以生成小写的 MD5算法,调用getMD5Str(paramString).substring(8, 24).toUpperCase()生成16位大写,直接toUpperCase()返回即为32位大写MD5算法,toUpperCase即将字符串转为大写。


开始编写:
打开eclipse,新建一个安卓工程
新建一个工具类,我命名为reg.java,该类中存放所有的加密算法,待会可以在主类中直接调用
[Java] 纯文本查看 复制代码
package com.qtfreet.qreg;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class reg {
        private static String MD5_16(String paramString)
                        throws NoSuchAlgorithmException {
                return getMD5Str(paramString).substring(8, 24).toUpperCase();
        }
//所有的方法都必须抛出算法异常
        private static String MD5_32(String paramString)
                        throws NoSuchAlgorithmException {
                return getMD5Str(paramString).toUpperCase();
        }

        private static String getMD5Str(String paramString)
                        throws NoSuchAlgorithmException {
                MessageDigest digest;

                digest = MessageDigest.getInstance("md5");
                StringBuffer buffer = new StringBuffer();
                byte[] result = digest.digest(paramString.getBytes());
                for (byte b : result) {
                        int number = b & 0xff;// 不按标准加密
                        // 转换成16进制
                        String numberStr = Integer.toHexString(number);
                        if (numberStr.length() == 1) {
                                buffer.append("0");
                        }
                        buffer.append(numberStr);
                }
                return buffer.toString();

                // MD5加密结果
        }
//上面为MD5加密算法
        public static String info(String paramString)
                        throws NoSuchAlgorithmException {
                return MD5_16(new StringBuilder(String.valueOf(MD5_32(
                                MD5_16(
                                                new StringBuilder(String.valueOf(MD5_32(
                                                                new StringBuilder(String
                                                                                .valueOf(MD5_16(
                                                                                                new StringBuilder(String
                                                                                                                .valueOf(paramString))
                                                                                                                .append("gps")
                                                                                                                .toString()).substring(
                                                                                                3))).append("871006")
                                                                                .toString()).substring(3))).append(
                                                                "sqs").toString()).substring(3)).substring(2,
                                15))).append("pk").toString())
                                + MD5_32(
                                                new StringBuilder(
                                                                String.valueOf(MD5_32(
                                                                                MD5_16(
                                                                                                new StringBuilder(
                                                                                                                String.valueOf(MD5_32(
                                                                                                                                new StringBuilder(
                                                                                                                                                String.valueOf(MD5_32(
                                                                                                                                                                new StringBuilder(
                                                                                                                                                                                String.valueOf(paramString))
                                                                                                                                                                                .append("gps")
                                                                                                                                                                                .toString())
                                                                                                                                                                .substring(
                                                                                                                                                                                3)))
                                                                                                                                                .append("880612")
                                                                                                                                                .toString())
                                                                                                                                .substring(3)))
                                                                                                                .append("zzj")
                                                                                                                .toString()).substring(
                                                                                                3)).substring(2, 15))).append(
                                                                "zj").toString()).substring(2, 6);
        }
//此方法为作者自定义的加密数据,由反编译apk获取得
}


程序界面:
[Java] 纯文本查看 复制代码
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/welcome"
    android:stretchColumns="1" >

    <TableRow>

        <TextView
            android:layout_height="wrap_content"
            android:text="硬件码:" />

        <EditText
            android:id="@+id/account"
            android:layout_height="wrap_content"
            android:hint="输入硬件码" />
    </TableRow>

    <TableRow>

        <TextView
            android:layout_height="wrap_content"
            android:text="注册码:" />

        <EditText
            android:id="@+id/reg"
            android:layout_height="wrap_content" />
    </TableRow>

    <Button
        android:id="@+id/regpass"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:alpha="0.9"
        android:text="生成" />

</TableLayout>


为了布局方便,我使用了表格布局,这样比较美观,这里定义了两个textview和两个EditText和一个按钮

[Java] 纯文本查看 复制代码
regpass = (Button) findViewById(R.id.regpass);
                user = (EditText) findViewById(R.id.account);
                pass = (EditText) findViewById(R.id.reg);

初始化控件,并为按钮设置监听器
[Java] 纯文本查看 复制代码
regpass.setOnClickListener(this);


实现该监听需要在类名中实现按钮监听

[Java] 纯文本查看 复制代码
if(user.getText().length()==0||user.getText().length()<10){
                        Toast.makeText(MainActivity.this, "请输入正确的硬件号", Toast.LENGTH_SHORT)
                        .show();
                        return;
                }
                ClipboardManager clip = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                try {
                        String ac = reg.info(user.getText().toString());

                        pass.setText(ac);
                        clip.setText(ac);

                        Toast.makeText(MainActivity.this, "注册码已复制到剪切板!", Toast.LENGTH_SHORT)
                                        .show();
                } catch (NoSuchAlgorithmException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }


下面在按钮点击方法中添加下列代码,首先判断用户是否输入数据及数据格式是否正确,我这里用数据长度进行判断,不符合直接返回,并Toast提示错误

ClipboardManager clip = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);

获取EditText中的硬件码,转为String类型,并调用加密算法String ac = reg.info(user.getText().toString());。将注册码存储在ac中,调用系统的剪切板服务,当获取注册码复制到剪切板中,并直接显示在注册码的EditText上,至此一个简单的注册机即完成了


上面是demo源码,可以作为模版继续开发


Qreg.zip (2.31 MB, 下载次数: 88)

稍微收点费用啊,毕竟写不容易

点评

打着海马模拟器的旗号用着天天模拟器  发表于 2015-6-23 18:31
教程写的很详细,辛苦了,觉得确实比爆破难很多,如果将来能有一些可用的辅助工具,通过简单的设置就能查看注册码,可就好了.  发表于 2015-6-4 15:35

免费评分

参与人数 11威望 +2 热心值 +11 收起 理由
snowerwang + 1 已答复!
fuckgm + 1 我很赞同!
Hiapkangel + 1 支持繁华妹纸啊!!
qaz003 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
lxcjy + 1 谢谢@Thanks!
逍遥枷锁 + 1 谢谢@Thanks!
YsGer + 1 谢谢@Thanks!
小辉子 + 1 谢谢@Thanks!
lonedemon + 1 鼓励转贴优秀软件安全工具和文档!
Hmily + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
周卫国 + 1 教程写的很详细,辛苦了,觉得确实比爆破难很.

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| qtfreet00 发表于 2015-6-4 16:31
Hmily 发表于 2015-6-4 15:36
这个和之前那篇帖子合并应该好点是吧。

三篇帖子也可以一起合并

点评

恩,那样精华质量杠杆的!  详情 回复 发表于 2015-6-4 17:37
 楼主| qtfreet00 发表于 2015-6-4 13:15
Avenshy 发表于 2015-6-4 13:31
public0712 发表于 2015-6-4 13:32
前排支持大神 貌似你更新很勤啊
roomlook 发表于 2015-6-4 14:32
学习了 谢谢
Hmily 发表于 2015-6-4 15:36
这个和之前那篇帖子合并应该好点是吧。
clcms 发表于 2015-6-4 17:06
mark,太好了,感谢分享
Hmily 发表于 2015-6-4 17:37
世事繁华皆成空 发表于 2015-6-4 16:31
三篇帖子也可以一起合并

恩,那样精华质量杠杆的!
mei命 发表于 2015-6-4 22:13
感谢分享,一些地方还看不懂,新手还在学习中
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 07:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表