180715 安卓-防护基本策略(Native方法)

Native方法

安卓的底层是Linux实现,但实际上程序入口是在Dalvik虚拟机中,作为字节码和运行在虚拟机中的代码本身就不具备太强的安全性,另一方面虚拟机的执行效率也是众所周知的

因此安卓允许通过so库的加载来调用底层linux执行代码,这就是Native方法

具体使用方法为在java层中使用System.loadlibrary(“test”),虚拟机会去载入libtest.so文件,同时去产生一个Load事件,这个事件触发后程序会去查找并执行JNI_OnLoad函数。相对的也存在一个UnLoad事件,触发JNI_OnUnLoad函数。

不过这个函数并不是强制要求的,用户也可以不去实现。它只是用来执行初始化和善后工作。相当于DLL_Main、构造函数一类的。

用户在so中编写的函数名必须为Java_类名_方法名的样式,才能在java中调用。Dalvik会在函数列表中查找该函数来执行

但是这样一方面会使得函数过于明显,另一方面每次调用函数Dalvik虚拟机都会去函数列表中查找函数进行调用,导致效率被极大影响

对应的解决方案就是显式注册,将Native方法挂载到一个函数链表中,虚拟机会优先查找该列表,查找不到时才会再去函数列表

显式注册会使得Native方法不会在函数列表中出现,而是作为结构体中的函数指针
不过对于熟手而言,当函数列表中找不到方法时自然而然会去想到寻找显式注册的JNI方法,因此用处并不是很大

混淆

Native中可以通过JNI指针调用java层的方法,并且静态反编译器都是将java层和native层分开处理的,这样使得native调用的函数没法被交叉引用捕捉到

因此对于代码量较大的程序,可以使用java层->native函数->java层的方法来调用,使得静态分析受到很大的阻力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值