用户
搜索
  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 106 天

    连续签到: 1 天

    [LV.6]常住居民II

    i春秋作家

    推荐小组成员

    Rank: 7Rank: 7Rank: 7

    102

    主题

    234

    帖子

    347

    魔法币
    收听
    0
    粉丝
    15
    注册时间
    2017-7-24

    幽默灌水王突出贡献春秋文阁i春秋签约作者i春秋推荐小组积极活跃奖春秋游侠秦

    HAI_ i春秋作家 推荐小组成员 幽默灌水王 突出贡献 春秋文阁 i春秋签约作者 i春秋推荐小组 积极活跃奖 春秋游侠 秦 楼主
    发表于 2018-2-6 13:24:48 315453

    0x00 前言

    不知所以然,请看

    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.如何去广告

    0x01 Android 编程---登录界面

    说明

    这个是学编程的时候必须要学的,这次我们就不接数据库来操作。也没有注册界面,直接就是一个简单的登录界面。
    demo还是按照之前的改。恩,反正我会,我就要偷懒。

    1.更改布局

    首先一个用户名的框框。
    这里写图片描述
    然后一个登录密码的框框。
    这里写图片描述
    然后还是一个登录按钮
    这里写图片描述
    预览一下我们的界面
    这里写图片描述
    好丑,做一个简单的调整,整体代码如下:

    <?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>
    

    这里写图片描述

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

    这里加了一行只允许输入数字。

    测试

    这里写图片描述

    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
    

    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

    我们看到了两个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

    然后保存进行反编译。

    安装测试

    测试成功
    这里写图片描述

    方法 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

    测试结果

    测试成功。

    结束语

    可能还有很多种绕过的方法,这里就不一一展示了。

    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就是16进制形式,进行转换,就知道了我们密码是多少了,之后在登录输出即可。当然这个是可有看到的密码,如果接入了数据库就会变成不可见的密码,到时候就可以进行动态调试来对密码进行一个输出了。

    0x05 如何植入广告

    什么是广告?

    大神说过一句话叫做,和游戏无关的都是广告,我们普遍说的广告就是,一些恩,很烦人的东西。

    植入广告的目的是什么?

    植入广告的目的主要是
    (1) 做推广
    (2)能赚到钱

    植入广告原理分析

    用一个载体去承载广告,然后显示出来。使用的技术用静态布局,或者使用动态加载等方式。还是来看一下如果植入广告的具体操作吧。

    市面上的广告

    有米广告

    有米广告,反正我被坑了整整两天,什么都没搞成功,还被折腾的够呛,不过虽然没有搞出什么成果来,但是对有米广告倒是有了一个很深的认识,这个坑人的东西,好气。
    最后我只是搞成功了一个这个东西。
    这里写图片描述
    为什么会出现这个鬼东西,恩,我也不知道。
    资料太少了。大部分博客都是直接抄的官方文档,最离谱的还是拿着有米官方给的demo,源代码一贴,一篇博客就写完了。不知道该说什么好。

    爬坑

    先来说说,我遇到的坑。希望有人研究的时候可以节约时间。

    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 tools:overrideLibrary="YoumiSdk_v7.4.0_2017-05-18" />

    不过最靠谱的办法就是换sdk。
    sdk去哪里找?我也不知道。
    找有米客服看给不给。
    反正我是从其他的apk里扒拉出来的。YoumiSdk_v7.4.0_2017-05-18这个版本。
    2018年2月5日21:45:28,我本来想放弃的,但是突然看到一个图。
    这里写图片描述
    我觉得自己可能要好好努力一把了。重新搞一下。
    以下为重新搞的记录。

    重新搞

    1.新建一个demo

    这里写图片描述

    2.加入arr包

    对了还有一件事情就是有米是arr包还不是jar包。
    看一下区别
    .jar:只包含了class文件与清单文件,不包含资源文件,如图片等所有res中的文件。
    .aar:包含所有资源,class以及res资源文件全部包含
    继续我们的操作
    这里写图片描述

    3.添加依赖关系

    这里写图片描述
    第三步中,arr包名复制粘贴
    我是来吐槽的,官方文档真的可以图文并茂的才对。哎呀呀

    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 android:name="android.permission.INTERNET" />  
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />  

    ps

    应该同步做一件事情。
    应该在我的小本本上同步做一个记录。

    添加v4包

    compile 'com.android.support:support-v4:xx.x.x'

    这里的v4:xx.x.x一定要和上面的一致,直接看图:
    这里写图片描述

    写完一个调用

    这里写图片描述
    出现这样一个鬼东西,就这个鬼东西,我弄到了晚上五点,打死都不知道是什么情况。
    自己搜索说是DNS解析失败
    然后咨询了客服
    这里写图片描述
    恩,和我没关系。

    试一下其他广告类型

    一样的返回code 1。好烦哦。提交审核了。
    2018年2月6日12:38:11

    多盟广告

    自己搞吧,我心累

    腾讯

    谷歌

    ....

    结束语

    至少写了4个demo,现在接入sdk,对于我来说真的是太熟悉了。塞翁失马焉知祸福。怎样用也很熟练了。
    如果要做到去广告的话,先对Activity进行观察,然后直接看官方文档,然后反着来就行,

    0x06 如何二次植入广告

    基本一搜索都是一种方法:(可能是有什么黑科技没有公布于世吧)、
    http://blog.csdn.net/u011106915/article/details/52184362
    还有一个是二次打包有米的。
    https://www.cnblogs.com/cooka/p/3593607.html

    0x07 结束语

    鉴于篇幅,转战Android逆向-Android基础逆向(6-2)

    收获:

    1.复习登录界面的书写
    2.简单的绕过总结
    3.简单的分析smali代码
    4.爬了两天的广告接入坑,对Android 接入sdk有了很深层次的认识

    遗留问题

    1.如何去除广告
    2.还有之前增加demo按钮逻辑

    以上

    评分

    参与人数 1魔法币 +5 收起 理由
    Xm2015 + 5 感谢你的分享,i春秋论坛有你更精彩!.

    查看全部评分

    本帖被以下淘专辑推荐:

    破解的目的是为了更好的开发
    发表于 2018-2-6 21:32:30
    卧槽(请允许我爆个粗口),发现宝了
    使用道具 举报 回复
    66666666666666666666666666666
    使用道具 举报 回复
    发表于 2018-2-9 08:44:58
    66666666666
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册