Android逆向破解表单登录程序

2023-07-29,,

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

参考:https://www.52pojie.cn/thread-408645-1-1.html

Android逆向破解表单登录程序的相关教程结束。

《Android逆向破解表单登录程序.doc》

下载本文的Word格式文档,以方便收藏与打印。