JNI

Android.Hook框架Cydia篇

∥☆過路亽.° 提交于 2020-03-02 19:49:23
Cydia Substrate是一个代码修改平台.它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的.而Xposed只支持HOOK app_process中的java函数,因此Cydia Substrate是一款强大而实用的HOOK工具. 官网地址:http://www.cydiasubstrate.com/ 官方教程:http://www.cydiasubstrate.com/id/38be592b-bda7-4dd2-b049-cec44ef7a73b SDK下载地址:http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip 0x00Hook Java 层 之前讲解过 xposed 的用法为啥还要整这个了,下面简单对比两款框架.想了解之前 xposed 篇的可以看这里: http://drops.wooyun.org/tips/7488 劣势 : 没啥错误提醒,排错比较麻烦. 需要对 NDK 开发有一定了解,相对 xposed 模块的开发学习成本高一些. 因为不开源网上(github)上可以参考的模块代码很少. 优势: 可以对 native 函数进行 hook . 与 xposed hook 原理不一样,因为不是开源具体原理我也不清楚. 结果就是一些Anti hook 可能对

NIO-EPollSelectorIpml源码分析

十年热恋 提交于 2020-03-02 14:26:21
目录 NIO-EPollSelectorIpml源码分析 目录 前言 初始化EPollSelectorProvider 创建EPollSelectorImpl EPollSelectorImpl结构 fdToKey 管道文件描述符 EPollArrayWrapper 注册 doSelect 关闭EpollSelectorImpl 总结 相关文献 NIO-EPollSelectorIpml源码分析 目录 NIO-概览 NIO-Buffer NIO-Channel NIO-Channel接口分析 NIO-SocketChannel源码分析 NIO-FileChannel源码分析 NIO-Selector源码分析 NIO-WindowsSelectorImpl源码分析 NIO-EPollSelectorIpml源码分析 前言 本来是想学习Netty的,但是Netty是一个NIO框架,因此在学习netty之前,还是先梳理一下NIO的知识。通过剖析 源码 理解NIO的设计原理。 本系列文章针对的是JDK1.8.0.161的源码。 NIO-Selector源码分析 对 Selector 的功能和创建过程进行了分析,本篇对Linux环境下JDK实现的 EPollSelectorImpl 源码进行详细讲解。 本篇文章不会对EPoll算法进行详细介绍,对epoll算法感兴趣或还不了解的同学可以看

NDK开发,没有你想象的那么难

人盡茶涼 提交于 2020-03-01 05:50:49
NDK:Native Development Kit原生开发工具 NDK能干什么:NDK使得在android中,java可以调用C函数库。 为什么要用NDK:我们都知道,java是半解释型语言,很容易被反汇编后拿到源代码文件,在开发一些重要协议时,我们为了安全起见,使用C语言来编写这些重要的部分,来增大系统的安全性。还有,在一些接近硬件环境下,相信大家都清楚C与java的优劣。顺带提一下: NDK并不能显著提升应用效率 。why?我们都觉得C语言比起java来说效率要高出很多,一方面,随着jdk的不断更新,java的效率也随之提高;另一方面,即便使用C语言编码提高了应用效率,但是在java与C相互调用时平白又增大了开销。 对于这些问题,这里就不多说了,希望详细了解的,请各位自行搜索。 NDK开发,第一步,当然是搭建环境 首先,去 http://developer.android.com/tools/sdk/ndk/index.html 下载你对应平台的开发工具 接着,我们需要实现linux环境 下载cygwin http://www.cygwin.com/ (对于64位的用户,可以直接下载我已经下载好的,百度的链接应该比在线安装快一些,正在上传到我的网盘,稍后将地址放在回复里面) 选择在线下载的朋友,建议选择下图的地址,(是国内的) 选择好下载源以后就是选择下载目录了

java通过JNI调用C语言写的函数,能提高运行效率吗?

