Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何hook namespace里的api #2

Open
MarsToken opened this issue Dec 9, 2024 · 4 comments
Open

如何hook namespace里的api #2

MarsToken opened this issue Dec 9, 2024 · 4 comments

Comments

@MarsToken
Copy link

MarsToken commented Dec 9, 2024

`

let file = fileIo.openSync(context.cacheDir+'/test.txt',fileIo.OpenMode.CREATE|fileIo.OpenMode.WRITE_ONLY)

fileIo.writeSync(file.fd,'写入的测试文本')

fileIo.closeSync(file.fd)

`
如上代码,我想要hook fileIo的openSync、writeSync,如何实现呢?
fileIo为命名空间

@GkLwPp
Copy link
Collaborator

GkLwPp commented Dec 24, 2024

fileIo.openSync 属性不可改,无法直接修改。 可结合plugin方式修改(参考掘金文章:https://juejin.cn/post/7403261114762543154?searchId=20241224143855132D1C6C1BA6B8234D7E)
image

@MarsToken
Copy link
Author

MarsToken commented Dec 26, 2024

好的。但是还有个问题,还是这个案例:感觉有个奇葩的语法导致的。
首先typescript有如下语法及规则:
Test.ts文件:
declare interface Test { //没有对外部暴露
tagert: string;
}

export function test1():Test|null{
return null
}
hook.ts文件:
import { test1 } from "./Test";
let tset1=test1()
test1?.tagert //此属竟然能访问到

我的需求是重定向fileIo的openSync函数传递的路径,配合插件使用发现,代理函数无法定义返回值类型,因为它的返回值是File
image
image
而File不是export无法调用到,但是我业务中只需要hook并重定向path参数,由于无法定义返回值File
image
导致找不到红框file对象。
image
有解决方案吗?

@MarsToken
Copy link
Author

总结来说就是:我需要修改openSync的第一个运行时参数,把它改为我定义的路径,仅此而已(不影响它下边的代码执行);但是呢,由于File不是export的,导致替换方法的返回值无法定义

@GkLwPp
Copy link
Collaborator

GkLwPp commented Dec 30, 2024

看描述:需求是 1.hook 一个属性不可改的函数2.修改函数部分参数-继续调用原是函数
可以尝试以下步骤:
1.编译时:通过plugin 将 属性不可改的函数openSync 代码调用 replace 为myOpenSync
2.运行时:通过AspectPro.replace 函数 hook myOpenSync,此方式可以拿到原始函数 & 参数, 进而实现修改参数 & 继续调原始函数。步骤2如图所示:
image
方便的话,可以贴下你的demo

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants