您的位置:首页 > 编程语言 > Java开发

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

2018-03-23 20:45 387 查看
一些API总结:
SetContentView:

类BufferedReader

对类的一些理解
类的定义的一些理解

通过引用变量来访问对象
引用变量和引用类型变量

正式分析病毒
为什么要查看清单文件?

本文还涉及到的知识点:

一些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
4000
对象并添加事件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目录下资源使用总结
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