我只是一个虾纸丫 提交于 2020-03-01 05:06:03
C语言比Java快早就是公认的事实了。 而Java可以通过JNI调用C语言写的库很多人也都知道。 但通过JNI调用C语言写的函数能提高效率吗?一直以来我都认为 是的 。昨晚心血来潮做了个测试,本意是想看看传说中强大的C语言在速度上到底有多强大,结果让我发现了 通过JNI调有C语言并不能提高效率 。不知道这样的结论有没有错,先说一下我测试的过程吧: 第一个测试:用java循环1亿次System.out.printf() 耗时:21 分 34.8 秒 第二个测试:用C语言循环1亿次printf() 耗时:6 分 12.6 秒 刚做完以上两个测试,就深刻体会到了C语言的效率。高兴了十几秒,我就想也许是java的 System.out.printf 和C语言的 printf 有较大区别造成的。于是做了第三个测试。 第三个测试:通过JNI调用C语言的printf(),同样循环1亿次输出 1. 2. 耗时:20 分 23.3 秒(这是第二天的测试的) 使用时间跟直接用java的 System.out.printf 差不多。本人不知道每次调用 native 方法会不会有额外的耗时(先给个不确定的定论:会)也就是说第三个测试之所以不会加速,是因为调用 native 方法时损耗了其它时间,还不能确定 通过JNI调用C语言能不能提高运行效率。又做了第四个测试 第四个测试

NDK学习笔记(二)使用JNI同原生代码通信

