一、题目详细
说明:
Tencent2016A是一个简单的注册程序,见附件,请写一个注册机,点击Check即可显示是否通过, Name和Code可以手动输入,也可以通过扫描二维码输入。
要求:
- 注册机是KeyGen,不是内存注册机或文件Patch。
- 注册机必须可以运行在Android系统上, 可以是命令行程序,也可以是apk。
- 将编译好的注册机和分析文档,源代码一起上传。
- 提交方式:将分析文档,注册机工程源代码和编译好的注册机打包后提交。(无说明文档,视为无效方案)。
- 不得在论坛或群等场所讨论。
- 不得泄露KeyGenMe任何有效的姓名/序列号。
通过标准:在注册机中任意输入用户名,生成的Code均能成功通过检查,视为有效注册机。
二、分析过程
将apk程序在手机(模拟器)上运行,观看运行效果:

程序运行效果显示存在两个文本框以及两个按钮,首先进行查壳检测:

未加壳或未知厂商的壳,接下来我们使用android killer或JEB进行JAVA层的静态分析(我是用的JEB),看到如下图所示就可以确定该程序没有加壳:

进入MainActivity,并按下Tab键查看JEB所提供的该程序的java代码(重命名后的):
package com.tencent.tencent2016a;
import android.app.AlertDialog.Builder;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.a.f;
import android.widget.Button;
import android.widget.EditText;
import com.a.a.e.a.a;
import com.a.a.e.a.b;
public class MainActivity extends f {
Button check;
Button ScanQRCode;
EditText name;
EditText code;
AlertDialog.Builder builder;
static {
System.loadLibrary("CheckRegister");
}
public MainActivity() {
this.check = null;
this.ScanQRCode = null;
this.name = null;
this.code = null;
this.builder = null;
}
public native int NativeCheckRegister(String name, String code) {
}
@Override // android.support.a.a.k
protected void onActivityResult(int arg4, int arg5, Intent arg6) {
b v0 = a.a(arg4, arg5, arg6);
if(v0 != null) {
if(v0.a() == null) {
return;
}
String[] v0_1 = v0.a().split(":");
this.name.setText(v0_1[0]);
this.code.setText(v0_1[1]);
return;
}
super.onActivityResult(arg4, arg5, arg6);
}
@Override // android.support.v7.a.f
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
this.setContentView(0x7F040019); // layout:activity_main
this.name = (EditText)this.findViewById(0x7F0D0048); // id:editText
this.code = (EditText)this.findViewById(0x7F0D0049); // id:editText2
this.check = (Button)this.findViewById(0x7F0D004A); // id:button
this.builder = new AlertDialog.Builder(this);
this.ScanQRCode = (Button)this.findViewById(0x7F0D004B); // id:btnScan
this.builder.setMessage("Check Result");
this.builder.setTitle("Check Result");
this.builder.setPositiveButton("OK", new com.tencent.tencent2016a.a(this));
if(this.ScanQRCode != null) {
this.ScanQRCode.setOnClickListener(new com.tencent.tencent2016a.b(this));
}
if(this.check != null) {
this.check.setOnClickListener(new checkCode(this)); // check 按钮的监听触发事件
}
}
}
大致可以看出就是简单的获取name和code加上一些处理,跟进checkCode函数中去查看:
package com.tencent.tencent2016a;
import android.view.View.OnClickListener;
import android.view.View;
class checkCode implements View.OnClickListener {
final MainActivity mainactivity;
checkCode(MainActivity arg1) {
this.mainactivity = arg1;
super();
}
@Override // android.view.View$OnClickListener
public void onClick(View

本文详细介绍了如何对Tencent2016A注册程序进行逆向工程分析,通过JEB进行JAVA层静态分析,发现程序对输入的name和code进行特定的加密算法处理。通过IDA分析.so文件,识别出Base64加密算法,并反向构造出注册机的关键步骤,包括Base64解密和加密过程。最终,通过理解程序的验证条件,成功编写出注册机的逻辑流程。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



