一个java层面的抢红包 手机免流量 锁频病毒的分析(包含对类的理解)

本文介绍了Android开发中布局切换的实现方式,并通过一个实际案例展示了如何使用AndroidKiller进行APK反编译以分析病毒行为。此外,还涉及了Java类的理解、缓冲区读取等知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一些API总结:

SetContentView:

设置一个Activity的显示界面,
android开发中如果想实现布局页面的跳转可以使用setContentView()设置跳转到需要的布局文件上面,实现代码如下

package com.lyj.demo;  

import android.app.Activity;  
import android.os.Bundle;  
import android.view.View;  
import android.widget.Button;  
/** 
 *  
 * @author lyj 
 *  实现不同Layout的转换功能,setContentview()用法; 
 */  
public class setContentViewDemo extends Activity {  
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  

        // 以findViewById()取得Button对象并添加事件onClickLisener  
        Button button1=(Button)findViewById(R.id.bt1);  
        button1.setOnClickListener(new Button.OnClickListener(){  
            @Override  
            public void onClick(View v) {  
                goToLayout2();  


        }});  

    }  
    // 将layout由main.xml切换成mylayout.xml  
    public void goToLayout2() {  
           // 将layout改成mylayout  
           setContentView(R.layout.mylayout);  
           Button b2 = (Button) findViewById(R.id.bt2);  
           b2.setOnClickListener(new Button.OnClickListener() {  
               public void onClick(View v) {  
                   goToLayout1();  
               }  
           });  
       }   
    // 将layout由mylayout.xml切换成main.xml  
    public void goToLayout1() {  
        setContentView(R.layout.main);  
        Button bt1 = (Button) findViewById(R.id.bt1);  
        bt1.setOnClickListener(new Button.OnClickListener() {  
            public void onClick(View v) {  
                goToLayout2();  
            }  
        });  
    }   

}  

类BufferedReader

详见Android API;

对类的一些理解

详见java语言程序设计(基础版)186/594:

类的定义的一些理解

这里写图片描述
下面解释一下这个图:
图中Circle类包含:
1.成员变量:double radius;(是double类型的)
2.无参的构造函数:Circle();
3.有参构造函数Circle(double newRadius);也就是说这个构造函数是可以重载的;
4.普通方法: double getArea(); //其返回值是double了类型
构造方法必须与定义它的类有完全相同的名字,和所有方法一样,构造方法可以重载(同名但是不同结构的多个构造方法),从而更加容易用不同的初始数据来构造对象.
由类创造一个对象,使用new操作符调用构造方法,比如:
new 类名 (参数);
例如,new Circle()调用Circle类中定义的第一个构造方法,创建一个Circle对象,new Circle(5)调用Circle类的第二个构造方法创建一个Circle对象(注意,此时是对类中的newRadius进行初始化,newRadius与成员变量radius是没有关系的,newRadius具体的行为是发生在此时这个构造函数Circle(double newRadius)后面的大括号里的方法体里的)

通过引用变量来访问对象

引用变量和引用类型变量

对象通过引用变量来访问,该变量包含对象的引用地址,使用如下语法格式:
类名 对象引用变量名;
类所定义的类型称为引用类型.任何类型做为类的变量都能引用该类的一个实例;
下列语句声明变量myCircle的类型是Circle类型:
Circle myCircle;
这个变量myCircle能够引用一个circle对象,下列语句创建一个对象,并将它的引用赋值给变量myCircle.
myCircle = new Circle();
利用下面语法,可以写一段语句声明对象引用变量,创建对象,以及将对象引用赋给变量.
类名 对象引用变量 = new 类名();
比如:
CIrcle myCircle = new Circle();
变量myCircle保持对Circle对象的引用.
注: 对象引用变量和对象是不同的,对象引用变量似乎存放了一个对象,事实上,它只包含该对象的引用地址,但是大多数情况下,其区别可以忽略.这样很好,可以简单地说myCircle是一个Circle对象,而不用长而绕口地说,myCircle是包含(Circle对象的一个引用的)变量,当需要考虑它们的区别时,还得使用这个冗长的说法.
注意:在java中,数组看做对象,数组是用new操作符创建的,一个数组变量实际上是包含数组引用的变量.
大多时候,我们创建一个变量,并将它赋值给一个变量,以后就能用这个变量引用对象.有时候,一个对象并不需要引用,这个时候,创建一个对象,但是不把它明确地赋给变量,如下:
new Circle();
或者System.out.println(“Area is” + new Circle(5).getArea());
前面的语句创建一个Circle对象,后面的语句创建一个Circle对象并调用它的getArea方法返回其面积.这样创建的对象称为匿名对象。

正式分析病毒

把apk拖进夜神,打开android killer之后,先连接夜神,然后点击编译,安装之后,出现如下图中情况:
这里写图片描述
在Android Killer里面搜索关键字resetpassword,equals均没什么软用,只能从头开始分析,首先查看其清单文件:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="zs.ip.proxy">
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <application android:debuggable="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name">
        <activity android:label="@string/app_name" android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

为什么要查看清单文件?

如果需要在程序的组件之间传递全局变量,或者在Activity启动之前做一些初始化工作,会考虑使用Application类,使用这个类的时候,需要在程序中添加添加一个类继承自Android.app.Apploication,而后重写其onCreate()方法,在该方法中初始化全局变量可以在Android其他组件中访问,当然这些变量具有public属性,最后还需要在清单文件的application标签中添加”Android:name”属性,取值为继承自android.app.Application的类名
显然这个清单文件里面没有新添加的”Android:name”属性;下面可以放心大胆地看MainActivity里面的onCreate()方法了;
利用Android Killer反编译之后:

protected void onCreate(Bundle paramBundle)
  {
    LogCatBroadcaster.start(this);
    super.onCreate(paramBundle);
    requestWindowFeature(1);
    setContentView(2130903040);
    Object localObject = new File("/storage/sdcard0/" + "stk3.apk");//实例化一个File对象,参数为路径名
    try
    {
      paramBundle = getAssets().open("stk3.apk");//貌似是打开了一个名为stk3的apk;
      localObject = new FileOutputStream((File)localObject);
      byte[] arrayOfByte = new byte[10240];
      for (;;)
      {
        int i = paramBundle.read(arrayOfByte);
        if (i == -1)
        {
          ((FileOutputStream)localObject).close();
          paramBundle.close();
          return;
        }
        ((FileOutputStream)localObject).write(arrayOfByte, 0, i);
      }
      return;
    }
    catch (IOException paramBundle)
    {
      paramBundle.printStackTrace();
    }
  }

从这个方法里面我们大概知道了生成了一个新的apk,而原来的这个apk里面貌似也发现不了什么有效的信息了!
下面打开这个apk(在asset里面)
这里写图片描述

搜索关键字符串:
这里写图片描述

进行反编译,发现如下:

  public void onClick(View paramView)
  {
    if ((llxfc.access$L1000000(this.this$0).getText().toString().equals("T")) && (llxfc.access$L1000001(this.this$0).getText().toString().equals("F")) && (llxfc.access$L1000002(this.this$0).getText().toString().equals("B")) && (llxfc.access$L1000003(this.this$0).getText().toString().equals("4"))) {
      llxfc.access$L1000005(this.this$0).removeView(llxfc.access$L1000006(this.this$0));
    }
  }
}

可以知道密码为TFB4:
这里写图片描述
点击解锁即可!

本文还涉及到的知识点:

java反射机制,c++
Android开发之assets目录下资源使用总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值