Android ログイン インターフェイスの作成方法
0x01 Android 编程---登录界面
说明
这个是学编程的时候必须要学的,这次我们就不接数据库来操作。也没有注册界面,直接就是一个简单的登录界面。
demo还是按照之前的改。恩,反正我会,我就要偷懒。
1.更改布局
首先一个用户名的框框。
然后一个登录密码的框框。
然后还是一个登录按钮
预览一下我们的界面
好丑,做一个简单的调整,整体代码如下:
<?xml version="1.0" encoding="utf-8"?><linearlayout> <edittext></edittext> <edittext></edittext> <button></button></linearlayout>
2.绑定控件
恩,为了像一个登录界面,我把name也改了。
所以重新绑定。
3.逻辑书写
login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (name.getText().toString().equals("zhuzhu")&&Integer.parseInt(ps.getText().toString())==520) { startActivity(new Intent(MainActivity.this,Main2Activity.class)); } } });
这里涉及到一个知识点。
java String 类型如何转换为int类型。
简单的来说:
Integer.parseInt();
就可以转换了
这里突然想到万一不输入数字怎么办。恩,去改下规范。
<edittext></edittext>
这里加了一行只允许输入数字。
测试
0x02 反编译分析
分析嘛,很多次了。老规矩
1. Android Killer
2.找到主要函数
我们找到逻辑判断的地方$1
.class Lcom/example/hanlei/first_demo/MainActivity$1; .super Ljava/lang/Object; .source "MainActivity.java"# interfaces.implements Landroid/view/View$OnClickListener;# annotations.annotation system Ldalvik/annotation/EnclosingMethod; value = Lcom/example/hanlei/first_demo/MainActivity;->onCreate(Landroid/os/Bundle;)V.end annotation .annotation system Ldalvik/annotation/InnerClass; accessFlags = 0x0 name = null .end annotation# instance fields.field final synthetic this$0:Lcom/example/hanlei/first_demo/MainActivity;# direct methods.method constructor <init>(Lcom/example/hanlei/first_demo/MainActivity;)V .locals 0 .param p1, "this$0" # Lcom/example/hanlei/first_demo/MainActivity; .prologue .line 24 iput-object p1, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; invoke-direct {p0}, Ljava/lang/Object;-><init>()V return-void .end method# virtual methods.method public onClick(Landroid/view/View;)V .locals 4 .param p1, "v" # Landroid/view/View; .prologue .line 27 iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; # getter for: Lcom/example/hanlei/first_demo/MainActivity;->name:Landroid/widget/EditText; invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$000(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/EditText; move-result-object v0 invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable; move-result-object v0 invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object v0 const-string v1, "zhuzhu" invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v0 if-eqz v0, :cond_0 iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; # getter for: Lcom/example/hanlei/first_demo/MainActivity;->ps:Landroid/widget/EditText; invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/EditText; move-result-object v0 invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable; move-result-object v0 invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object v0 invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v0 const/16 v1, 0x208 if-ne v0, v1, :cond_0 .line 29 iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; new-instance v1, Landroid/content/Intent; iget-object v2, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; const-class v3, Lcom/example/hanlei/first_demo/Main2Activity; invoke-direct {v1, v2, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V invoke-virtual {v0, v1}, Lcom/example/hanlei/first_demo/MainActivity;->startActivity(Landroid/content/Intent;)V .line 31 :cond_0 return-void .end method</init></init></init>
3.重点逻辑部分
重点逻辑就是如何判断登录的部分
if-eqz v0, :cond_0 iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; # getter for: Lcom/example/hanlei/first_demo/MainActivity;->ps:Landroid/widget/EditText; invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/EditText; move-result-object v0 invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable; move-result-object v0 invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object v0 invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v0 const/16 v1, 0x208 if-ne v0, v1, :cond_0 .line 29 iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; new-instance v1, Landroid/content/Intent; iget-object v2, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; const-class v3, Lcom/example/hanlei/first_demo/Main2Activity; invoke-direct {v1, v2, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V invoke-virtual {v0, v1}, Lcom/example/hanlei/first_demo/MainActivity;->startActivity(Landroid/content/Intent;)V</init>
我们看到了两个if语言
整个逻辑就是先进行一个判断,然后进行另外一个判断。就是满足第一个if语句,然后满足第二个if语句才到结束。
这些smali代码就是我们之前分析过很多次的语句,没有什么难的地方,都很简单的。
0x03 暴力美学
我们来尝试破解。
方法 1
思路
既然有if语句进行判断,那我把if语句删了。编程现在这个样子:
invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$000(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/EditText; move-result-object v0 invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable; move-result-object v0 invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object v0 const-string v1, "zhuzhu" invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v0 这里删除if语句 iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; # getter for: Lcom/example/hanlei/first_demo/MainActivity;->ps:Landroid/widget/EditText; invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/EditText; move-result-object v0 invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable; move-result-object v0 invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object v0 invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v0 const/16 v1, 0x208 这里删除if语句 .line 29 iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; new-instance v1, Landroid/content/Intent; iget-object v2, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; const-class v3, Lcom/example/hanlei/first_demo/Main2Activity; invoke-direct {v1, v2, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V invoke-virtual {v0, v1}, Lcom/example/hanlei/first_demo/MainActivity;->startActivity(Landroid/content/Intent;)V .line 31 :cond_0 return-void</init>
然后保存进行反编译。
安装测试
方法 2
思路
不删除if语句,但是我更改if语句的逻辑。比如本来是相等才可以,我改成不相等就继续运行。
具体操作
第一个判断语句是:
if-eqz v0, :cond_0
if-eqz的含义就是 如果是0,就跳转到 cond_0
现在我们修改成:
if-nez v0,:cond_0
if-nez的含义是,如果不是0,就跳转到cond_0
第二个判断语句是:
if-ne v0, v1, :cond_0
if-ne的含义就是如果v0!=v1就跳转。
现在我们改成:
if-eq v0, v1, :cond_0
if-eq的含义就是如果相等再进行跳转。
测试
测试成功,不想录图片了。
方法3
思路
既然最后一定要走的是第二个判断里的内容,那么我们使用goto语句直接进去不就好了。
首先设置一个 cond_1
然后goto :cond_1
.method public onClick(Landroid/view/View;)V .locals 4 .param p1, "v" # Landroid/view/View; .prologue .line 27 goto :cond_1 iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; # getter for: Lcom/example/hanlei/first_demo/MainActivity;->name:Landroid/widget/EditText; invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$000(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/EditText; move-result-object v0 invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable; move-result-object v0 invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object v0 const-string v1, "zhuzhu" invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v0 if-eqz v0, :cond_0 iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; # getter for: Lcom/example/hanlei/first_demo/MainActivity;->ps:Landroid/widget/EditText; invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/EditText; move-result-object v0 invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable; move-result-object v0 invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object v0 invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v0 const/16 v1, 0x208 if-ne v0, v1, :cond_0 :cond_1 .line 29 iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; new-instance v1, Landroid/content/Intent; iget-object v2, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity; const-class v3, Lcom/example/hanlei/first_demo/Main2Activity; invoke-direct {v1, v2, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V invoke-virtual {v0, v1}, Lcom/example/hanlei/first_demo/MainActivity;->startActivity(Landroid/content/Intent;)V .line 31 :cond_0 return-void .end method</init>
测试结果
测试成功。
结束语
可能还有很多种绕过的方法,这里就不一一展示了。
0x04 优雅的登录
思路
既然是登录,那么必然就要有一个对比的存在,我只要知道是用什么去对比的,我把需要对比的东西进行输出,方便我们查看是不是更好呢。
代码分析
const-string v1, "zhuzhu" invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v0 if-eqz v0, :cond_0
这里很明显,用v0和v1进行比较,如果是就返回1,如果不是就返回0
const/16 v1, 0x208 if-ne v0, v1, :cond_0
定义一个v1寄存器,然后用v0和v1比较看是否一致如果一致就继续向下运行。
我们可以将0x208转换成密码的十进制形式后,再输入登录系统。当然这个是可有看到的密码,如果接入了数据库就会变成不可见的密码,到时候就可以进行动态调试来对密码进行一个输出了。
0x05 如何植入广告
什么是广告?
大神说过一句话叫做,和游戏无关的都是广告,我们普遍说的广告就是,一些恩,很烦人的东西。
植入广告的目的是什么?
植入广告的目的主要是
(1) 做推广
(2)能赚到钱
植入广告原理分析
用一个载体去承载广告,然后显示出来。使用的技术用静态布局,或者使用动态加载等方式。还是来看一下如果植入广告的具体操作吧。
市面上的广告
有米广告
有米广告,反正我被坑了整整两天,什么都没搞成功,还被折腾的够呛,不过虽然没有搞出什么成果来,但是对有米广告倒是有了一个很深的认识,这个坑人的东西,好气。
最后我只是搞成功了一个这个东西。
爬坑
先来说说,我遇到的坑。希望有人研究的时候可以节约时间。
Error:Execution failed for task ':processDebugManifest'. > [:YoumiSdk_v7.5.1_2018-01-16:] C:\Users\hanlei\Desktop\ls\YoumiAndroidSdk\demo\normaldemo\build\intermediates\exploded-aar\YoumiSdk_v7.5.1_2018-01-16\AndroidManifest.xml:23:3-29:15: Error: Invalid instruction 'targetApi', valid instructions are : REMOVE,REPLACE,STRICT
看到这个鬼东西了木有,网上搜索都说需要换一个sdk,但是官网只提供最新的sdk,或许是我没找到。
果断换sdk。
而且官方给的demo导入到Android Studio 里用不了,也是这个问题。
解决方案:
Androidmanifest.xml里加这一句,可能有用。
<uses-sdk></uses-sdk>
重新搞
1.新建一个demo
2.加入arr包
3.添加依赖关系
4. 申请ID
5.初始化信息
毫不留情就出问题了。
Error:Execution failed for task ':app:processDebugManifest'. > [:YoumiSdk_v7.5.1_2018-01-16:] C:\Users\hanlei\Desktop\ls\YoumiAndroidSdk\demo\demo3\app\build\intermediates\exploded-aar\YoumiSdk_v7.5.1_2018-01-16\AndroidManifest.xml:23:3-29:15: Error: Invalid instruction 'targetApi', valid instructions are : REMOVE,REPLACE,STRICT
换个arr版本接着搞。
记得改配置文件
果然换了一个arr包马上就对了,太不友好了。
我们接着初始化。
6.设置渠道号
7.权限配置。
广告嘛,配置权限权限扫描的才可以运行。
<uses-permission></uses-permission> <uses-permission></uses-permission> <uses-permission></uses-permission> <uses-permission></uses-permission> <uses-permission></uses-permission> <uses-permission></uses-permission>
ps
应该同步做一件事情。
应该在我的小本本上同步做一个记录。
添加v4包
compile 'com.android.support:support-v4:xx.x.x'
这里的v4:xx.x.x一定要和上面的一致,直接看图:
写完一个调用
以上がAndroid ログイン インターフェイスの作成方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









ここ数日、Ice Universeは、サムスンの次期主力スマートフォンであると広く信じられているGalaxy S25 Ultraの詳細を着実に明らかにしている。とりわけ、リーカーはサムスンがカメラのアップグレードを1つだけ計画していると主張した

OnLeaks は、X (旧 Twitter) のフォロワーから 4,000 ドル以上を集めようとして失敗した数日後、Android Headlines と提携して Galaxy S25 Ultra のファーストルックを提供しました。コンテキストとして、h の下に埋め込まれたレンダリング イメージ

TCLは、2つの新しいスマートフォンの発表に加えて、NXTPAPER 14と呼ばれる新しいAndroidタブレットも発表しました。その巨大な画面サイズはセールスポイントの1つです。 NXTPAPER 14 は、TCL の代表的なブランドであるマット LCD パネルのバージョン 3.0 を搭載しています。

ここ数日、Ice Universeは、サムスンの次期主力スマートフォンであると広く信じられているGalaxy S25 Ultraの詳細を着実に明らかにしている。とりわけ、リーカーはサムスンがカメラのアップグレードを1つだけ計画していると主張した

Vivo Y300 Pro は完全に公開されたばかりで、大容量バッテリーを備えた最もスリムなミッドレンジ Android スマートフォンの 1 つです。正確に言うと、このスマートフォンの厚さはわずか 7.69 mm ですが、6,500 mAh のバッテリーを搭載しています。これは最近発売されたものと同じ容量です

サムスンは、ファンエディション(FE)スマートフォンシリーズをいつアップデートするかについて、まだ何のヒントも提供していない。現時点では、Galaxy S23 FE は 2023 年 10 月初めに発表された同社の最新版のままです。

Redmi Note 14 Pro Plusは、昨年のRedmi Note 13 Pro Plus(Amazonで現在375ドル)の直接の後継者として正式に発表されました。予想通り、Redmi Note 14 Pro Plusは、Redmi Note 14およびRedmi Note 14 Proと並んでRedmi Note 14シリーズをリードします。李

OnePlus の姉妹ブランドである iQOO の製品サイクルは 2023 年から 4 年で、ほぼ終わりに近づいている可能性があります。それにもかかわらず、ブランドはまだZ9シリーズの開発を終えていないと宣言しました。その最終、そしておそらく最高エンドとなる Turbo+ バリアントが、予測どおりに発表されました。 T
