Android逆向破解表单注册程序

Android开发

ADT: android studio(as)

程序界面如下,注册码为6位随机数字,注册成功时弹出通知注册成功,注册失败时弹出通知注册失败

布局代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="用户注册"
android:textSize="28sp" />
<EditText
android:id="@+id/Username"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="6位用户名"/>
<EditText
android:id="@+id/Register"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="6位注册码"/>
<Button
android:id="@+id/BTN_Login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="注册" />
</LinearLayout>

主程序代码

package com.example.mark.myfirstregister;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
EditText edit_Name;
EditText Reg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit_Name = (EditText) findViewById(R.id.Username);
Reg = (EditText) findViewById(R.id.Register);
Button btn_reg = (Button) findViewById(R.id.BTN_Login);
btn_reg.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
checkReg(edit_Name.getText().toString().trim(),Reg.getText().toString().trim());
}
});
}
public void checkReg(String name, String reg){
int numcode = (int) ((Math.random() * 9 + 1) * 100000);
int n = 6;
if(name.length() == 6 && reg.equals(numcode)){
Toast.makeText(MainActivity.this,"注册成功",Toast.LENGTH_SHORT).show();
}
else
Toast.makeText(MainActivity.this,"注册失败",Toast.LENGTH_SHORT).show();
}
}

Android逆向破解

tool: apktool

# 反编译
apktool d[ecode] [options] <file_apk>
# 编译
apktool b[uild] [options] <app_path>

反编译apk,执行 apktool d target.apk -o /path,之后生成一些目录,res存放资源文件,smali存放被反编译的smali代码。关键代码存放在smali目录下的MainActivity.smali文件,打开后进行分析。

