android native java_在Android Native层中创建Java虚拟机实例
前言
Android应用中JNI代码,是作为本地方法运行的。而大部分情况下,这些JNI方法均需要传递Dalvik虚拟机实例作为第一个参数。例如,你需要用虚拟机实例来创建jstring和其他的Java对象、查找类或成员变量等。大部分情况下,在你用JNI接口从Java层调用Native层中的代码时,你并不需要在native代码中自己初始化一个Dalvik虚拟机实例。但是,如果你在搞逆向或者写exp,你总是需要钻研各种非常规的情况。
最近,我在逆向时需要在native代码中手动创建虚拟机实例用于在JNI接口函数中传递Java对象。在本文中,我将分享我是如何实现这种方法的。
标准方法
在JNI中创建JVM虚拟机实例的官方文档在地址How to Create a JVM Instance in JNI。但是,不幸的是这种方法在Android上面是不能正常运行的,因为jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*)函数不是导出函数,无法直接调用。假如你不熟悉这个方法的话,可以根据它的名字在jni.h文件中查找一下,确认是否是导出函数。在我这里,jni.h文件位于android-sdk/ ndk-bundle/platforms/android-9/arch-x86/usr/include/jni.h。相关代码如下:
如果你尝试编译调用上述截图中函数的代码,你可能会得到下面的错误:
官方文档中介绍的如何创建JVM的方法在这里可以用来理解上述的API函数和它们的选项和参数的用途。如果你想在Android中使用这些方法,你必须显示从so库中调用这些方法。
官方文档中介绍的如何初始化虚拟机的类路径,在此处是非常有用的。其内容如下:
上面的配置,设置当前的类路径为当前目录(.)。如果你想要虚拟机访问系统或者app的类,这是必须设置的。实验表明,将该值设置为一个目录并不会起作用。我尝试将其设置为/data/local/tmp,同时在该目录下放置了一个dex文件、含有dex文件的jar包和apk文件。只有在设置jar包、dex文件或apk文件的全路径时,上述选项才起作用。奇怪的是,当类路径中没有一个合法的文件时,系统类(例如java.lang.String)都不能访问。换句话说,除非类路径中至少有一个文件,否则语句(*env)->FindClass(env, "java.lang.String")返回0,甚至java.lang.String这样定义在框架中的类都无法访问。
为了测试,下面将一个apk文件push到模拟器或真机设备中。
JavaVMOption的使用如下:
你现在可以使用FindClass函数来加载系统或者app的类。此外,如果你需要加载本地库到你的虚拟机中,例如在静态初始化器中加载一个库文件,你可以使用optionString = "-Djava.library.path=/data/local/tmp"这样的设置。这有个样例代码。
UniccUnlock方法
从文件UniccUnlock.cpp中,展示了另外一种创建虚拟机的类似技巧。我不敢说我完全理解了它在做什么,但是其中吸引我的是get_transaction_code部分。下面是它的做的事:
代码看起来像是根据成员值判断当前设备是否已经解锁或者是解锁方法是否成功。反正我是不很确定,不过我也就想抽取其中创建虚拟机的代码而已。
该方法是通过在库文件libnativehelper.so或者libdvm.so中加载创建虚拟机相关的方法。但是,下面几行代码看起来很奇怪:
任何地方都无法找到这几个方法的文档说明。不过,发现这些方法调用的人相当聪明。如果不调用这些方法,你就会得到下面奇怪的错误信息:
除了这几个奇怪的方法,这种方式创建虚拟机对我很好使。但是,我想知道_ZN13JniInvocationC1Ev方法都做了什么,在不同版本间的Android系统中是否可移植。我的直觉告诉我,硬编码的方法名可能会导致在不同的设备或者Android版本间的不兼容性。
Surfaceflinger 方法
最终,我在谷歌的Surfaceflinger服务的源码中找到了:DdmConnection.cpp。
它默认查找了在libdvm.so中的函数JNI_CreateJavaVM。它没有调用方法_ZN13JniInvocation,而是调用了库libandroid_runtime.so中的Java_com_android_internal_util_WithFramework_registerNatives方法。registerNatives方法的内容在此描述了。
同时,感兴趣的是创建虚拟机的选项:
这些选项在这篇文档中详细描述了。根据文档,它仅仅用于调试JVM时使用。
同时,我注意到它JNI的版本是1_4,但是我设置为1_6了,因为谷歌的样例代码中就是这样设置的。下面就是jni.h中支持的版本号:
最后,我使用上面的方式来创建虚拟机,因为它来自谷歌,具有很好的健壮性和兼容性。
最终代码
下面就是最终的创建虚拟机的代码:
下面是其使用方法:
相关文章:

