Xposed hook函数内有匿名内部类该怎么写

Xposed hook函数内有匿名内部类该怎么写,第1张

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,获取其他应用内部存储的数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9711012.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存