本帖最后由 世事繁华皆成空 于 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
关键点如上图,如果
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 算法,并添加了一大堆作者自定义信息。
可以在该类中找到所有的方法,既然有现成的,待会写程序也就简单多了 直接提取即可
提取下列方法:
[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)
稍微收点费用啊,毕竟写不容易
|