Android逆向-2016Tencent ctf比赛第一轮第一题详细分析

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

一、题目详细

说明:

Tencent2016A是一个简单的注册程序,见附件,请写一个注册机,点击Check即可显示是否通过, Name和Code可以手动输入,也可以通过扫描二维码输入。

要求:

  1. 注册机是KeyGen,不是内存注册机或文件Patch。
  2. 注册机必须可以运行在Android系统上, 可以是命令行程序,也可以是apk。
  3. 将编译好的注册机和分析文档,源代码一起上传。
  4. 提交方式:将分析文档,注册机工程源代码和编译好的注册机打包后提交。(无说明文档,视为无效方案)。
  5. 不得在论坛或群等场所讨论。
  6. 不得泄露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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值