接着上一回,这样的在
System.loadLibrary("screenshot");
的时候,你的工程调用这个jni中的方法至少能够找到这个方法,不过这个仅仅是第一步。
2 编写包含要hook的系统调用的方法的class
这里要注意的是方法名和返回值都要和系统调用的一模一样,比如系统调用的是 getSystemService 你的class就需要编写成下面的例子
package com.example.jnicalltest;
public class Context {
public Object getSystemService(String type)
{
return new TelephonyManager();
}
}
然后在业务逻辑层里面调用
原来的调用方法 Jnihelper.testobj(MainActivity.this);是这样的
现在修改成
com.example.jnicalltest.Context test = new com.example.jnicalltest.Context();
Jnihelper.testobj(test);
一样的jni方法,但是传入不同的class,当然没那么简单,这样调用的直接结果是程序崩溃
3 直接编辑修改 so
这个时候,就需要请出来大名鼎鼎的ida pro了,不过在这里只是用到了这个软件里面得九牛一毛的功能,甚至连静态分析都不要用,只需要打开看下里面得rodata区里面的变量,在正常情况下 getSystemService 这个方法是放在 android/content/Context 具体名称可能记错了,在api中一查即可
这个时候可以清清楚楚的在 rodata 区域中有这个常量,这个时候修改成
com/example/jnicalltest/Context 即可,这样就jni中的调用就会调用到自己写的class了,从而模拟系统接口,然后欺骗其,混淆jni中的逻辑。
最后 关于例子:
我写了一个很简单的例子传入到附件中,只是把思想描述了一下,没有具体揭露修改so的细节。
转载于:https://blog.51cto.com/sunzeduo/1301657