#include <jni.h>
#include <string>
#include "android/log.h"
#include "substrate.h"
#include "DexFile.h"
#include <unistd.h>
#include <sys/mman.h>
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, "tonghu", __VA_ARGS__)
extern "C"{
int (*original_getAge)(void);
}
extern "C" int replaced_getAge(void) {
LOGI("new get age");
return 99;
}
MSConfig(MSFilterLibrary, "libnative-lib.so")
MSConfig(MSFilterExecutable, "/system/bin/app_process")
MSConfig(MSFilterLibrary, "/system/lib/libdvm.so")
/**
* we must use this to find other app's so
* @param sopath
* @param symbol
* @return
*/
void* lookup_symbol(char* libraryname,char* symbolname)
{
void *imagehandle = dlopen(libraryname, RTLD_GLOBAL | RTLD_NOW);
if (imagehandle != NULL){
void * sym = dlsym(imagehandle, symbolname);
if (sym != NULL){
LOGI("find symbol: %s", symbolname);
return sym;
}
else{
LOGI("(lookup_symbol) dlsym didn't work");
return NULL;
}
}
else{
LOGI("(lookup_symbol) dlerror: %s",dlerror());
return NULL;
}
}
DexFile* (*oldDexFileParse)(const u1* data, size_t length, int flags);
DexFile *newDexFileParse(const u1* addr, size_t len, int dvmdex) {
LOGI("new Dex File Parse");
return oldDexFileParse(addr, len, dvmdex);
}
void hook(char* file, char* symbolName, void *origin, void **result) {
MSImageRef image = MSGetImageByName(file);
void *symbol;
if (image != NULL) {
symbol = MSFindSymbol(image, symbolName);
} else {
symbol = lookup_symbol(file, symbolName);
}
if (symbol == NULL) {
LOGI("Can't find symbol again!!");
return;
}
MSHookFunction(symbol, origin, result);
}
MSInitialize {
LOGI("MSInitialize22");
hook("/data/data/com.th.jnidebugtest/lib/libnative-lib.so", "getAge", (void *)&replaced_getAge, (void **)&original_getAge);
hook("/system/lib/libdvm.so", "_Z12dexFileParsePKhji", (void *)&newDexFileParse, (void **)&oldDexFileParse);
};