精华内容
下载资源
问答
  • 第三方so库中函数一部分为JNI接口函数,一部分为非JNI接口函数,如何在安卓调用非JNI接口函数?若自己写一个so库来调用第三方库并调用其中非JNI接口函数如何实现
  • 利用poison注入工具,能够将demo.so 注入到测试apk中,但是不会自动调用onLoad方法 。看poison源码是调用了mmap和dlopen,怎么才能出发onLoad函数呢?
  • 一.Android平台如果要调用一些C/C++语言的所编译生成的库的函数一般要进行一下几个步骤。  1.确保我们的so库是用 ndk 或者 arm-linux-androideabi-gcc编译而成,如何编译参考上一篇文章。  2.如果我们的安卓...

    一.Android平台如果要调用一些C/C++语言的所编译生成的库的函数一般要进行一下几个步骤。


         1.确保我们的so库是用 ndk 或者 arm-linux-androideabi-gcc编译而成,如何编译参考上一篇文章。


         2.如果我们的安卓应用程序是在studio中开发用java所写,那么我们 需要配置以下内容:


    a:  去Android官网下载NDK并配置到我们的studio中,gradle.properties文件中加上一句:

    android.useDeprecatedNdk=true //不加有可能导致编译不成功
    

    b:  因为我们是用java调用c/c++,需要我们需要使用jni,创建一个类并实现Jni规范中本地方法

    public class NdkTest {
        static {
            System.loadLibrary("NdkTest");  //我们要生成的so库的名字,前缀和后缀名去掉
        }
    
        public static native String myAdd(); //我们java调用c所实现的jni方法,我们要做的就是在这个jni函数中去调用没有jni规范的c/c++函数
    }
    

                   

    c:在studio这rebuild,为这一个类生成.class文件


                    d:调用jdk中的javah,为这个.class文件生成一个.h文件


                    e:在我们app目录下创建jni文件夹,将.h文件放入,并创建.c或者.cpp文件去实现我们的.h中的函数,在这些函数中我们就可以调用第三方的so库了


                    f:将第三方so或者第三方的c源码及我们的.h一同放入jni目录下,并书写Android.mk 及  Application.mk文件,进行编译规程的书写,至于如何写mk文件,可以参考上一篇文章或者自行百度,有海量的资料。


                    g:书写过mk文件之后我们可以直接在stdio下调用命令行进行ndk-build编译,会在libs目录下生成.so文件,注意我们studio默认寻找的路径是jnilibs,如果不想改gradle的话可以直接在jni下创建jnilibs目录,将.so放入,这是一个坑,一定要注意。


                    h:编译完成以后我们就可以直接在类中直接调用我们刚开始定义的native方法进行与c语言的通信了。


         3.如果我们的Android应用是在qt中用c++开发的话,因为没有涉及到jni,所以简单很多:


                     a: 将用我们编译好的so库直接在pro文件中LIB中进行引用,或者直接调用项目,在build apk 选项中,有add library中进行添加。


                     b:将.h在.pro中进行引入。


                     c:直接在.cpp中直接调用就可以了。


      e:没事了,就是这么方面。



    二: 碰到的一些坑


                 1.在我们jni实现的函数中如果去调用so中的函数,一定要用dlopen、dlsym、dlclose去查找so及加载so中的函数,切记切记,我在这上面吃了很大的亏。


                 2.利用javah生成.h文件的时候,一定要 cd到你Android工程的bin/classes目录下,包含完整类名,不带.class。


                 3.加载so的顺序一定要注意,一定要注意。


                 4.注意一些jni类型的数据的转换。



    展开全文
  • 如果在java层还好说,大部分都是在so层,而且自定义的算法较多,加壳,混淆,这时候我们就可以尝试调用它们app的so文件,其中常见的手段就是签名验证,首先打开jadx-gui分析出java层加密调用so层方法顺着找上去发现...

    在逆向过程中经常会遇到各种加密,如果在java层还好说,大部分都是在so层,而且自定义的算法较多,加壳,混淆,这时候我们就可以尝试调用它们app的so文件,其中常见的手段就是签名验证,首先打开jadx-gui分析出java层加密调用so层方法

    615cff5683bb?from=timeline

    顺着找上去发现调用so文件

    615cff5683bb?from=timeline

    直接找到加载so文件的地方

    615cff5683bb?from=timeline

    将so文件copy到我们demo中开启一个http服务,直接调用下encyptString方法

    615cff5683bb?from=timeline

    615cff5683bb?from=timeline

    615cff5683bb?from=timeline

    发现并没有返回真正的加密结果,一定so层做逻辑效验了,我们找到这个so文件,使用ida打开,找到导出的函数

    615cff5683bb?from=timeline

    发现采用的方式是动态注册(静态注册是以java_包名_类名_方法名开头的,否则就是动态注册)动态注册会加载JNI_OnLoad 函数,我们进入这个函数

    615cff5683bb?from=timeline

    可视效果太差了,我们导入jni.h头文件(百度搜下载即可,简单的说就是java和c的翻译官),右键选择JNIEnv

    615cff5683bb?from=timeline

    发现代码瞬间清晰了很多

    615cff5683bb?from=timeline

    找到RegisterNative第3个参数0ff_7004就是我们导出的函数地址,我们进入这个函数,找到java层导出的函数地址sub_3DC4,因为so采用的是Thumb指令,所以要+1

    615cff5683bb?from=timeline

    跟进去,查看下思维导图

    615cff5683bb?from=timeline

    可以看代码执行的逻辑很简单无非就是一个判断,我们F5转换成伪C代码

    615cff5683bb?from=timeline

    发现ERROR_9304好眼熟啊

    615cff5683bb?from=timeline

    这正是我们demo返回的错误信息,由此可得出,if里面肯定就是正常逻辑了,else里面就是返回错误的逻辑,我们继续跟进sub_15C0

    615cff5683bb?from=timeline

    可以看到通过反射拿到当前app的签名和正确的签名做比较,如果不确实是否有签名验证,就直接打开字符串窗口Shift+F12,搜索"signatures",如果有就毋庸置疑了,我们并不关心他是怎样的逻辑,我们关心的只是他的返回值,直接找到返回值v4

    615cff5683bb?from=timeline

    615cff5683bb?from=timeline

    可以看出如果v4等于0的时候那么肯定就是错误的逻辑,我们只需要让v4变量的初始化值为1或者直接修改返回值为1,这里我们采用第二种方式,回到汇编处

    615cff5683bb?from=timeline

    CMP R0,#0  这句话就是比较R0寄存器(sub_15C0的返回值)的值如果为0则跳转到BEQ对应的函数地址,我们直接将R0寄存器值改为1,其汇编就是CMP R0,#1,找到对应的16进制3DD8

    615cff5683bb?from=timeline

    使用010编辑器打开当前so文件,Ctrl+G跳转到该函数地址处,将00直接改成01,之后保存修改

    615cff5683bb?from=timeline

    再次打开so文件查看修改后的结果。

    615cff5683bb?from=timeline

    将修改后的so文件放到demo中请求,得到结果如下:

    615cff5683bb?from=timeline

    615cff5683bb?from=timeline

    成功获取到结果

    615cff5683bb?from=timeline

    文章仅供学习交流,禁止一切商务用途。

    展开全文
  • android jni调用so

    千次阅读 2017-08-01 08:54:13
    今天,讲讲android studio 使用jni调用其他so库的使用。 首先说一下在网上查找资料时,对于调用第三方so库,有人说有两种方法: 1. 对于so库的API符合JNI格式(即使用javah指令生成的头文件中那种格式),...

    今天,讲讲android studio 使用jni调用其他so库的使用。


    首先说一下在网上查找资料时,对于调用第三方so库,有人说有两种方法:

    1.    对于so库的API符合JNI格式(即使用javah指令生成的头文件中那种格式),可以在Java代码中声明它对应的native方法,直接调  用。

        比如,jni方法名为: jstringJNICALL Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv *,jobject);    (即前缀 Java+包名+类名+方法名)

        那么这个方法名就是在java中声明的native方法名:publicnative String  stringFromJNI();


    2.    对于so库的API不符合JNI格式,需要自己编写c/c++源文件,在该源文件实现自己的JNI格式native函数,在JNI函数中调用第三方so库的函数,再在java中调用自己实现的JNI格式的native方法。这种方法更加灵活。



    一.首先需要配置NDK环境。

    这个可以直接参考这篇博客http://blog.csdn.net/xiaoyu_93/article/details/52870395


    二.编写简单的jni程序,然后编写

    Android.mk文件,Application.mk文件。


    编写jni程序很简单,在网上自己找资料就可以。主要是在Android.mk里调用so库

    Android.mk的代码:

    LOCAL_PATH := $(call my-dir)
    
    
    
    include $(CLEAR_VARS)
    LOCAL_MODULE    := HW_H265dec_Andr               //HW_H265dec_Andr是库的名称
    LOCAL_SRC_FILES := libHW_H265dec_Andr.so
    LOCAL_EXPORT_C_INCLUDES := src/main/jni
    include $(PREBUILT_SHARED_LIBRARY)
    
    include $(CLEAR_VARS)
    LOCAL_SHARED_LIBRARIES := HW_H265dec_Andr  
    LOCAL_MODULE := HWH265_API
    LOCAL_SRC_FILES =: HWH265_APIs.cpp             //HWH265_APIs.cpp是C++文件的名称
    include $(BUILD_SHARED_LIBRARY)
    
    TARGET_CPU_API := armeabi                         //表示编译平台只是移动平台
    APP_ABI := armeabi


    这个就是告诉HWH265_APIs.cpp引用了libHW_H265dec_Andr.so库。


    接着在HWH265_APIs.cpp就可以调用库的代码。


    Application.mk的代码很简单:

    APP_STL:=gnustl_static
    APP_CPPFLAGS:=-frtti -fexceptions
    APP_ABI := armeabi #表示 编译目标 ABI(应用二进制接口)
    


    这样就完成了jni导入so库。


    android jni调用so库就讲完了、


    就这么简单。


    
    展开全文
  • 分为三个部分elf部分,so部分及Android部分 1、elf部分编程 #include <stdio.h> #include <stdlib.h> #include <dlfcn.h> typedef void(*pfnkill)(int);//函数类型指针,这个函数用来结束...

    分为三个部分elf部分,so部分及Android部分
    Android部分代码是用eclipse实现,elf 与so的源文件必须都是.c或者.cpp不能否则会出错

    1、elf部分编程

    #include <stdio.h>
    #include <stdlib.h>
    #include <dlfcn.h>
    typedef void(*pfnkill)(int);//函数类型指针,这个函数用来结束指定的进程
    typedef int(*pfnadd)(int,int);///列出正在运行的进程
    const char path[50]="/data/local/tmp/libHelp.so";
    int main()
    {
    	int pid=0;//保存要结束的进程的pid
    	printf("%s\n",path);
    	void *handler=dlopen(path,RTLD_NOW);
    	if(NULL==handler)
    	{
    		printf("dlopen fail!!!!!!!");
    	}else
    	{
    		printf("加载成功!!!!!!!");
    	}
    	pfnadd add=(pfnadd)dlsym(handler,"add");
    	printf("1+2=%d\n",add(1,2));
    	//system("ps");
    	pfnkill KillPro=(pfnkill)dlsym(handler,"KillPro");
    	printf("请输入要结束的进程的pid:\n");
    	scanf("%d",&pid);
    	KillPro(pid);///执行命令结束进程
    }
    

    2、so部分

    #include <stdio.h>
    #include <stdlib.h>
    void KillPro(int pid)
    {
    	char str[50]={0};
    	sprintf(str,"kill %d",pid);///来自stdio.h文件
    	system(str);///执行kill命令结束pid对应的进程
    
    }
    int add(int a,int b)
    {
    	system("ps");//执行ps命令列出正在执行的进程
    	return a+b;
    }
    

    在这里插入图片描述

    3、android调用so文件的函数实现

    3.1在eclipse的libs目录下面新建armeabi目录,用来存放待调用的so文件。

    这个目录下的文件待安装之后会将文件安装到“/data/data/com.example.jiutian01/lib/”目录下面如下图
    在这里插入图片描述

    3.2 eclipse新建一个java类文件

    使用System.loadlibrary指令加载so文件,使用native关键字声明方法,声明的方法要在so的源文件.cpp中实现
    在这里插入图片描述

    3.3生成新建java类的.class与.h文件

    3.3.1生成.class文件

    找到新建Java类如上图的soloader.java的目录
    E:\adt-bundle-windows-x86_64-20140321\workspace\jiutian01\src\com\example\jiutian01
    在这里插入图片描述
    在该目录下开一个cmd窗口,输入“javac soloader.java”命令生成soloader.class文件
    在这里插入图片描述

    3.3.2 生成.h文件

    cmd窗口退到src目录下面在这个目录下面执行cmd命令“javah -jni com.example.jiutian01.soloader”,生成.h文件“com_example_jiutian01_soloader.h”
    javah -jni 包名.类名(不带文件扩展名)
    在这里插入图片描述
    com_example_jiutian01_soloader.h文件的内容如下,这个头文件是C++的头文件,所以so的源文件也要改成.cpp,Android.mk文件的源文件名也要改为.cpp。
    调用了“jni.h”头文件,并声明了两个方法如下图

    在这里插入图片描述

    3.4生成so(如果调用外部的so文件,那么这里可以在生成的so源文件里面调用外部so文件的函数或方法)

    **新建一个jni目录下面包含源文件,Android.mk、Application.mk。源文件如下:需要包含“jni.h”与上面生成的头文件,然后添加java类中接口函数的实现
    ndk-build生成so文件
    **
    在这里插入图片描述

    3.5将生成的so文件复制到3.1新建的armeabi目录下面eclipse调试程序。

    有的文章说要加入下面的权限,没有感到起作用


    下面是so函数的调用代码,分别调用so文件的add函数与KillPro函数

    int pid=android.os.Process.myPid();
    			Log.v("tag", "将要加载!!!!!!!!!!!!!!!!!"+pid+"");
    			Log.v(null, "10+20="+soloader.add(10,20)+"");
    			soloader.KillPro(3903);
    			Log.v("tag", "加载完毕!!!!!!!");
    //			android.os.Process.killProcess(android.os.Process.myPid());
    //			System.exit(0);
    //			ActivityManager manager=(ActivityManager)getSystemService(ACTIVITY_SERVICE);
    //			manager.killBackgroundProcesses(getPackageName());
    

    打印调试信息如下:成功计算10+20=30说明调用so文件成功!
    在这里插入图片描述

    展开全文
  • 调用so中未导出函数的两种方法

    千次阅读 2019-02-26 18:34:45
    typedef void (*PrintTest)() ; LOGW("handc 00000"); void *hand = 0;//dlopen("... //我编译时so为64位,所以dlopen也需要是64位的。(同时ps -Z时进程不能是untrusted_app) vo...
  • SO库为Android版本连接库(*.so文件)作用:以后只要开发提供给我们接口说明,我们就可以直接做接口测试了,不再需要一个个的抓包去分析,降低做接口测试的技术难度 一般项目里调用自己的so的方法是:将SO文件直接...
  • 原文:...实现了在UBUNTU LINUX环境下使用dlopen函数动态调用.so链接库。但是也提到了在Android下未能成功。由于Android也是使用linux内核,因此估计程序本身可能并
  • Android 逆向调用so(一)

    千次阅读 2016-09-28 19:38:25
    就索性暂时取名为“Android 逆向调用so(一)”,可能到后来脑洞一开实现一个进阶篇,这谁说的来呢是吧 原理篇: 前提: 先写一个简单的Demo,比如实现一个最简单针对IDA反附加的反调试,在移动端这一块反调试还算...
  • 在这篇文章(【09.03.25】Linux环境中dlopen函数的简单应用)...实现了在UBUNTU LINUX环境下使用dlopen函数动态调用.so链接库。但是也提到了在Android下未能成功。由于Android也是使用linux内核,因此估计程序本...
  • 我决定利用Android NDK并编写一个Java程序来加载库并进行适当的函数调用.为了测试这是如何工作的,我尝试编写一个简单的程序,它将加载’libm.so’并进行任意函数调用.这看起来像我能想到的NDK的一个小问题,但我遇到了...
  • android调用 so 动态链接库

    千次阅读 2013-10-08 20:48:20
    作者之前也认为能够使用 java 调用 so 动态链接库之后便可以在 android 同样实现,但是发现将 so 文件导入 android 项目后,启动时导入动态链接库总是报错 错误为:Cannot load libraray 、not a avlid ELF
  • Android so文件函数加密

    千次阅读 2019-02-28 17:36:27
    经过上次写完在ELF文件中根据函数名找函数,就准备开始编写so文件函数加密,这里这是对代码进行加密,还没有对函数名做混淆,会放到下次写。还有本次的测试机是nexus4,操作系统为android 4.4。 二、函数加密 一般...
  • Android如何调用第三方SO

    千次阅读 2016-07-08 10:38:29
    转自:http://zwz94.blog.163.com/blog/static/3206039520131111101412959/问题描述:Android如何调用第三方SO库;已知条件:SO库为Android版本连接库(*.so文件),并提供了详细的接口说明;已了解解决方案:1.将SO...
  • android中经常通过调用系统函数open等打开/proc/pid/maps 检测自身是否运行于VirtualApp 或者被注入。现将android下关于内核函数调用的几种方法总结如下,欢迎补充。 1、直接导入调用系统函数 调用库函数,包括...
  • 本文介绍如何实现Android 与 QT 的结合,使Android能够调用QT的代码,避免重复造轮子最近在做AndroidStudio调用QT写的so库,在网上搜集资料,大多数都不全,而且很少有AndroidStudio版本,于是将自己这几日的心得做...
  • 比如 有个库A.so 想使用另外一个库B.so里的函数调用B.so中的get_value()函数获取该库中的变量值。 B.so里的这个变量值是上层通过JNI控制的,是变化的 可是我在A.so里把从B.so里获取的值打出来 一直是一个不变的...
  • 由于项目要求有时候需要...so文件是C、C++的函数库,在Android调用这些库,使用的是JNI( Java Native interface),这篇文章 会介绍 使用Android Studio 如何生成so文件,及如何使用so。 (1)NDK环境安装 ...
  • 打印android函数调用

    千次阅读 2019-02-21 10:44:05
    1. java层 Exception e = new Exception("TAG"); e.printStackTrace();...Android在5.0, 6.0里加入了CallStack类,这个类可以打出当前的backtrace。 确保包含头文件#include &lt;utils/Ca...
  • 前言 我在一个工程中生成了so文件,在另外一个工程中调用该so文件中的函数。 环境 :androidstudio4+ubuntu20+ida ... 生成so文件 ...调用so函数 创建一个不包含ndk工程的项目 创建jniibs文件,将so库
  • 4.调用so文件 so文件copy到android项目的libs/armeabi目录下 最后输出一下结果: 以上就是本篇文章对Android JNI开发流程的梳理,希望可以帮助开发 JNI的朋友。 您可能感兴趣的文章:android开发实践之ndk编译...
  • 什么是 so插件化简单的来说就是:把数据处理或者算法在外部 so 库实现,当算法或者数据处理的逻辑需要改变的时候 在项目代码完全不变动的情况下 只要修改 so 库然后更新 so就实现修改。需要会下面的东西: 生成 so ...
  • Android 调用 底层C 语言函数demo,对于初学者来说够用了,流程参考http://www.cnblogs.com/ouyangduoduo/p/5900040.html
  • Android 调用So 1. 新建so工程,useso为新的生成的so,native-lib为第一步生成的so名称 MyClass.h为第一步的.h文件 调用方式 C++的源码—》jni 接口中调用C++的接口===》android调用(JNI) JNI相当于一个中转。 ...
  • android 自定义so库使用与方法调用demo 这个是一个自定义的so实例使用
  • Android studio加载so调用本地方法

    千次阅读 2019-02-19 11:56:03
    先把so文件放到APP的libs目录下: 编辑app下的build.gradle文件: 在build.gradle下添加,和defaultConfig、buildTypes同级: sourceSets { main { jniLibs.srcDirs = ['libs'] } }  在dependencies中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,111
精华内容 22,044
关键字:

安卓so调用so函数