一个人想着一个人 提交于 2020-02-29 21:06:53
通常要使用 JNI 技术来实现 Java 应用程序和原生代码的通信。 任何使用JNI的操作都需要两次或者三次函数调用,因此要实现大量的原生方法并让它们同Java类保持同步很容易编程一件非常艰辛的工作。 而利用一些开源的方案则可以帮助我们基于现有的原生代码接口自动生成 JNI 的代码。 学习这项技术,首先需要搞清楚下面这些关键概念: 原生代码如何被Java代码调用到。 原生方法的声明。 从共享库加载原生模块。 使用 C/C++ 来实现原生方法。 原生方法的声明 在Java代码中使用native关键字可以声明原生方法,例如: public native String stringFromJNI(); 注意只是声明而已,“()”这对括弧后面直接就是分号了。 加载共享库 static { System.loadLibrary("hello-jni");//libhello-jni.so } 之所以要在静态代码块中调用 System.loadLibrary ,就是为了Java类首次加载和初始化时就能让原生代码的实现被载入。 在原生代码中实现声明的方法 原生代码是C/C++的,因此要有一个头文件明确要实现那些方法,JDK为我们提供了javah(头文件生成器)来根据已经编译好的class生成头文件,例如: javah –classpath bin/classes com.example

如何在C/C++中调用Java

旧街凉风 提交于 2020-02-29 07:52:36
转的一篇文章,看的不懂,先坐下记录吧~~~ java跨平台的特性使Java越来越受开发人员的欢迎,但也往往会听到不少的抱怨:用Java开发的图形用户窗口界面每次在启动的时候都会跳出一个控制台窗口,这个控制台窗口让本来非常棒的界面失色不少。怎么能够让通过Java开发的GUI程序不弹出Java的控制台窗口呢?其实现在很多流行的开发环境例如JBuilder、Eclipse都是使用纯Java开发的集成环境。这些集成环境启动的时候并不会打开一个命令窗口,因为它使用了JNI(Java Native Interface)的技术。通过这种技术,开发人员不一定要用命令行来启动Java程序,可以通过编写一个本地GUI程序直接启动Java程序,这样就可避免另外打开一个命令窗口,让开发的Java程序更加专业。 JNI答应运行在虚拟机的Java程序能够与其它语言(例如C和C++)编写的程序或者类库进行相互间的调用。同时JNI提供的一整套的API,答应将Java虚拟机直接嵌入到本地的应用程序中。图1是Sun站点上对JNI的基本结构的描述。 本文将介绍如何在C/C++中调用Java方法,并结合可能涉及到的问题介绍整个开发的步骤及可能碰到的难题和解决方法。本文所采用的工具是Sun公司创建的 Java Development Kit (JDK) 版本 1.3.1,以及微软公司的Visual C++ 6开发环境。

JNI Kickstart 小结 02 :桥接至与 Java 无关的纯本地库

你离开我真会死。 提交于 2020-02-28 23:44:41
JNI 程序小结 02 :桥接至与 Java 无关的纯本地库 Java + JNI 桥接库 + 纯本地库 异构程序构建示例。 上文: http://my.oschina.net/typhoon/blog/405527 本文为“加强版”。 编写 Java 程序: [typhoon@localhost sandbox]$ ls 0_guide.txt [typhoon@localhost sandbox]$ mkdir -p src/tfw/rsch/jni [typhoon@localhost sandbox]$ ls 0_guide.txt src [typhoon@localhost sandbox]$ vi src/tfw/rsch/jni/MainTest.java [typhoon@localhost sandbox]$ vi src/tfw/rsch/jni/JniTest_01_Loader.java [typhoon@localhost sandbox]$ vi src/tfw/rsch/jni/JniTest_01_Caller.java [typhoon@localhost sandbox]$ vi src/tfw/rsch/jni/JniTest_02_LoadAndCall.java [typhoon@localhost sandbox]$ vi src

Frida功能封装(二)

社会主义新天地 提交于 2020-02-28 14:36:21
一、封装库 (1).hook jni函数调用 https://github.com/Areizen/JNI-Frida-Hook 二、自己封装 function str2ArrayBuffer(str) { var buf = new ArrayBuffer(str.length); // 1 bytes for each char var bufView = new Uint8Array(buf); for (var i=0, strLen=str.length; i < strLen; i++) { bufView[i] = str.charCodeAt(i); } return buf; } 来源: CSDN 作者: jinangl 链接: https://blog.csdn.net/jinangl/article/details/104550691

理解Android线程创建流程

百般思念 提交于 2020-02-27 17:35:41
copy from : http://gityuan.com/2016/09/24/android-thread/ 基于Android 6.0源码剖析,分析Android线程的创建过程 /android/libcore/libart/src/main/java/java/lang/Thread.java /art/runtime/native/java_lang_Thread.cc /art/runtime/native/java_lang_Object.cc /art/runtime/thread.cc /system/core/libutils/Threads.cpp /system/core/include/utils/AndroidThreads.h /frameworks/base/core/jni/AndroidRuntime.cpp 一.概述 Android平台上的Java线程,就是Android虚拟机线程,而虚拟机线程由是通过系统调用而创建的Linux线程。纯粹的Linux线程与虚拟机线程的区别在于虚拟机线程具有运行Java代码的Runtime. 除了虚拟机线程,还有Native线程,对于Native线程有分为是否具有访问Java代码的两类线程。接下来,本文分析介绍这3类线程的创建过程。 二. Java线程 2.1 Thread.start [-> Thread

Android系统启动-zygote篇

那年仲夏 提交于 2020-02-26 09:38:02
copy from : http://gityuan.com/2016/02/13/android-zygote/ 基于Android 6.0的源码剖析, 分析Android启动过程的Zygote进程 /frameworks/base/cmds/app_process/App_main.cpp /frameworks/base/core/jni/AndroidRuntime.cpp /frameworks/base/core/java/com/android/internal/os/ - ZygoteInit.java - Zygote.java - ZygoteConnection.java /frameworks/base/core/java/android/net/LocalServerSocket.java /system/core/libutils/Threads.cpp 一. 概述 Zygote是由 init进程 通过解析init.zygote.rc文件而创建的,zygote所对应的可执行程序app_process,所对应的源文件是App_main.cpp,进程名为zygote。 service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server class