Cydia Substrate是一个基于Hook的代码修改框架,其可以在Android、iOS平台使用,并实现修改系统默认代码。这里关注的是其在Android下的使用方式和基本原理。
使用说明
Substrate SDK实现了对Native API和Java API的Hook技术。
使用条件:
Java API Hook实例
修改AndroidManifest.xml
添加权限
<uses-permission android:name="cydia.permission.SUBSTRATE"/>在Application中需要添加meta-data,这里value可以替换成自己的实现类
<meta-data android:name="com.saurik.substrate.main" android:value=".Main"/>
实现类必须有一个静态的 initialize方法,没有参数,返回为空
- 编译时需要将substrate-api.jar放入project/libs
相关源码:
MS.hookClassLoad("android.telephony.SmsManager",
new MS.ClassLoadHook() {
public void classLoaded(Class<?> arg0) {
Method sendTextMessage;
try {
sendTextMessage = arg0.getMethod("sendTextMessage",
new Class[] {
String.class,
String.class,
String.class,
PendingIntent.class,
PendingIntent.class
});
} catch (NoSuchMethodException e) {
sendTextMessage = null;
}
if (sendTextMessage != null) {
final MS.MethodPointer old = new MS.MethodPointer();
MS.hookMethod(arg0, sendTextMessage,
new MS.MethodHook() {
public Object invoked(Object arg0,
Object... args)
throws Throwable {
Log.d("SMSHOOK", "pid = " + android.os.Process.myPid() +
"uid = " + android.os.Process.myUid());
Log.d("SMSHOOK", args[0] + ":" + args[2]);
return old.invoke(arg0, args);
}
}, old);
}
}
});
运行结果:
09-20 10:28:12.121: D/SMSHOOK(2095): before send.
09-20 10:28:12.141: D/SMSHOOK(2095): pid = 2095uid = 10000
09-20 10:28:12.141: D/SMSHOOK(2095): 10086:test hello world.
Native Hook 实例
相关Android.mk
LOCAL_MODULE := smshook.cy LOCAL_SRC_FILES := main.cpp LOCAL_LDLIBS := -L$(LOCAL_PATH)/../lib -lsubstrate-dvm- lib后缀为.cy.so
- 需要以CPP方式编译
- 需要链接libsubstrate-dvm.so
相关AndroidManifest.xml
添加权限
<uses-permission android:name="cydia.permission.SUBSTRATE"/>installLocation设置
android:installLocation="internalOnly"Application相关设置
Application的android:hasCode="false"
相关源码:
MSConfig(MSFilterExecutable, "/system/bin/app_process")
static jint (*_Resources$getColor)(JNIEnv *jni, jobject _this, ...);
static jint $Resources$getColor(JNIEnv *jni, jobject _this, jint rid) {
jint color = _Resources$getColor(jni, _this, rid);
return color & ~0x0000ff00 | 0x00ff0000;
}
static void OnResources(JNIEnv *jni, jclass resources, void *data) {
// ... code to modify the class when loaded
jmethodID method = jni->GetMethodID(resources, "getColor", "(I)I");
if (method != NULL)
MSJavaHookMethod(jni, resources, method,
&$Resources$getColor, &_Resources$getColor);
}
// this is a macro that uses __attribute__((__constructor__))
MSInitialize {
// ... code to run when extension is loaded
MSJavaHookClassLoad(NULL, "android/content/res/Resources", &OnResources);
}
您好,使用您的方法不打印log怎么回事?确定是按你说的做的
ReplyDelete