精华内容
下载资源
问答
  • 编译一个 xx.so 动态库,使用cgo调用so库输入和输出数据。 开发环境: golang调用 xx.so 动态库 DEMO, Centos7, go1.14.4
  • libffmpeg.so动态库

    热门讨论 2014-06-05 16:31:51
    第一次搞这东西,试了几天终于编译出libffmpeg.so动态库,兴奋中……
  • Ubuntu设置当前目录加载so动态库

    千次阅读 2018-10-15 14:24:53
    Ubuntu设置当前目录加载so动态库

    Ubuntu设置当前目录加载so动态库


    如需转载请标明出处:http://blog.csdn.net/itas109
    QQ技术交流群:129518033

    目录


    系统:Ubuntu 16.04.5 64bit

    前置阅读:
    Windows/Linux链接器加载动态库的搜索路径顺序


    前言

    在Ubuntu下开发QT程序,编译之后执行,默认并不会加载当前目录下的动态库,调试比较麻烦。通过Windows/Linux链接器加载动态库的搜索路径顺序,我们知道通过设置LD_LIBRARY_PATH环境变量即可达到目的。有如下三种方式设置:

    1.临时设置

    在终端中输入

    export LD_LIBRARY_PATH=./
    

    然后执行程序。退出终端后失效。

    2.当前用户永久设置

    ~/.profile文件末尾加入两行:

    # set Current path for so library
    LD_LIBRARY_PATH=./
    export LD_LIBRARY_PATH
    

    在这里插入图片描述

    3.所有用户永久设置

    /etc/profile文件末尾加入两行:

    # set Current path for so library
    LD_LIBRARY_PATH=./
    export LD_LIBRARY_PATH
    

    下列命令使/etc/profile立即生效

    source /etc/profile
    

    Refrence:

    1. Windows/Linux链接器加载动态库的搜索路径顺序

    觉得文章对你有帮助,可以扫描二维码捐赠给博主,谢谢!
    在这里插入图片描述
    如需转载请标明出处:http://blog.csdn.net/itas109
    QQ技术交流群:129518033

    展开全文
  • android查看so动态库的接口

    千次阅读 2018-09-30 18:03:51
    使用命令行查看so接口: ...本人测试自己用到的一个so动态库的接口信息如下: 00029104 T Java_com_bjy_ffmpeg_1cmake_1single_utils_FFmpegKit_run U __aeabi_d2lz U __aeabi_f2lz U __aeabi_idiv ...

    使用命令行查看so接口:

    nm -D xxx.so

    本人测试自己用到的一个so动态库的接口信息如下:

    00029104 T Java_com_bjy_ffmpeg_1cmake_1single_utils_FFmpegKit_run
             U __aeabi_d2lz
             U __aeabi_f2lz
             U __aeabi_idiv
             U __aeabi_l2d
             U __aeabi_l2f
             U __aeabi_ldivmod
             U __aeabi_memclr
             U __aeabi_memclr4
             U __aeabi_memclr8
             U __aeabi_memcpy
             U __aeabi_memcpy4
             U __aeabi_memcpy8
             U __aeabi_uidiv
             U __aeabi_ul2d
             U __aeabi_unwind_cpp_pr0
             U __aeabi_unwind_cpp_pr1
             U __android_log_print
    00036048 A __bss_start
             U __cxa_atexit
             U __cxa_finalize
             U __errno
             U __sF
             U __stack_chk_fail
             U __stack_chk_guard
    00036048 A _edata
    00036250 A _end
             U abort
    000361f0 B abort_on_flags
    0000ef88 T assert_avoptions
             U atoi
    00036020 D audio_drift_threshold
    000361c4 B audio_sync_method

     

    展开全文
  • Android 逆向apk的.so动态库

    万次阅读 2017-02-21 17:08:28
    那么我们上篇文章中提及了安全性问题, Android apk如何加固防止被破解(防止逆向编译),那么本篇文章提及一点,so动态库的安全性与重要性。首先我们要知道, .so动态库是做什么用的,它不像.smail文件可修改,它是...

    那么我们上篇文章中提及了安全性问题, Android apk如何加固防止被破解(防止逆向编译),那么本篇文章提及一点,so动态库的安全性与重要性。

    首先我们要知道, .so动态库是做什么用的,它不像.smail文件可修改,它是属于汇编语言,如果直接去修改,文件会发生错乱。早上有人来问我,游戏打入渠道sdk之后发生错误,且只有armeabi里发生错误,这种情况可以断定.so动态库中有了兼容的冲突。

    通常我们会看到libs下面有这么几个文件夹,mips、armeabi、armeabi-v7a和x86,其实是代表着不同的CPU类型,那么在arm下有不同的指令,想要了解的可以参考这篇文章 《Android ARM常用的汇编指令合集》

    实现步骤:

    1. 使用apktool命令编译出来apk的目录
    2. 然后用IDA打开.so文件,在apk根目录的lib文件夹下
    3. 菜单中有个Search,可以用text作为入口
    4. 找到入口,一般为init方法
    5. 使用动态调试,给libdvm.so中的函数:dvmDexFileOpenPartial 下断点,然后得到dex文件在内存中的起始地址和大小,然后dump处dex数据即可
    6. 分析底层加载dex源码,知道有一个函数:dvmDexFileOpenPartial 这个函数有两个重要参数,一个是dex的其实地址,一个是dex的大小,而且知道这个函数是在libdvm.so中的。所以我们可以使用IDA进行动态调试获取信息
    7. 双开IDA开始获取内存中的dex内容,双开IDA,走之前的动态破解so方式来给dvmDexFileOpenPartial函数下断点,获取两个参数的值,然后使用一段脚本,将内存中的dex数据保存到本地磁盘中。
    8. 分析获取到的dex内容,得到了内存中的dex之后,我们在使用dex2jar工具去查看源码,但是发现保存,以为是dump出来的dex格式有问题,但是最后使用baksmali工具进行处理,得到smali源码是可以的,然后我们就开始分析smali源码。

    Tips:

    • debugger模式
    • 通过dump出内存中的dex数据,其实不管apk如何加固,最后都是会加载到内存中的
    • 可以尝试调用so中的native方法,在知道了这个方法的定义之后 adb shell input text 命令来辅助我们的输入

    我们以 趣头条.apk 为例,反向思维来看下这个包是如何加密的,首先我们来看目录结构:

    深圳市米奇云科技有限公司



    我们可以看到,smail里面是没多少代码的,主要的是so动态库和两个jar包,打开jar包来看看:(bdxadsdk.jar 和 gdtadv2.jar )

    深圳市米奇云科技有限公司

    深圳市米奇云科技有限公司



    什么都没有,可以肯定的是,这个是加了壳的,加密方式是怎么样的呢,我们来参考网上一张图:
    深圳市米奇云科技有限公司



    我们先去看下 smail文件里面有什么线索没

    深圳市米奇云科技有限公司


    “libjiagu” 顾名思义,加固,我们发现 ,这个包还加固了。来,继续往下走

    “DexOptJobService_DexOptimization” 动态加载了Dex
    深圳市米奇云科技有限公司



    那么动态加载dex技术是如何处理的?引用一张图来看看,顺便过下这个知识点

    深圳市米奇云科技有限公司

    1. 关于PathClassLoader,API中提及: Android uses this class for its system class loader and for its application class loader(s) —->> Android应用就是用它来加载;

    2. DexClass可以加载apk,jar,及dex文件,但PathClassLoader只能加载已安装到系统中(即/data/app目录下)的apk文件。

    子节点都是从继承BaseDexClassLoader中来的,那我们去看看源码:

    @Override  
    protected Class<?> findClass(String name) throws ClassNotFoundException {  
        List<Throwable> suppressedExceptions = new ArrayList<Throwable>();  
        Class c = pathList.findClass(name, suppressedExceptions);  
        if (c == null) {  
            ClassNotFoundException cnfe = new ClassNotFoundException("Didn't find class \"" + name + "\" on path: " + pathList);  
            for (Throwable t : suppressedExceptions) {  
                cnfe.addSuppressed(t);  
           }  
            throw cnfe;  
        }  
         return c;  
    }

    从代码中我们发现,当我们需要去找class时,是从pathList中的findClass方法中读取,查看源码,可以发现pathList是DexPathList类的一个实例,我们接着来看findClass(name, suppressedExceptions);

    public Class findClass(String name, List<Throwable> suppressed) {  
        for (Element element : dexElements) {  
            DexFile dex = element.dexFile;  
            if (dex != null) {  
                Class clazz = dex.loadClassBinaryName(name, definingContext, suppressed);  
                if (clazz != null) {  
                    return clazz;  
                }  
            }  
       }  
        if (dexElementsSuppressedExceptions != null) {  
            suppressed.addAll(Arrays.asList(dexElementsSuppressedExceptions));  
        }  
        return null;  
    }

    看完之后我们可以发现,它是遍历一个装在dex文件(每个dex文件实际上是一个DexFile对象)的数组(Element数组,Element是一个内部类),然后依次去加载所需要的class文件,直到找到为止。

    public String inject(String libPath) {  
        boolean hasBaseDexClassLoader = true;  
        try {  
            Class.forName("dalvik.system.BaseDexClassLoader");  
        } catch (ClassNotFoundException e) {  
            hasBaseDexClassLoader = false;  
        }  
        if (hasBaseDexClassLoader) {  
            PathClassLoader pathClassLoader = (PathClassLoader)sApplication.getClassLoader();  
            DexClassLoader dexClassLoader = new DexClassLoader(libPath, sApplication.getDir("dex", 0).getAbsolutePath(), libPath, sApplication.getClassLoader());  
            try {  
                Object dexElements = combineArray(getDexElements(getPathList(pathClassLoader)), getDexElements(getPathList(dexClassLoader)));  
                Object pathList = getPathList(pathClassLoader);  
                setField(pathList, pathList.getClass(), "dexElements", dexElements);  
                return "SUCCESS";  
            } catch (Throwable e) {  
                e.printStackTrace();  
                return android.util.Log.getStackTraceString(e);  
            }  
        }  
        return "SUCCESS";  
    }

    看到这里,注入的解决方案也就浮出水面,假如我们将第二个dex文件放入Element数组中,那么在加载第二个dex包中的类时,应该可以直接找到。

    OK,这个知识点到底结束,我们知道了这个apk的加固与加载dex方式,那如何逆向分析这个.so动态库?

    等我稍后整理下图片,先发布了,持续更新。

    展开全文
  • C语言调用so动态库的两种方式

    万次阅读 多人点赞 2018-07-23 00:27:02
    这种方式生成的程序会在启动时候就加载so动态库。 add.h int add(int x, int y); add.c #include &quot;add.h&quot; int add(int x, int y) { return (x + y); } main.c #include &amp;lt;...

    方式1:类似静态库的调用(使用头文件)

    这种方式生成的程序会在启动时候就加载so动态库。

    add.h

    int add(int x, int y);

    add.c

    #include "add.h"
    
    int add(int x, int y) {
        return (x + y);
    }

    main.c

    #include <stdio.h>
    #include "add.h"
    
    int main()
    {
        int sum = add(7, 8);
        printf("7+8 = %d\n", sum);
    
        return 0;
    }

    编译so,生成libadd.so。

    gcc -shared -o libadd.so add.c

    编译main,使用-L./指定add库在当前目录。

    gcc -o main main.c -L./ -ladd

    方式2:使用dlopen/dlsum动态加载动态库(不使用头文件)

    这种方式生成的程序会在代码执行到指定行位置加载so动态库。

    add.c

    int add(int x, int y) {
        return (x + y);
    }

    main.c

    #include <stdio.h>
    #include <dlfcn.h>
    
    int main()
    {
        /*手动加载指定位置的so动态库*/
        void* handle = dlopen("./libadd.so", RTLD_LAZY);
        int (*add)(int a, int b);
    
        /*根据动态链接库操作句柄与符号,返回符号对应的地址*/
        add = dlsym(handle, "add");
    
        int sum = add(7, 8);
        printf("7+8 = %d\n", sum);
    
        dlclose(handle);
        return 0;
    }

    编译so,生成libadd.so

    gcc -shared -o libadd.so add.c

    编译main,不需要指定libadd.so相关信息进行编译,执行时候会在指定目录加载so

    gcc -o main main.c -ldl

    两种调用方式总结

    方式1使用头文件,所以可以直接调用头文件声明的函数。编译的时候指定了动态库位置和名称,程序启动时候系统就会自动加载相应位置的so动态库。
    方式2没有头文件,编译的时候也不需要指定动态库信息。但是需要在程序中使用dlopen函数加载相应位置的so动态库,且要使用dlsym函数根据函数符号去查找此函数的地址。


    BONUS: so动态库中调用so动态库

    add.h

    int add(int x, int y);

    add.c

    #include "add.h"
    
    int add(int x, int y) {
        return (x + y);
    }

    sum.h

    void printsum(int a, int b);

    sum.c

    #include "sum.h"
    #include <stdio.h>
    #include "add.h"
    
    void printsum(int a, int b){
        int sum = add(a, b);
        printf("%d+%d = %d\n", a, b, sum);
    }

    main.c

    #include "sum.h"
    
    int main()
    {
        printsum(1, 3);
        return 0;
    }

    编译libadd.so

    gcc -shared -o libadd.so add.c

    编译libsum.so,需要指定libadd.so信息

    gcc -shared -o libsum.so sum.c -L. -ladd

    编译main,仅需要指定libsum.so

    gcc -o main main.c -L. -lsum

    main运行的时候同时需要libsum.so 和 linadd.so。

    展开全文
  • C语言——SO动态库与编译

    千次阅读 2020-03-15 14:47:31
    SO动态库与编译库的概念定义库存在的意义定义库的种类如何编译一个动态库动态库与静态库区别 库的概念 定义 在windows平台和linux平台下都大量存在着库。Android中也存在着库,库顾名思义,指的是一个容器文件,...
  • 1、so动态库文件的生成; 首先编写.c源文件和.h头文件; 使用gcc编译工具编译生成.so文件 gcc -shared source.c -o libname.so 或gcc -shared -fPIC source.c -o libname.so -fPIC具体的意思需要查一下; ...
  • QT 生成.so动态库时,会默认生成.so .so.1 .so.1.0 .so.1.0.0四个文件,其中其他三个文件都是指向.so.1.0.0这个实际的库文件的链接文件,为了版本控制。 要想直接生成.so作为实际库文件,可以在.pro工程文件中添加...
  • 我的工作最近需要用到linux下构建多目录下Makefile产生so动态库样例的知识,我将最新的学习心得,做一个记录分享,以便以后需要使用时可以做参考。
  • so 动态库文件和静态库文件区别

    千次阅读 2019-10-24 15:49:52
    so 动态库文件和静态库文件区别 在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式。ELF(Executable and Linking Format,可执行连接格式)。 ELF文件分类 ELF文件格式包括三种主要...
  • 最近在学习go,因为需要调用c语言打包成的so动态库里面的方法,避免自己再去造轮子,所以想直接使用golang调用so,但是参考了其他博客大佬写的,我每一步原封不动的写下来,结果都是一堆错误,错误因为没有实时的...
  • 在android实际的开发过程中,经过需要使用到第三方的资源,第三方提供的资源包括apk文件,so动态库文件,.a的静态库文件。 而第三方提供的这些资源,经常需要集成到Android的原生工程中。   集成so动态库,...
  • linux平台java调用so动态库

    千次阅读 2017-03-21 18:00:18
    实现将一个自己编写的Hello.c文件打包成libHello.so动态库,并通过gcc编译工具实现用一个test.c程序调用libHello.so和自定义头文件Hello.h的过程。 具体程序代码如下: //Hello.h文件 include void print...
  • JNI_Android项目中调用.so动态库

    千次阅读 2014-06-03 23:31:51
    JNI_Android项目中调用.so动态库
  • Java小知识:怎么调用dll&so动态库

    千次阅读 2018-12-04 17:17:12
    so动态库的函数 *应用背景:项目中需要调用一项其他平台提供的服务,是一位C语言老大哥写的,可牛啦。但是因为一些特殊原因导致不能通过API调用的方式实现,最终的解决方案是老大哥把他的程序封装成so和dll动态库,...
  • linux下java调用.so动态库方法: JNA

    千次阅读 2019-01-02 17:35:27
    linux下java调用.so动态库方法: JNA 摘自:http://blog.csdn.net/todorovchen/article/details/21319033 另请参见: http://blog.sina.com.cn/s/blog_8cfbb9920100zy7g.html LINUX 下 JNA 调用 so--正确版 项目...
  • 项目中需要调用so动态库中的方法来实现需要的功能,所以需要在java项目中通过jni的方式实现调用。 本次学习记录所对应的场景为: 已经有so库和对应方法的头文件提供。 项目提供的so和头文件不是jni的头文件,...
  • Linux下指定so动态库的加载路径

    千次阅读 2019-07-01 16:43:20
    1、在配置文件/etc/ld.so.conf中指定动态库搜索路径(需要添加其它库文件的路径,在文件的最后添加具体的路径即可 [ 如:/usr/local/lib ],添加后保存退出,然后在命令行ldconfig 2、通过环境变量LD_LIBRARY_PATH...
  • Objdump查看依赖so动态库文件

    万次阅读 2012-10-11 15:42:14
    在做系统跨平台移植的时候,需要知道生成的o文件需要的so动态库文件,就可以使用下命令了。 zchx@ubuntu:~/workspace/mips_UDP/g++build$ ls a.out UDP_Multicast.cpp zchx@ubuntu:~/workspace/mips_UDP/...
  • 最近项目中用到了java调用linux系统下c的so动态库的需求,实现后我就来总结一波 实现方式: 1.java使用jni调用so库: 需要自己定义native方法,编译.h文件,编写c文件,在linux上编译为so文件,巴拉巴拉。。。 总之...
  • c语言调用c语言的so动态库

    千次阅读 2017-02-07 15:17:05
    1.环境  ubuntu14.o4 gcc 4.8.4 2.文件生成 1)源码 //clTest.c ...int add(int a, int b) { ...}2)生成文件 ...gcc -shared -o libclTest.so clTest.c会在当前目录生成文件libclTest.so 3.主程序 1)
  • linux下so动态库一些不为人知的秘密

    千次阅读 2018-07-04 17:55:35
    linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面知识。 基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看...
  • c++调用c++的so动态库

    千次阅读 2017-02-08 17:12:00
    1.环境  ubuntu 14.04  g++ 4.8.4 2.没有类的情况 1)文件 a)源码 ...extern "C" int add(int a, int b) { ...}b)生成文件 ...g++ -shared -o libcppl1.so cppl1.cpp会在当前目录生成文件lib
  • 使用cmake生成.so动态库

    万次阅读 2019-02-01 20:29:10
    下面是实例,把OpenGL绘图的程序打包成libGLTranslation.so动态库 头文件GLTranslation.h // // Created by czh on 1/18/19. // #ifndef GLTRANSLATION_H #define GLTRANSLATION_H #include "iostream" #...
  • 使用JNA调用c/c++的so动态库函数

    千次阅读 2018-09-03 16:33:49
    最近项目收到个需求,需要调用c写的函数,给的是so文件,查阅了资料,so文件为linux下的动态库函数文件,windos下为dll文件。传统方案用JNI方式进行连接,大致看了下JNI方式实在麻烦,崩溃中找到JNA,并成功实现了...
  • 如何编译成.so动态库

    千次阅读 2011-09-09 18:51:28
    问:我源文件为main.c, x.c, y.c, z.c,头文件为x.h,y.h,z.h ...如何编译成.so动态库? 编译器用gcc 最好能给出详细参数解释,谢谢 答: # 声称动代连接库,假设名称为libtest.so gcc x.c y.c z.c -fPIC
  • Qt Creator调用C语言编译的.So动态库

    千次阅读 2016-03-23 10:40:08
    动态库是libS8.so,头文件是s8.h。  刚开始做的时候,使用QLibrary进行加载这个动态库,发现始终加载不到,带着郁闷去问了卖家~结果他们说搞这个产品的工程师离职了,这实在太坑了。  没办法,我只能自食其力了,上...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 145,754
精华内容 58,301
关键字:

so动态库