.class public Lcom/example/mark/myfirstregister/MainActivity;
.super Landroid/support/v7/app/AppCompatActivity;
.source "MainActivity.java" # instance fields
.field Reg:Landroid/widget/EditText; .field edit_Name:Landroid/widget/EditText; # direct methods
.method public constructor <init>()V
.locals 0 .line 14
invoke-direct {p0}, Landroid/support/v7/app/AppCompatActivity;-><init>()V return-void
.end method # virtual methods
.method public checkReg(Ljava/lang/String;Ljava/lang/String;)V
.locals 5
.param p1, "name" # Ljava/lang/String;
.param p2, "reg" # Ljava/lang/String; .line 35
invoke-static {}, Ljava/lang/Math;->random()D move-result-wide v0 const-wide/high16 v2, 0x4022000000000000L # 9.0 mul-double v0, v0, v2 const-wide/high16 v2, 0x3ff0000000000000L # 1.0 add-double/2addr v0, v2 const-wide v2, 0x40f86a0000000000L # 100000.0 mul-double v0, v0, v2 double-to-int v0, v0 .line 36
.local v0, "numcode":I
const/4 v1, 0x6 .line 37
.local v1, "n":I
invoke-virtual {p1}, Ljava/lang/String;->length()I move-result v2 const/4 v3, 0x0 const/4 v4, 0x6 if-ne v2, v4, :cond_0 invoke-static {v0}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer; move-result-object v2 invoke-virtual {p2, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v2 if-eqz v2, :cond_0 .line 38
const-string v2, "\u6ce8\u518c\u6210\u529f" invoke-static {p0, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; move-result-object v2 invoke-virtual {v2}, Landroid/widget/Toast;->show()V goto :goto_0 .line 41
:cond_0
const-string v2, "\u6ce8\u518c\u5931\u8d25" invoke-static {p0, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; move-result-object v2 invoke-virtual {v2}, Landroid/widget/Toast;->show()V .line 43
:goto_0
return-void
.end method .method protected onCreate(Landroid/os/Bundle;)V
.locals 2
.param p1, "savedInstanceState" # Landroid/os/Bundle; .line 20
invoke-super {p0, p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V .line 21
const v0, 0x7f09001c invoke-virtual {p0, v0}, Lcom/example/mark/myfirstregister/MainActivity;->setContentView(I)V .line 22
const v0, 0x7f070008 invoke-virtual {p0, v0}, Lcom/example/mark/myfirstregister/MainActivity;->findViewById(I)Landroid/view/View; move-result-object v0 check-cast v0, Landroid/widget/EditText; iput-object v0, p0, Lcom/example/mark/myfirstregister/MainActivity;->edit_Name:Landroid/widget/EditText; .line 23
const v0, 0x7f070005 invoke-virtual {p0, v0}, Lcom/example/mark/myfirstregister/MainActivity;->findViewById(I)Landroid/view/View; move-result-object v0 check-cast v0, Landroid/widget/EditText; iput-object v0, p0, Lcom/example/mark/myfirstregister/MainActivity;->Reg:Landroid/widget/EditText; .line 24
const v0, 0x7f070001 invoke-virtual {p0, v0}, Lcom/example/mark/myfirstregister/MainActivity;->findViewById(I)Landroid/view/View; move-result-object v0 check-cast v0, Landroid/widget/Button; .line 25
.local v0, "btn_reg":Landroid/widget/Button;
new-instance v1, Lcom/example/mark/myfirstregister/MainActivity$1; invoke-direct {v1, p0}, Lcom/example/mark/myfirstregister/MainActivity$1;-><init>(Lcom/example/mark/myfirstregister/MainActivity;)V invoke-virtual {v0, v1}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V .line 33
return-void
.end method

关键部分代码在checkReg()方法中,注册成功的smali代码如下

if-eqz v2, :cond_0

.line 38
const-string v2, "\u6ce8\u518c\u6210\u529f"

对照AS38行的代码

Toast.makeText(MainActivity.this,"注册成功",Toast.LENGTH_SHORT).show();

由此可以确定程序破解的关键,直接修改if-eqzif-nez,然后重新编译。

apktool b /path/ -o /path/1.apk

安装后打开,输入任意6位用户名和注册码即可成功注册。

Android逆向破解表单注册程序的更多相关文章

  1. Android逆向破解表单登录程序

    Android逆向破解表单登录程序 Android开发 ADT: android studio(as) 程序界面如下,登录成功时弹出通知登录成功,登录失败时弹出通知登录失败. 布局代码 <?xm ...

  2. html表单验证程序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. ajax+FormData+javascript 实现无刷新表单注册

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. form表单注册——HTML

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  5. Android逆向——破解水果大战

    最近公司需要测试安卓app安全,但安卓基本上0基础,决定开始学习下安卓逆向根据吾爱破解上教程 <教我兄弟学Android逆向系列课程+附件导航帖> https://www.52pojie. ...

  6. PHP正则表达式及表单注册案例

    正则表达式是一种具有特定模式的用来匹配文本的字符串 preg_match 匹配 $pattern = '/php/'; $subject = "php 是最好的编程语言,php 没有之一!& ...

  7. SUI Mobile框架开发,android、ios表单遇到的问题

    1.页面添加区域滚动,滚动区域内元素事件无效问题 解决方法: <script type="text/javascript" charset="utf-8" ...

  8. Android实现模拟表单上传

    很久以前,写过一篇关于下载的文章:基于HTTP协议的下载功能实现,今天对于Android上的文件上传,也简单的提两笔.在Android上,一般使用Http 模拟表单或者FTP来进行文件上传,使用FTP ...

  9. 表单注册及自定义validate手机验证码验证实例

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

随机推荐

  1. layui-xtree 设置单选框,只能选一个

    以下是js代码,首先获取所有节点,再设置只有当前点击的节点状态为选中状态 $.ajax({ type: 'get', url: url, error: function(err){ layer.ale ...

  2. python的车牌号的检测

    自己总结一下,从网上找到的关于车牌号的识别的一些博文.https://www.jianshu.com/p/fcfbd3131b84 https://www.cnblogs.com/do-hardwor ...

  3. 解题(GoUpstairs -- 上楼梯)

    题目描述 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶.2阶.3阶.请实现一个方法,计算小孩有多少种上楼的方式.为了防止溢出,请将结果Mod 1000000007 给定一个正整数int n, ...

  4. pip安装scrapy出错解决措施

    安装报错提示: building 'twisted.test.raiser' extensionerror: Microsoft Visual C++ 14.0 is required. Get it ...

  5. 【IDEA】关于idea开发工具使用

    idea这个开发工具有很强大的功能,然鹅有时候某些地方需要注意...(注明一下,我的版本2017.3.2因为不知道新版本有木有优化) 先说说建包,比如我在src下建了个com.xxxxx.test的包 ...

  6. Centos6安装和配置etcd3

    etcd 是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现.etcd 的灵感来自于 ZooKeeper 和 Doozer,侧重于: 简单:支持 curl 方式的用户 API ( ...

  7. 47 【golang】mysql操作

    新做了个demo,可以简单了解下mysql的操作:https://github.com/helww/mylab/tree/master/go/mysql

  8. 批量替换表中某字段的“\t”

    update dbo.Hishop_Products set [Description]=replace(cast([Description] as varchar(8000)),' ',' ')

  9. .net WebApi中使用swagger生成WepApi集成测试工具

    我在WebApi中使用swagger的时候发现会出现很多问题,搜索很多地方都没找到完全解决问题的方法,后面自己解决了,希望对于遇到同样问题朋友有帮助.我将先一步一步的演示项目中解决swagger遇到问 ...

  10. jmeter导入DB数据再优化

    由于同一个迭代中每天都在执行.之前设计的思路是同个迭代只执行一次插入DB操作!! 因而没有在插入数据前没有做版本.产品类型.页面类型.接口名.接口名是否相等判断操作. 因此,若是这些条件相等,数据不是 ...