This commit is contained in:
2022-02-04 01:42:04 +08:00
parent 6feaa6cf1b
commit a03fefa879
4 changed files with 37 additions and 3 deletions

View File

@@ -36,13 +36,15 @@ import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
private var a = "没更改的变量"
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
// for test // for test
AlertDialog.Builder(this) AlertDialog.Builder(this)
.setTitle("Hook 方法返回值测试") .setTitle("Hook 方法返回值测试")
.setMessage(test() + "\n模块是否已激活:${YukiHookModuleStatus.isActive()}") .setMessage(test() + "\n变量:$a\n模块是否已激活:${YukiHookModuleStatus.isActive()}")
.setPositiveButton("下一个") { _, _ -> .setPositiveButton("下一个") { _, _ ->
AlertDialog.Builder(this) AlertDialog.Builder(this)
.setTitle("Hook 方法参数测试") .setTitle("Hook 方法参数测试")

View File

@@ -33,6 +33,7 @@ import com.highcapable.yukihookapi.demo.BuildConfig
import com.highcapable.yukihookapi.demo.InjectTest import com.highcapable.yukihookapi.demo.InjectTest
import com.highcapable.yukihookapi.demo.MainActivity import com.highcapable.yukihookapi.demo.MainActivity
import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker
import com.highcapable.yukihookapi.hook.type.BundleClass
import com.highcapable.yukihookapi.hook.type.StringType import com.highcapable.yukihookapi.hook.type.StringType
class MainHooker : YukiBaseHooker() { class MainHooker : YukiBaseHooker() {
@@ -40,6 +41,18 @@ class MainHooker : YukiBaseHooker() {
override fun onHook() = override fun onHook() =
loadApp(name = BuildConfig.APPLICATION_ID) { loadApp(name = BuildConfig.APPLICATION_ID) {
MainActivity::class.java.hook { MainActivity::class.java.hook {
injectMember {
method {
name = "onCreate"
param(BundleClass)
beforeHook {
field {
name = "a"
type = StringType
}.set(instance, "这段文字被修改成功了")
}
}
}
injectMember { injectMember {
method { method {
name = "test" name = "test"

View File

@@ -53,6 +53,18 @@ class MainInjecter : YukiHookXposedInitProxy {
encase(BuildConfig.APPLICATION_ID) { encase(BuildConfig.APPLICATION_ID) {
loadApp(name = BuildConfig.APPLICATION_ID) { loadApp(name = BuildConfig.APPLICATION_ID) {
MainActivity::class.java.hook { MainActivity::class.java.hook {
injectMember {
method {
name = "onCreate"
param(BundleClass)
beforeHook {
field {
name = "a"
type = StringType
}.set(instance, "这段文字被修改成功了")
}
}
}
injectMember { injectMember {
method { method {
name = "test" name = "test"

View File

@@ -153,7 +153,7 @@ class YukiHookCreater(private val packageParam: PackageParam, val hookClass: Cla
* @param initiate 方法体 * @param initiate 方法体
* @return [FieldFinder.Result] * @return [FieldFinder.Result]
*/ */
fun field(initiate: FieldFinder.() -> Unit) = fun HookParam.field(initiate: FieldFinder.() -> Unit) =
try { try {
FieldFinder().apply(initiate).find() FieldFinder().apply(initiate).find()
} catch (e: Throwable) { } catch (e: Throwable) {
@@ -161,7 +161,7 @@ class YukiHookCreater(private val packageParam: PackageParam, val hookClass: Cla
onNoSuchMemberCallback?.invoke(e) onNoSuchMemberCallback?.invoke(e)
onFailureCallback?.invoke(e) onFailureCallback?.invoke(e)
if (onNoSuchMemberCallback == null && onFailureCallback == null) onHookFailureMsg(e) if (onNoSuchMemberCallback == null && onFailureCallback == null) onHookFailureMsg(e)
null FieldFinder().Result()
} }
/** /**
@@ -372,6 +372,13 @@ class YukiHookCreater(private val packageParam: PackageParam, val hookClass: Cla
*/ */
inner class Result { inner class Result {
/**
* 设置变量实例
* @param instance 变量所在的实例对象 - 如果是静态可不填 - 默认 null
* @param any 设置的实例内容
*/
fun set(instance: Any? = null, any: Any?) = fieldInstance?.set(instance, any)
/** /**
* 得到变量实例 * 得到变量实例
* @param instance 变量所在的实例对象 - 如果是静态可不填 - 默认 null * @param instance 变量所在的实例对象 - 如果是静态可不填 - 默认 null