Android逆向系列文章— Android基础逆向

知识的价值不在于占有,而在于使用。这篇文章主要讲述Android逆向系列文章— Android基础逆向相关的知识,希望能为你提供帮助。

本文作者:HAI_
0×00 前言 不知所以然,请看Android逆向-Android基础逆向(1)
Android逆向-Android基础逆向(2)
Android逆向-Android基础逆向(2-2)
Android逆向-Android基础逆向(2-3补充篇)
Android逆向-Android基础逆向(3)
Android逆向-Android基础逆向(4)
Android逆向-Android基础逆向(4-2)
Android逆向-Android基础逆向(5)
以及java系列:Android逆向-java代码基础(1)
Android逆向-java代码基础(2)
Android逆向-java代码基础(3)
Android逆向-java代码基础(4)
Android逆向-java代码基础(5)
Android逆向-java代码基础(6)
Android逆向-java代码基础(7)
Android逆向-java代码基础(8)
内容or问题1.如何写一个登录界面? √
2.逆向分析登录逻辑 √
3.如何暴力绕过一个登录界面? √
4.如何巧妙登录 √
5..如何加广告√
6.如何去广告
7.实例分析
时间2018年2月4日13:10:42
目的1.复习登录界面的书写
2.暴力练习
3.获取练习
4.smali代码熟练
5.给自己的app加广告
6.二次打包加广告实战
7.如何去广告
0×01 Android 编程—登录界面 说明这个是学编程的时候必须要学的,这次我们就不接数据库来操作。也没有注册界面,直接就是一个简单的登录界面。
demo还是按照之前的改。恩,反正我会,我就要偷懒。
1.更改布局首先一个用户名的框框。
Android逆向系列文章— Android基础逆向

文章图片

然后一个登录密码的框框。
Android逆向系列文章— Android基础逆向

文章图片

然后还是一个登录按钮
Android逆向系列文章— Android基础逆向

文章图片

预览一下我们的界面
Android逆向系列文章— Android基础逆向

文章图片

好丑,做一个简单的调整,整体代码如下:
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:id="@+id/activity_main"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:orientation="vertical"     tools:context="com.example.hanlei.first_demo.MainActivity">     < EditText             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:id="@+id/name"             android:hint="请输入用户名"     />     < EditText             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:id="@+id/password"             android:hint="请输入密码"             />     < Button             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:id="@+id/bt"             android:text="Login"/> < /LinearLayout>

Android逆向系列文章— Android基础逆向

文章图片

2.绑定控件恩,为了像一个登录界面,我把name也改了。
所以重新绑定。
Android逆向系列文章— Android基础逆向

文章图片

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             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:id="@+id/password"             android:inputType="number"             android:hint="请输入密码"             />

这里加了一行只允许输入数字。
测试
Android逆向系列文章— Android基础逆向

文章图片

0×02 反编译分析分析嘛,很多次了。老规矩
1. Android Killer
Android逆向系列文章— Android基础逆向

文章图片

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 = https://www.songbingjia.com/android/Lcom/example/hanlei/first_demo/MainActivity; -> onCreate(Landroid/os/Bundle
Android逆向系列文章— Android基础逆向

文章图片
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
Android逆向系列文章— Android基础逆向

文章图片
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
Android逆向系列文章— Android基础逆向

文章图片
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
Android逆向系列文章— Android基础逆向

文章图片
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
Android逆向系列文章— Android基础逆向

文章图片
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
Android逆向系列文章— Android基础逆向

文章图片
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
Android逆向系列文章— Android基础逆向

文章图片
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
Android逆向系列文章— Android基础逆向

文章图片
V    invoke-virtual {v0, v1}, Lcom/example/hanlei/first_demo/MainActivity; -> startActivity(Landroid/content/Intent
Android逆向系列文章— Android基础逆向

文章图片
V    .line 31     :cond_0     return-void .end method

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
Android逆向系列文章— Android基础逆向

文章图片
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
Android逆向系列文章— Android基础逆向

文章图片
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
Android逆向系列文章— Android基础逆向

文章图片
V    invoke-virtual {v0, v1}, Lcom/example/hanlei/first_demo/MainActivity; -> startActivity(Landroid/content/Intent
Android逆向系列文章— Android基础逆向

文章图片
V

我们看到了两个if语言
整个逻辑就是先进行一个判断,然后进行另外一个判断。就是满足第一个if语句,然后满足第二个if语句才到结束。
这些smali代码就是我们之前分析过很多次的语句,没有什么难的地方,都很简单的。
0×03 暴力美学我们来尝试破解。
方法 1 思路
【Android逆向系列文章— Android基础逆向】既然有if语句进行判断,那我把if语句删了。编程现在这个样子:
invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity; -> access$000(Lcom/example/hanlei/first_demo/MainActivity
Android逆向系列文章— Android基础逆向

文章图片
Landroid/widget/EditText ;     move-result-object v0    invoke-virtual {v0}, Landroid/widget/EditText; -> getText()Landroid/text/

    推荐阅读