接着上一回,这样的在


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的细节。