Android逆向之Java常用类

Posted ltyandy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android逆向之Java常用类相关的知识,希望对你有一定的参考价值。

android逆向之Java常用类

包装类

byte ­> Byte

int ­> Integer

short ­> Short

long ­> Long

float ­> Float

double ­> Double

boolean ­> Boolean

char ­> Character

  public static void test0()
        int n =123456;
      // 整型转字符串
        String num=Integer.toString(n);
        System.out.println(num);
       // 从字符串中获取字符 ,获取了第0位上的数值。即123456的1.
        char ch =num.charAt(0);
      // 用字符类,将字符转为整型
        int m=Character.digit(ch,10);
        System.out.println(m);
      // 用整型类,将字符串解析为整型
        int m1=Integer.parseInt(num);
        System.out.println(m1);
?
  

字符串类

String类

toString equals

StringBuffer类与StringBuilder类

equals

public class Main 
    public static void test1()
        Scanner scanner=new Scanner(System.in);
        String str =scanner.next();
        String string="hello";
        if (string.equals(str))
            System.out.println("yes");
       else
            System.out.println("NO");
?
      
  

append

 StringBuffer buffer = new StringBuffer();
        buffer.append(name);// 连接字符串
        buffer.append("hello");
        buffer.append(" world ");
        buffer.append(" good! ");
        System.out.println(buffer);
        StringBuilder builder = new StringBuilder();
        builder.append(name);
        builder.append("hello");
        builder.append("world");
        builder.append(" good! ");
        System.out.println(builder);
        System.out.println(name.toString());
        System.out.println(buffer.toString());
        System.out.println(builder.toString());

文件操作类

创建文件

public static File CreateFile(String filePath)
    // 创建文件对象
    File file = new File(filePath);
    // 判断文件是否存在
    if( !file.exists())
        // 创建文件,因为createNewFile函数本身抛出了异常,需要try
        try
            file.createNewFile();
        catch (IOException e)
            e.printStackTrace();
            return null;
       
   
    // 返回文件对象
    return file;

读取文件

public static String ReadFile(File file)
    try
        //  1. 创建文件输入流对象
        FileInputStream inputStream = new FileInputStream(file);
        //  2. 创建字节输出流对象
        ByteArrayOutputStream byteArrayOutputStream = new
ByteArrayOutputStream();
        // 3. 创建字节数组
        byte bytes[] = new byte[1024];
        int nReadLen = 0;
        //  4. 使用文件输入流对象读取文件内容
        while ( (nReadLen =  inputStream.read(bytes,0,1024))
!=‐1)
            //  5. 将读取的内容写入到字节对象
            byteArrayOutputStream.write(bytes,0,nReadLen);
       
        // 以字符串方式返回字节对象
        return new String(byteArrayOutputStream.toByteArray());
    catch (Exception e)
        e.printStackTrace();
   
    return null;

写入文件

public static String WriteFile(File file, String content)
    try
        //  1. 创建文件输出流对象
        FileOutputStream  outputStream = new
FileOutputStream(file);
        // 2. 创建字节数组
        byte bytes[] = content.getBytes();
        int nReadLen = 0;
        //  3. 使用文件输出流对象写入文件内容
        outputStream.write(bytes);
    catch (Exception e)
        e.printStackTrace();
   
    return null;

删除文件

public static String DeleteFile(File file)
    if (file.exists())
        // 删除文件
        if (file.isFile())
            file.delete();
       
        // 删除目录
        else if (file.isDirectory())
            // 删除目录下的每一个文件
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++)
                // 递归删除
                DeleteFile(files[i]);
           
            // 删除目录
            file.delete();
       
   
    return null;

public static void DeleteDir(String destDir)
    File file = new File(destDir);
    DeleteFile(file);

调用

public static void test2()
        File file =  FileUtils.CreateFile("hello.txt");
        FileUtils.WriteFile(file, "hello123456");
        String content = FileUtils.ReadFile(file);
        System.out.println(content);
?
        FileUtils.DeleteDir("hello");
  

操作命令行程序

操作cmd

?
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
?
public class CmdUtils
?
    public static void runCMD(String command)
?
        try
            String cmd = "cmd.exe /c " +command;
            // Runtime.getRuntime().exec
            // 1. 执行命令,获取Process对象
            Process process = Runtime.getRuntime().exec(cmd);
            // 2. 获取cmd输出信息
            // 2.1 获取输入流对象
            InputStream inputStream = process.getInputStream();
            // 2.2 封装流读取对象
            InputStreamReader reader = new InputStreamReader(inputStream);
            // 2.3 封装缓冲流读取对象
            BufferedReader br = new BufferedReader(reader);
            // 2.4 循环读取
            String string = null;
            while ( (string = br.readLine()) != null)
                System.out.println(string);
          
            br.close();
            // 2.5 等待读取完毕
            process.waitFor();
       catch (Exception e)
            e.printStackTrace();
      
  
?
   
?

带设置目录的操作cmd

public static void runCMD(String command, String dir)
        try
            String cmd = "cmd.exe /c " +command;
            // 1. 执行命令,获取Process对象
            Process process = Runtime.getRuntime().exec(cmd, null, new File(dir));
            // 2. 获取cmd输出信息
            // 2.1 获取输入流对象
            InputStream inputStream = process.getInputStream();
            // 2.2 封装流读取对象
            InputStreamReader reader = new InputStreamReader(inputStream);
            // 2.3 封装缓冲流读取对象
            BufferedReader br = new BufferedReader(reader);
            String string = null;
            // 2.4 循环读取
            while ( (string = br.readLine()) != null)
                System.out.println(string);
          
            br.close();
            // 2.5 等待读取完毕
            process.waitFor();
       catch (Exception e)
            e.printStackTrace();
      
  

