Android逆向破解表单登录程序
Android开发
ADT: android studio(as)
程序界面如下,登录成功时弹出通知登录成功
,登录失败时弹出通知登录失败
。
布局代码
<?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="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/textView13"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="28sp"
android:text="用户登录" />
<EditText
android:id="@+id/TEXT_NAME"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="用户名" />
<EditText
android:id="@+id/TEXT_PASS"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="密码" />
<Button
android:id="@+id/BTN_Login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录" />
</LinearLayout>
主程序代码
package com.example.mark.myfirstapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
EditText Name;
EditText Pass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Name = (EditText)findViewById(R.id.TEXT_NAME);
Pass = (EditText) findViewById(R.id.TEXT_PASS);
Button Login = (Button) findViewById(R.id.BTN_Login);
Login.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
checkLogin(Name.getText().toString().trim(),Pass.getText().toString().trim());
}
});
}
public void checkLogin(String name, String pass){
if(name.equals("admin") && pass.equals("password")){
Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
}
else
Toast.makeText(MainActivity.this,"登录失败",Toast.LENGTH_SHORT).show();
}
}
Android逆向破解
tool: android killer
逆向程序的关键在于分析checklogin()
方法,smali
语法参考Android逆向之smali。
# virtual methods
.method public checkLogin(Ljava/lang/String;Ljava/lang/String;)V
.locals 2
.param p1, "name" # Ljava/lang/String;
.param p2, "pass" # Ljava/lang/String;
.line 30
const-string v0, "admin"
invoke-virtual {p1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
const/4 v1, 0x0
if-eqz v0, :cond_0
const-string v0, "password"
invoke-virtual {p2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_0
.line 31
const-string v0, "\u767b\u5f55\u6210\u529f"
invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v0
invoke-virtual {v0}, Landroid/widget/Toast;->show()V
goto :goto_0
.line 34
:cond_0
const-string v0, "\u767b\u5f55\u5931\u8d25"
invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v0
invoke-virtual {v0}, Landroid/widget/Toast;->show()V
.line 36
:goto_0
return-void
.end method
参考会飞的丑小鸭给出的思路:
- 程序用
if-eqz
来判断用户名和密码是否匹配,将这两个if-eqz
都改成if-nez
,可登录成功。 - 使用
goto
语句直接让程序执行登录成功的代码。 - 删除
if-eqz
这两条判断语句。
程序重新编译后运行结果如下
注:
- 如果长时间未编译成功,关闭后重新在历史工程中打开。
- 如果编译过程中存在问题,尝试获取最新版的
apktool
,替换软件目录下的旧版本apktool
。