【Android安全】用户名密码校验实例代码开发及反编译代码
2014-11-11 17:45
811 查看
新建一个Android工程加入两个文本框和标签框,同时加两个按钮。
1、Activity_Main.xml布局代码如下:
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/AbsoluteLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="124dp"
android:layout_y="308dp"
android:text="OK" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="219dp"
android:layout_y="308dp"
android:text="Exit" />
<EditText
android:id="@+id/editText1"
android:layout_width="128dp"
android:layout_height="wrap_content"
android:layout_x="148dp"
android:layout_y="110dp"
android:ems="10"
android:text="Name" />
<EditText
android:id="@+id/editText2"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_x="151dp"
android:layout_y="172dp"
android:ems="10"
android:inputType="textPersonName"
android:text="Passwd" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="48dp"
android:layout_y="122dp"
android:text="please name" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="54dp"
android:layout_y="172dp"
android:text="please passwd" />
</AbsoluteLayout>
2、MainActivity.java 中添加事件及校验判断如下红色字体为新增代码
package com.example.testtwo;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;
public class MainActivity extends Activity {
private boolean checkSN(String userName, String passWord)
{
if(userName.equals(passWord))
{
return true;
}
return false;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
final EditText edit_UserName;
final EditText edit_PassWd;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //启动时设置布局
/*code by myself*/
edit_UserName = (EditText)findViewById(R.id.editText1);
edit_PassWd = (EditText)findViewById(R.id.editText2);
Button btn_OK = (Button)findViewById(R.id.button2);
Button btn_Exit = (Button)findViewById(R.id.button1);
btn_OK.setOnClickListener(new OnClickListener(){
public void onClick(View v){
if(checkSN(edit_UserName.getText().toString().trim(),edit_PassWd.getText().toString().trim() ))
{
Toast.makeText(MainActivity.this, "success!", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(MainActivity.this, "fail!", Toast.LENGTH_SHORT).show();
}
}
});
btn_Exit.setOnClickListener(new OnClickListener(){
public void onClick(View v){
return;
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
3、在bin下找到apk文件,利用apktool反编译apk,得到main_activity.smali内容如下,后续再分析。
.class public Lcom/example/testtwo/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
.line 10
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
return-void
.end method
.method static synthetic access$0(Lcom/example/testtwo/MainActivity;Ljava/lang/String;Ljava/lang/String;)Z
.locals 1
.parameter
.parameter
.parameter
.prologue
.line 12
invoke-direct {p0, p1, p2}, Lcom/example/testtwo/MainActivity;->checkSN(Ljava/lang/String;Ljava/lang/String;)Z
move-result v0
return v0
.end method
.method private checkSN(Ljava/lang/String;Ljava/lang/String;)Z
.locals 1
.parameter "userName"
.parameter "passWord"
.prologue
.line 14
invoke-virtual {p1, p2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_0
.line 16
const/4 v0, 0x1
.line 18
:goto_0
return v0
:cond_0
const/4 v0, 0x0
goto :goto_0
.end method
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
.locals 5
.parameter "savedInstanceState"
.prologue
.line 24
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 25
const/high16 v4, 0x7f03
invoke-virtual {p0, v4}, Lcom/example/testtwo/MainActivity;->setContentView(I)V
.line 27
const v4, 0x7f080004
invoke-virtual {p0, v4}, Lcom/example/testtwo/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v3
check-cast v3, Landroid/widget/EditText;
.line 28
.local v3, edit_UserName:Landroid/widget/EditText;
const v4, 0x7f080005
invoke-virtual {p0, v4}, Lcom/example/testtwo/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v2
check-cast v2, Landroid/widget/EditText;
.line 29
.local v2, edit_PassWd:Landroid/widget/EditText;
const v4, 0x7f080002
invoke-virtual {p0, v4}, Lcom/example/testtwo/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v1
check-cast v1, Landroid/widget/Button;
.line 30
.local v1, btn_OK:Landroid/widget/Button;
const v4, 0x7f080003
invoke-virtual {p0, v4}, Lcom/example/testtwo/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/Button;
.line 32
.local v0, btn_Exit:Landroid/widget/Button;
new-instance v4, Lcom/example/testtwo/MainActivity$1;
invoke-direct {v4, p0, v3, v2}, Lcom/example/testtwo/MainActivity$1;-><init>(Lcom/example/testtwo/MainActivity;Landroid/widget/EditText;Landroid/widget/EditText;)V
invoke-virtual {v1, v4}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V
.line 44
new-instance v4, Lcom/example/testtwo/MainActivity$2;
invoke-direct {v4, p0}, Lcom/example/testtwo/MainActivity$2;-><init>(Lcom/example/testtwo/MainActivity;)V
invoke-virtual {v0, v4}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V
.line 49
return-void
.end method
.method public onCreateOptionsMenu(Landroid/view/Menu;)Z
.locals 2
.parameter "menu"
.prologue
.line 55
invoke-virtual {p0}, Lcom/example/testtwo/MainActivity;->getMenuInflater()Landroid/view/MenuInflater;
move-result-object v0
const/high16 v1, 0x7f07
invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V
.line 56
const/4 v0, 0x1
return v0
.end method
4、APKTool下载地址http://www.newasp.net/soft/68139.html或http://vdisk.weibo.com/s/BG3isR06dq011下载后修改批处理脚本使用即可
decode
该命令用于进行反编译apk文件,一般用法为
apktool d <file.apk> <dir>
<file.apk>代表了要反编译的apk文件的路径,最好写绝对路径,比如C:\MusicPlayer.apk
<dir>代表了反编译后的文件的存储位置,比如C:\MusicPlayer
如果你给定的<dir>已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命令加入-f指令
apktool d –f <file.apk> <dir>
这样就会强行覆盖已经存在的文件
build
该命令用于编译修改好的文件,一般用法为
apktool b <dir>
这里的<dir>就是刚才你反编译时输入的<dir>(如C:\MusicPlayer),输入这行命令后,如果一切正常,你会发现C:\MusicPlayer内多了2个
文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。
install
install-framework命令用于为APKTool安装特定的framework-res.apk文件,以方便进行反编译一些与ROM相互依赖的APK文件。
1、Activity_Main.xml布局代码如下:
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/AbsoluteLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="124dp"
android:layout_y="308dp"
android:text="OK" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="219dp"
android:layout_y="308dp"
android:text="Exit" />
<EditText
android:id="@+id/editText1"
android:layout_width="128dp"
android:layout_height="wrap_content"
android:layout_x="148dp"
android:layout_y="110dp"
android:ems="10"
android:text="Name" />
<EditText
android:id="@+id/editText2"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_x="151dp"
android:layout_y="172dp"
android:ems="10"
android:inputType="textPersonName"
android:text="Passwd" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="48dp"
android:layout_y="122dp"
android:text="please name" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="54dp"
android:layout_y="172dp"
android:text="please passwd" />
</AbsoluteLayout>
2、MainActivity.java 中添加事件及校验判断如下红色字体为新增代码
package com.example.testtwo;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;
public class MainActivity extends Activity {
private boolean checkSN(String userName, String passWord)
{
if(userName.equals(passWord))
{
return true;
}
return false;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
final EditText edit_UserName;
final EditText edit_PassWd;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //启动时设置布局
/*code by myself*/
edit_UserName = (EditText)findViewById(R.id.editText1);
edit_PassWd = (EditText)findViewById(R.id.editText2);
Button btn_OK = (Button)findViewById(R.id.button2);
Button btn_Exit = (Button)findViewById(R.id.button1);
btn_OK.setOnClickListener(new OnClickListener(){
public void onClick(View v){
if(checkSN(edit_UserName.getText().toString().trim(),edit_PassWd.getText().toString().trim() ))
{
Toast.makeText(MainActivity.this, "success!", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(MainActivity.this, "fail!", Toast.LENGTH_SHORT).show();
}
}
});
btn_Exit.setOnClickListener(new OnClickListener(){
public void onClick(View v){
return;
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
3、在bin下找到apk文件,利用apktool反编译apk,得到main_activity.smali内容如下,后续再分析。
.class public Lcom/example/testtwo/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
.line 10
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
return-void
.end method
.method static synthetic access$0(Lcom/example/testtwo/MainActivity;Ljava/lang/String;Ljava/lang/String;)Z
.locals 1
.parameter
.parameter
.parameter
.prologue
.line 12
invoke-direct {p0, p1, p2}, Lcom/example/testtwo/MainActivity;->checkSN(Ljava/lang/String;Ljava/lang/String;)Z
move-result v0
return v0
.end method
.method private checkSN(Ljava/lang/String;Ljava/lang/String;)Z
.locals 1
.parameter "userName"
.parameter "passWord"
.prologue
.line 14
invoke-virtual {p1, p2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_0
.line 16
const/4 v0, 0x1
.line 18
:goto_0
return v0
:cond_0
const/4 v0, 0x0
goto :goto_0
.end method
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
.locals 5
.parameter "savedInstanceState"
.prologue
.line 24
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 25
const/high16 v4, 0x7f03
invoke-virtual {p0, v4}, Lcom/example/testtwo/MainActivity;->setContentView(I)V
.line 27
const v4, 0x7f080004
invoke-virtual {p0, v4}, Lcom/example/testtwo/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v3
check-cast v3, Landroid/widget/EditText;
.line 28
.local v3, edit_UserName:Landroid/widget/EditText;
const v4, 0x7f080005
invoke-virtual {p0, v4}, Lcom/example/testtwo/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v2
check-cast v2, Landroid/widget/EditText;
.line 29
.local v2, edit_PassWd:Landroid/widget/EditText;
const v4, 0x7f080002
invoke-virtual {p0, v4}, Lcom/example/testtwo/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v1
check-cast v1, Landroid/widget/Button;
.line 30
.local v1, btn_OK:Landroid/widget/Button;
const v4, 0x7f080003
invoke-virtual {p0, v4}, Lcom/example/testtwo/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/Button;
.line 32
.local v0, btn_Exit:Landroid/widget/Button;
new-instance v4, Lcom/example/testtwo/MainActivity$1;
invoke-direct {v4, p0, v3, v2}, Lcom/example/testtwo/MainActivity$1;-><init>(Lcom/example/testtwo/MainActivity;Landroid/widget/EditText;Landroid/widget/EditText;)V
invoke-virtual {v1, v4}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V
.line 44
new-instance v4, Lcom/example/testtwo/MainActivity$2;
invoke-direct {v4, p0}, Lcom/example/testtwo/MainActivity$2;-><init>(Lcom/example/testtwo/MainActivity;)V
invoke-virtual {v0, v4}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V
.line 49
return-void
.end method
.method public onCreateOptionsMenu(Landroid/view/Menu;)Z
.locals 2
.parameter "menu"
.prologue
.line 55
invoke-virtual {p0}, Lcom/example/testtwo/MainActivity;->getMenuInflater()Landroid/view/MenuInflater;
move-result-object v0
const/high16 v1, 0x7f07
invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V
.line 56
const/4 v0, 0x1
return v0
.end method
4、APKTool下载地址http://www.newasp.net/soft/68139.html或http://vdisk.weibo.com/s/BG3isR06dq011下载后修改批处理脚本使用即可
decode
该命令用于进行反编译apk文件,一般用法为
apktool d <file.apk> <dir>
<file.apk>代表了要反编译的apk文件的路径,最好写绝对路径,比如C:\MusicPlayer.apk
<dir>代表了反编译后的文件的存储位置,比如C:\MusicPlayer
如果你给定的<dir>已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命令加入-f指令
apktool d –f <file.apk> <dir>
这样就会强行覆盖已经存在的文件
build
该命令用于编译修改好的文件,一般用法为
apktool b <dir>
这里的<dir>就是刚才你反编译时输入的<dir>(如C:\MusicPlayer),输入这行命令后,如果一切正常,你会发现C:\MusicPlayer内多了2个
文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。
install
install-framework命令用于为APKTool安装特定的framework-res.apk文件,以方便进行反编译一些与ROM相互依赖的APK文件。
相关文章推荐
- WCF分布式安全开发实践(3):传输安全模式之自定义用户名密码身份验证
- Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
- Android开发笔记-记住用户名密码(SharedPreferences)
- 工欲善其事,必先利其器 软件工具开发关键词 protractor自动化测试工具 RegexBuddy正则 CodeSmith,LightSwitch:代码生成 CheatEngine:玩游戏修改内存值必备神器 ApkIDE:Android反编译工具 Reflector:反编译dll动态链接库
- Android安全讲座第九层 android gdb 调试实例演示(无源代码篇)
- Android系列之Android开发教程代码实例
- Android-NDK开发之基础--Android JNI实例代码(四)-- JNI中的异常处理实例代码
- Cocos2d-x游戏开发之Cocos2dx通过JNI调用Android的Java代码(webView实例)
- Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
- Android UI开发 popupwindow介绍以及代码实例
- Axis2服务端用户名和密码校验authentication代码
- 设为首页收藏本站 切换到宽版 Android开发论坛 - 安卓开发论坛 - Android开发 - 安卓论坛 用户名 自动登录 找回密码 密码 注册 人人连接登陆 用新浪微博连接
- Android-NDK开发之基础--Android JNI实例代码(三)-- 在JNI中构造和实例化Java类
- 【代码】android软件开发 Service Binder交互通信实例
- WCF分布式安全开发实践(10):消息安全模式之自定义用户名密码:Message_UserNamePassword_WSHttpBinding
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android-NDK开发之基础--Android JNI实例代码(四)-- JNI中的异常处理实例代码
- Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
- Axis2服务端用户名和密码校验authentication代码
- WCF基于用户名和密码安全(升级)纯代码