/* * Create a constructor for our Proxy class. The constructor takes one * argument, a java.lang.reflect.InvocationHandler. */ static void createConstructor(ClassObject* clazz, Method* meth) { meth->clazz = clazz; meth->accessFlags = ACC_PUBLIC | ACC_NATIVE; meth->name = "<init>"; meth->prototype = gDvm.methJavaLangReflectProxy_constructorPrototype->prototype; meth->shorty = gDvm.methJavaLangReflectProxy_constructorPrototype->shorty; // no pDexCode or pDexMethod int argsSize = dvmComputeMethodArgsSize(meth) + 1; meth->registersSize = meth->insSize = argsSize; meth->nativeFunc = proxyConstructor; }
/* * Create a method in our Proxy class with the name and signature of * the interface method it implements. */ static void createHandlerMethod(ClassObject* clazz, Method* dstMeth, const Method* srcMeth) { dstMeth->clazz = clazz; dstMeth->insns = (u2*) srcMeth; dstMeth->accessFlags = ACC_PUBLIC | ACC_NATIVE; dstMeth->name = srcMeth->name; dstMeth->prototype = srcMeth->prototype; dstMeth->shorty = srcMeth->shorty; // no pDexCode or pDexMethod int argsSize = dvmComputeMethodArgsSize(dstMeth) + 1; dstMeth->registersSize = dstMeth->insSize = argsSize; dstMeth->nativeFunc = proxyInvoker; }
bool HookDalvikMethod(jmethodID jmethod){ Method *method = (Method*)jmethod; //关键!!将目标方法修改为native方法 SET_METHOD_FLAG(method, ACC_NATIVE); int argsSize = dvmComputeMethodArgsSize(method); if (!dvmIsStaticMethod(method)) argsSize++; method->registersSize = method->insSize = argsSize; if (dvmIsNativeMethod(method)) { method->nativeFunc = dvmResolveNativeMethod; method->jniArgInfo = computeJniArgInfo(&method->prototype); } }