调用方法

public static void main(String[] args) 
// write your code here
        // 反编译APK
        CmdUtils.runCMD("java -jar apktool.jar d 1.apk");
        // 重新打包APK,但是相比之前会少了个签名了的文件。
        CmdUtils.runCMD("java -jar apktool.jar b 1 -o 2.apk");
        // 用这个以默认身份重新签名。
        CmdUtils.runCMD("java -jar signapk.jar testkey.x509.pem testkey.pk8 ../2.apk ../2_signed.apk", "sign");
  

泛型编程

 public static void test4()
?
//       ArrayList<String> strings1 = new ArrayList<>();
//       接口,实现接口的类,存在类似c++中的多态关系
        // c++中模板,在java中称为泛型编程
        List<String> strings = new ArrayList<>();
        strings.add("hello");
        strings.add("hello123");
        strings.add("hello123456");
        strings.add("hello123456789");
?
        System.out.println(strings);
?
        for (int i = 0; i < strings.size(); i++)
            System.out.println(strings.get(i));
      
?
  

文件格式

dom4j­XML解析库

地址:https://dom4j.github.io/

导入dom4j库

① 在项目中新建一个目录libs ② 将xml库文件复制到libs目录 ③ 在idea中导入xml库

菜单左上角file-project structure

技术图片

XmlUtils

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
?
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;
?
public class XmlUtils
    // 获取Document对象,一个xml文件就是一个文档对象
    public static Document getDocument(String xml)
        try
            SAXReader saxReader = new SAXReader();
            InputStream inputStream = new FileInputStream(xml);
            Document doc = saxReader.read(inputStream);
            return doc;
       catch (DocumentException e)
            e.printStackTrace();
       catch (FileNotFoundException e)
            e.printStackTrace();
      
        return null;
  
?
    // 获取元素
    public static Element getElement(Document doc, String name)
        // 获取根节点
        Element root = doc.getRootElement();
        // 返回子节点的元素列表
        List<Element> child = root.elements();
        for (int i = 0; i < child.size(); i++)
            Element element = child.get(i);
            //System.out.println("元素:" + element.getName());
            if (element.getName().equals(name))
          
                return element;
          
      
        return null;
  
    // 获取属性
    public static Attribute getAttr(Element app, String name)
        List<Attribute> atts = app.attributes();
        for (Attribute att: atts)
            //System.out.println("属性:" + att.getName());
            if (att.getName().equals(name))
                return att;
          
      
        return null;
  

?

调用,记得根目录得有xml.xml文件

public static void test2()
  
        Document doc = XmlUtils.getDocument("xml.xml");
        Element element = XmlUtils.getElement(doc,"标签4");
        System.out.println(element.getName());
        Attribute attribute = XmlUtils.getAttr(element,"属性2");
        System.out.println(attribute.getName() + " : "+attribute.getValue());
?
?
  

线程类

// 创建线程,指定回调函数
        Thread thread = new Thread()
            @Override
            public void run()
                super.run();
                System.out.println("thread 1");
           
        ;
        // 启动线程
        thread.start();
        // 方法2
        // 创建 匿名对象
        Runnable runnable = new Runnable()
            @Override
            public void run()
                System.out.println("thread 2");
           
        ;
        // 创建线程,指定回调
        Thread thread1 = new Thread(runnable);
        // 启动线程
        thread1.start();
        // 简写
        new Thread()
            @Override
            public void run()
                super.run();
                System.out.println("thread 3");
           
        .start();

网络编程

public static void test3()
        String urlpath = "http://www.baidu.com";
        try
            // 1. 创建一个URL对象
            URL url = new URL(urlpath);
            // 2. 创建一个连接
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setConnectTimeout(5000);
            // 3. 获取返回数据
            // 3.1 获取返回码
            int ret = httpURLConnection.getResponseCode();
            if(ret == 200)// 200 ok
                InputStream inputStream = httpURLConnection.getInputStream();
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
?
                byte bytes[] = new byte[1024];
                int nReadLen = -1;
                while (true)
                    // 从输入流中读取数据,写入到字节数组中,写入到的数组偏移是0,最大1024
                    nReadLen = inputStream.read(bytes,0,1024);
                    if(nReadLen == -1) break;
                    byteArrayOutputStream.write(bytes,0,nReadLen);
              
                byte bytes1[] = byteArrayOutputStream.toByteArray();
                String s = new String(bytes1);
?
                System.out.println(s);
?
          
?
       catch (MalformedURLException e)
            e.printStackTrace();
       catch (IOException e)
            e.printStackTrace();
      
  

以上是关于Android逆向之Java常用类的主要内容,如果未能解决你的问题,请参考以下文章

Android逆向学习路线

Android逆向之手机环境配置

Android逆向工具简单介绍

Android逆向基础之ARM汇编语言知识总结

Android逆向基础之ARM汇编语言知识总结

Android 逆向类加载器 ClassLoader ( 启动类加载器 | 扩展类加载器 | 应用类加载器 | 类加载的双亲委托机制 )