+ -
当前位置:首页 → 问答吧 → 有没有对Android、linux动态链接库熟悉的同学,帮忙看一下这个问题如何解决,多谢了!

有没有对Android、linux动态链接库熟悉的同学,帮忙看一下这个问题如何解决,多谢了!

时间:2011-07-17

来源:互联网

背景:

Android工程里使用了从别处购买的动态库so文件,但是担心程序发布的时候so文件被其他人获取到,并且非法使用库中的函数接口,因此需要制定一套保护机制。

 

思路:

1)对发布的apk做特殊处理,使别人无法通过解压apk获取so文件。或者:

2)在程序中对所有调用so中函数接口进行“认证”,非法用户即使得到so文件,也无法正确调用。

第一种方案请对android编程熟悉的同学帮忙看看,是否可行?这个网上我没有看到相关的文章,也没有试过,所以拜托各位了!

 

第二种方案我的设想是:

1、对so中所有的函数进行“二次封装”,增加一个参数用来校验函数调用者是否合法。

2、对封装后的代码,重新编译一个新的so文件,发布的时候将新的so文件打包进去,旧的so文件不打包。

3、程序中使用新的so文件,调用新的函数接口,把校验参数传进去。由于校验方法是我们自己做的,因此即使新的so文件被非法获取,他们不知道这个校验值如何计算,调用函数接口时会失效。


实验过程:

1、目前购买了 liba.so 和 a.h 文件,a.h中有函数声明:void func(int i);
2、编写mya.c 和 mya.h,创建新的函数:

#include "a.h"

void myfunc(int i, int key)
{
  if(key!=123456)
  {
  return;
  }

  func(i); // 调用了购买的函数
}
3、将mya.c 和 liba.so 编译成新的so文件 libmya.so
gcc mya.c -L. -la -shared -o libmya .so

4、创建我的应用myapp.c,在应用程序里调用myfunc接口

#include "mya.h"

int main(int args, char ** argv)
{
  int i=1;
  int key=123456;

  myfunc(i,key);

  return 0;
}

5、将myapp编译成可执行程序
gcc -o myapp myapp.c -L. -lmya

6、ldd测试myapp动态链接情况,发现myapp同时依赖于 liba.so 和 libmya.so 文件,这样的话,发布的时候必须要 liba.so 和 libmya.so 一起打包。
有没有办法让 myapp 只依赖于 libmya.so 文件啊?我试了一下编译libmya.so的时候,加上了 -static 选项,ldd 结果还是一样。

另外,除了上面2种思路外,还有没有其他比较便宜、可行的方法?

作者: Walkac   发布时间: 2011-07-17

so本来就是动态运行的,所以要都存在才可以,除非楼主从他们公司购买的是.a文件,这样才可以达到楼主要求的效果。

作者: jernymy   发布时间: 2011-07-17

安全问题,不好处理啊,加密处理下。

作者: lyzzzwx   发布时间: 2011-07-17