Cydia Substrate之hook native代码

本文详细介绍了如何使用Cydia Substrate框架hook Android应用的C/C++(native)代码,包括创建目标程序、配置NDK、hook模块的编写和安装。通过示例展示了如何修改函数返回值,强调了extern "C"在C++编译中的作用以及在hook过程中寻找函数地址的重要性。
摘要由CSDN通过智能技术生成

继上次的Cydia  Substrate  hook  java层,这里我将去hook  native层的代码,也即是C/C++代码。

我在网上找了很多资料,发现关于利用cydia hook native的文章没几篇,基本来来去去都是那几个大同小异的,都是介绍如何去hook  dvm加载dex的,估计也就是同一文章而已,只是被互相“借鉴”了。

幸好,我的英语还行,google了一把,发现有个外国小哥写得还挺好的,于是,就“借鉴”了一下~

这里,我并不是hook dvm的内容,而是自己写的一个小程序里的一个函数。

So,首先我们需要利用NDK创建一个要被hook的目标程序。

这里,需要一定的NDK开发知识,即使不懂,下面也会举个小例子简单介绍下NDK的开发,by the way,开发环境是Android Studio。

创建目标程序

1. 新建一个带MainActivity的工程,在该类内,添加加载so库的static块,添加native修饰的函数,然后在onCreate中利用Toast弹窗,调用native 函数,例子如下

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toast.makeText(this, hello(), Toast.LENGTH_SHORT).show();
    }

    static{
        System.loadLibrary("hello");
    }

    public static native String hello();

}
2. 在app/src/main目录下创建名为“jni”的文件夹,并新建hello.cpp文件,代码很简单, 只是调用一个createHello函数返回一个字符串“hello world”:

#include <jni.h>  
#include <stdlib.h>  

extern "C"{

char* createHello(){
    return "hello world";
}

jstring Java_com_samuelzhan_hello_MainActivity_hello
        (JNIEnv *env, jobject obj, jstring str)
{
    return env->NewStringUTF(createHello());
}

}

注意,这里我用extern "C"将上面两个函数括起来,是因为我创建的是cpp文件,编译器用的是C++的,C++编译时,为了函数的重载而在编译后会改变函数名,会导致后面写的hook模块不能根据原来的名字找到函数的地址。下面会有详细解释,先跳过这里,继续下面的步骤。

3. 在jni文件夹下创建一个文件,命名为Android.mk,编写如下代码,与上面创建的cpp文件在同一目录下

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.cpp
LOCAL_LDLIBS = -llog

include $(BUILD_SHARED_LIBRARY)
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值