Qt 学习之路:模型-视图高级技术
PathView PathView是 QtQuick 中最强大的视图,同时也是最复杂的。PathView允许创建一种更灵活的视图。在这种视图中,数据项并不是方方正正,而是可以沿着任意路径布局。沿着同一布局路径,数据项的属性可以被更详细的设置࿰…

3.7Python数据处理篇之Numpy系列(七)---Numpy的统计函数
目录 目录前言(一)函数一览表(二)统计函数1(三)统计函数2目录 前言 具体我们来学Numpy的统计函数 (一)函数一览表 调用方式:np.* .sum(a)对数组a求和.mean(a)求数学期望.…

android图像处理系列之三--图片色调饱和度、色相、亮度处理
原图: 处理后: 下面贴代码: 一、图片处理层: package com.jacp.tone.view; import java.util.ArrayList; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.gra…

JAVA动态读取xml_Java动态生成和解析xml文件步骤详解
packageday12;importjava.io.FileInputStream;importjava.util.ArrayList;importjava.util.List;importorg.dom4j.Document;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;/*** 使用DOM4J解析XML文档*authortarena**/public classParseXMLDemo {public static voidmai…

C++基础知识(二)
八、 继承:让某个类的对象获得另一个类的对象的特性。通过继承可实现代码重用,即从已存在的类派生出的一个新类将自动具有原来那个类的特性。 类的继承还具有:(1)单向性;A类为B类的基类(父类),则…

Spring MVC 学习笔记 对locale和theme的支持
Spring MVC 学习笔记 对locale和theme的支持 Locale Spring MVC缺省使用AcceptHeaderLocaleResolver来根据request header中的 Accept-Language 来确定访客的local。对于前端jsp页面上,spring提供了标签<spring:message>来提供从resource文件中获取的文字的动…

iOS逆向(4)-代码注入,非越狱窃取微信密码
利用LLDB对微信进行分析,然后利用分析的结果,再逐步讲解如何Hook微信的登录过程,截获微信密码。 在上一篇文章(APP重签名)中,已经介绍了如何对APP重签名,并且利用XCode将微信跑起来,既然到了这一步…

java http请求 工具类_Java 实现 Http 请求工具类
1 packagecom.demo.util;23 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6 importjava.io.OutputStreamWriter;7 importjava.net.URL;8 importjava.net.URLConnection;910 public classHttpUtil {11 /**12 * 向指定URL发送GE…

Entity Framework学习三:查询、插入、更新和删除操作
1.LINQ过滤数据 var query from person in context.Peoplewhere person.FirstName.StartsWith("a")select person; var methodQuery context.People.Where(p > p.FirstName.StartsWith("a")); 两种不同的写法,效果一样。 多条件组合查找…

c/s开发基础自学纪录为主
1.常用属性 (1)Name属性:用来获取或设置窗体的名称。 (2)WindowState属性:用来获取或设置窗体的窗口状态。 (3)StartPosition属性:用来获取或设置运行时窗体的…

不错的威盾PHP加密专家解密算法
<?php /*********************************** *威盾PHP加密专家解密算法 http://www.my400800.cn ***********************************/ $filename"phpfilename.php";//要解密的文件 $lines file($filename);//0,1,2行 //第一次base64解密 $content"&quo…

java网络编程udp_java网络编程 UDP网络编程问题
为什么我的代码运行后,黑窗口,不显示一端发来的数据,而是黑窗口打印很多空格?请帮一下,初学者!谢谢,下面是二个具有发送和接受功能的代码?发送端————importjava.net.*;imp...为什…

权限组件(10):三级菜单的展示和增删改查
效果图: 三级菜单的实现和一级、二级菜单差不多。需要注意的是增加三级菜单时,三级菜单是用户提交后在后台通过二级菜单的id添加的。 一、路由分发 rbac/urls.py ... from django.urls import re_pathfrom rbac.views import menu ...urlpatterns [...…

ROS知识(4)----初级教程之常见问题汇总
一、开机启动ROS的工作空间的路径设置失败 现象:在教程:http://wiki.ros.org/cn/ROS/Tutorials/CreatingPackage中的第5.1小节,运行以下命令失败: $ rospack depends1 beginner_tutorials 提示错误:[rospack] Error: …

sql server 海量数据速度提升:SQL优化-索引(11) 【转】
12、高效的TOP 事实上,在查询和提取超大容量的数据集时,影响数据库响应时间的最大因素不是数据查找,而是物理的I/0操作。如: select top 10 * from ( select top 10000 gid,fariqi,title from tgongwen where neibuyonghu办公室or…

java重定向带参数_急 求助重新封装重定向带参数问题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是我写的代码 不知道行不行 求助package base.web.resolver.result;import java.util.HashMap;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.logging.log4j.…

Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)...
本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 写在前面:由于前天项目老师建设局的项目快到验收阶段,所以,前天晚上通宵,昨天睡了大半天,下午我们宿舍聚会&#…

对数组中的数字 1 和 2 进行排序,使得数字 1、2 分别位于前、后部分
问题描述:假设某个数组中只有数字 1 和 2,进行排序,使得数字 1 位于数组前部分,数字 2 位于后部分。 这道算法题其实不是很难,使用各种排序算法应该都能解出,但是若要考虑性能问题,那就得选择一…

@class和#import
class 作用: 可以简单的引用一个类 简单使用: class Dog; 仅仅是告诉编译器,Dog是一个类;并不会包含Dog这个类的所有内容 具体使用: 在.h文件中使用class引用一个类 在.m文件中使用#import包含这个类的.h文件 作用上的…

java登陆界面连接数据库_java 登陆界面怎么写,连接数据库后
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼界面是package 界面类;import javax.jws.soap.SOAPBinding.Use;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing…

C# 汉字编码GB2312转换
功能界面 源码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace wordsConvert {public partial class Fo…

python批量爬取文档
最近项目需要将批量链接中的pdf文档爬下来处理,根据以下步骤完成了任务: 将批量下载链接copy到text中,每行1个链接;再读txt文档构造url_list列表,利用readlines返回以行为单位的列表;利用str的rstrip方法&a…

[Android]webview直接加载网页允许JS,进度条,当前应用内跳转
webview,用于在应用里面直接加载网页本代码参考了:官方的webview实例介绍:https://developer.android.com/guide/tutorials/views/hello-webview.html 加上进度条: http://blog.csdn.net/stoneson/article/details/6068089 整个源…

ubuntu 14.04 安装java_Ubuntu 14.04中安装Java
第三:在Ubuntu 和 Linux Mint上安装Java看了各种类型"java";的不同之后,让我们看如何安装他们。1)在Ubuntu和Linux Mint上安装JRE打开终端,使用下面的命令安装JRE:sudo apt-get install default-jre2)在Ubuntu和Linux M…

C# 生成系统唯一号
生成唯一号:思路,根据yymmddhhmmss自增长号唯一服务器号( SystemNo)生成唯一码,总长度19,例如:1509281204550000101. public class UniqueNumber{private static long num 0;//流水号private static object lockObj …

EBS上用过的一些接口表整理信息
AP接口表:AP_INVOICES_INTERFACEAP_INVOICE_LINES_INTERFACE涉及的请求:应付款管理系统开放接口导入涉及案例: 运费导AP、费用导APPO接口表:申请:PO_REQUISITIONS_INTERFACE_ALL涉及请求:导入申请采购&…

linux源码编译安装nginx
1.从nginx的官方网站下载nginx的安装源码包,要下载.gz格式的包才是linux安装包 网址http://nginx.org/download/ wget http://nginx.org/download/nginx-1.5.9.tar.gz 2.解压 tar -zxvf nginx-1.5.9.tar.gz yum -y install pcre-devel gcc gcc-c autoconf automak…

usr share里没有mysql_无法在ubuntu 12.04上安装mysql,找不到消息文件’/usr/share/mysql/errmsg.sys’...
尝试使用apt-get安装mysql但它失败了# apt-get install MysqL-serverReading package lists... DoneBuilding dependency treeReading state information... DoneThe following extra packages will be installed:MysqL-server-5.5Suggested packages:tinycaThe following NEW …
android:更改PagerTabStrip背景颜色,标题字体样式、颜色和图标,以及指示条的颜色...
1.更改PagerTabStrip背景颜色我们直接在布局中设置background属性可以:<android.support.v4.view.ViewPagerandroid:id"id/pager"android:layout_width"fill_parent"android:layout_height"fill_parent" ><android.support.…

敏捷开发日常跟进系列之二:燃尽图(中)
这是敏捷开发日常跟进系列的第二篇(栏目目录)。 迭代及燃尽图的目标 燃尽图的目标是完成迭代的目标,迭代的目标是什么呢? 1. 按产品经理的要求,交付计划会中计划的用户故事 2. 尽量完成1 之后还会看到,这个…