new Inner()后面的一对花括号,表示的是匿名内部类,此类的父类显然是Object,实现接口Inner。 Inner是接口,接口和抽象类都是不能直接实例化的,也就是说 Inner in = new Inner();这样写是不能通过编译的,不过java的语法支持就地使用一个匿名类来实现所有的抽象方法(接口的所有方法声明和抽象类的所有抽象方法)
因为 dexposed 其实是用了dvm和art调用class的方式来做的, 而dvm和art的头文件什么的在android源码中, 所以下一份源码, 具体办法见上一个博文:准备android源码库
最简单的hook
MainActivity中有个test函数, 原来返回11111, 在调用hook之前正常返回的; 调用hook之后, 调用 同一个函数 , 但是却返回22222
public class MainActivity extends Activity
{
static {
SystemloadLibrary("hookdemo");
}
public static final String TAG = "===[hookdemo]===";
@Override
protected void onCreate(Bundle savedInstanceState)
{
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
String param1 = "param1";
Logd(TAG, "===========before hook test:" + thistest(param1));
hook(MainActivityclass, "test", "(Ljava/lang/String;)Ljava/lang/String;");
Logd(TAG, "===========after hook test:" + thistest(param1));
Logd(TAG, "===========before hook staticTest:" + thisstaticTest(param1));
hook(MainActivityclass, "staticTest", "(Ljava/lang/String;)Ljava/lang/String;");
Logd(TAG, "===========after hook staticTest:" + thisstaticTest(param1));
}
public static String staticTest(String param1)
{
return "staticTest";
}
public String test(String param1)
{
return "11111";
}
public native void hook(Class<> clazzToHook, String methodName, String methodSig);
}
ndk 中的部分
#include <jnih>
#include "logh"
#include "Dalvikh"
void showMethodInfo(const Method method)
{
//看看method的各个属性都是啥:
LOGD("accessFlags:%d",method->accessFlags);
LOGD("clazz->descriptor:%s",method->clazz->descriptor);
LOGD("clazz->sourceFile:%s",method->clazz->sourceFile);
LOGD("methodIndex:%d",method->methodIndex);
LOGD("name:%s",method->name);
LOGD("shorty:%s",method->shorty);
}
/
替换原来java类中test方法的 本地c 函数
args : 原来函数的参数数组
pResult: 返回值
/
static void newTestMethod(const u4 args, JValue pResult,
const Method method, struct Thread self) {
showMethodInfo(method);
// args 是原来函数的参数数组, 原来test函数只有一个String型参数
// 并且要注意, 如果是不是static函数, 下标0 是函数所在类的实例obj
// 在dvm中Object, jni 中的jobject 和 java 中的 Object类 都不是同一个东西
// String类对应StringObject
// 取出参数打印出来看看
StringObject param1 = NULL;
if(dvmIsStaticMethod(method))
param1 = (StringObject)args[0];
else
param1 = (StringObject)args[1];
LOGD("param1:%s",dvmCreateCstrFromString(param1));
//JValue 是个union ,要返回int 就 pResult->i=1; 返回Object对象就 pResult->l = ojb;
// 但是, 在dvm中的Object, jni 中的jobject 和 java 中的 Object类 都不是同一个东西
// 所以, 我们这里使用dvm的函数来创建一个StringObject
pResult->l = dvmCreateStringFromCstr("newTestMethod");
// 一般情况应该使用宏 : RETURN_XXX(result);
return;
}
/
hook 的jni 函数
/
extern "C" JNIEXPORT void JNICALL
Java_com_zhaoxiaodan_hookdemo_MainActivity_hook(JNIEnv env, jobject instance, jobject clazzToHook,
jstring methodName_, jstring methodSig_) {
const char methodName = env->GetStringUTFChars(methodName_, 0);
const char methodSig = env->GetStringUTFChars(methodSig_, 0);
jmethodID methodIDToHook = env->GetMethodID((jclass) clazzToHook,methodName,methodSig);
// 找不到有可能是个static
if(nullptr == methodIDToHook){
env->ExceptionClear();
methodIDToHook = env->GetStaticMethodID((jclass) clazzToHook,methodName,methodSig);
}
if(methodIDToHook != nullptr)
{
//主要在这里替换
//jmethodID 在dvm里实际上就是个Method 结构体
Method method = (Method) methodIDToHook;
//看看method的各个属性都是啥:
showMethodInfo(method);
//设置Method 的 accessFlags 为 枚举型
// ACC_NATIVE 表示 这个method 切换成了一个native 方法
// 这个枚举 在 dalvik/libdex/DexFileh
// 类似:
// ACC_PUBLIC = 0x00000001, // class, field, method, ic
// ACC_PRIVATE = 0x00000002, // field, method, ic
// ACC_PROTECTED = 0x00000004, // field, method, ic
SET_METHOD_FLAG(method, ACC_NATIVE);
//既然是一个native方法, 那就把 nativeFunc 指针指向我们的hook, 用来替换test的新方法
method->nativeFunc = &newTestMethod;
// registersSize是函数栈大小, insSize是参数占用大小
// 如果是native方法, 就没有额外开销了
// 所有开销就是参数占用, 所以把它设置成跟参数占用空间
method->registersSize=method->insSize;
//未知
method->outsSize=0;
}
env->ReleaseStringUTFChars(methodName_, methodName);
env->ReleaseStringUTFChars(methodSig_, methodSig);
}
extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM vm, void reserved)
{
JNIEnv env = nullptr;
if (vm->GetEnv((void) &env, JNI_VERSION_1_6) != JNI_OK) {
return -1;
}
return JNI_VERSION_1_6;
}
运行之后得到:
===[hookdemo]===﹕ ===========before hook:11111
[---hookdemo---]﹕ 1
[---hookdemo---]﹕ Lcom/zhaoxiaodan/hookdemo/MainActivity;
[---hookdemo---]﹕ MainActivityjava
[---hookdemo---]﹕ 334
[---hookdemo---]﹕ test
[---hookdemo---]﹕ LL
[---hookdemo---]﹕ param1:
===[hookdemo]===﹕ ===========after hook:22222
最近在负责一个项目,需要获取其他应用的内部存储中的文件,即data/data/下的文件,并转存到sdcard上。有一点Android基础的都知道data/data/中的文件对其他应用是不可见的,在没有源码的条件下,无法直接访问data/data中的文件。问了公司的大佬,大佬提供了两种思路,一种是run-as命令进入data/data,直接copy;另一种是hook。具体怎么实施,且听我慢慢道来。
安装包是debug包(release包也可以利用反编译重新打包,变成debug包,网上有很多文章可以参考)
1、连接手机到电脑,打开usb调试
2、命令行中输入 adb shell run-as <包名>
示例:
comssandroidugcaweme(抖音)不是debug包,无法使用run-as命令。
comexampleyilialinjsonreport(我自己写的app)是debug包,使用run-as命令可以进入data/data目录下,输入 ls ,可以看到data/data目录下的所有文件/文件夹
3、输入 cat <文件名> > <sdcard中的文件名> ,直接拷贝到sdcard中
示例:
不出现任何提示,表明已经成功拷贝到了sdcard中。
几行命令直接搞定
1、需要手工敲命令,难以实现自动化
2、debug包才能使用
没有限制,安装包是release包或者debug包都可以,手机不需要root
有关于xposed插件可以参考文章:>
root权限是指获取手机系统的最高管理员权限,可删减系统文件、卸载系统应用。
ROOT之后可能会由于误 *** 作导致手机出现未知故障,比如导致手机死机、重启、甚至变砖,同时也会影响正常的三包服务。
CoIorOS致力于为用户提供安全,稳定,轻快的 *** 作系统,所以不开放root权限。
因手机系统版本不同 *** 作路径可能会略有差异,请以手机实际 *** 作界面显示为准。
本回答适用于所有OPPO机型。
1、Xposed 框架需要使用安装器进行安装,所以我们需要先安装Xposed 框架安装器,安装完成打开后点击框架(如图中红框位置),进行框架的安装。 2、点击后进入框架安装、升级界面,我们点击“安装/更新”,会出现ROOT授权提示,许可即可。这里小编给大家个提醒,为了Xposed 框架及以后各种模块的良好运行建议使用好的授权管理,目前各种一键ROOT生成的各种授权管理程序可能无法满足Xposed 框架及以后各种模块的需求。建议使用SuperSU Pro。Xposed 框架安装完成后重启手机才能激活,可直接点击重启也可手动重启。 3、我们安装Xposed 框架是为了使用各种模块,而增强手机的各种功能。在Xposed 框架安装器中可以点击“下载”进入模块仓库下载自己需要的模块,不过这里全是英文,可能与小编一样英文不好的朋友用起来有难度。还有个方法就是,直接安装需要的模块后,在Xposed 框架安装器中点击“模块”进入模块界面进行勾选,这里以红色守护的试验性功能为例,勾选后模块就开始发挥作用了。
在OPPO手机系统版本上安装xposed框架,安装之前手机需要获取root权限,root权限是指获取手机系统的最高管理员权限,可删减系统文件、卸载系统应用,可能会导致手机死机、重启,甚至变砖,同时也会影响正常的三包服务。
不建议您root手机。
通常玩机root需要先解锁手机的BL(BootLoader)。
OPPO手机目前不支持root。
root可能会导致手机死机、重启,甚至变砖,同时也会影响正常的三包服务,因此不建议您root手机。
如果您要root的话,建议您去申请深度测试,深度测试是官方提供的解锁途径,参与深度测试后,您可以解锁手机的BL,进而修改手机系统,实现刷机、root等各种深度玩机 *** 作。
但是加入深度测试之后同样可能会对手机造成不可预估的影响,建议您谨慎选择是否要加入深度测试。
本回答适用于OPPO全系机型。
以上就是关于Xposed hook函数内有匿名内部类该怎么写全部的内容,包括:Xposed hook函数内有匿名内部类该怎么写、如何做一个简单的android勾子 Xposed原理副本、Android无root,获取其他应用内部存储的数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)