hamflx / huawei-pc-manager-bootstrap

解决非华为电脑无法安装华为电脑管家的问题。
340 stars 40 forks source link

你能製作花瓣的DLL嗎 #12

Closed MeowTechOpenSource closed 1 year ago

MeowTechOpenSource commented 1 year ago

需要hook註冊表, 未讀取 SMBIOS 信息(version.dll hook ok) "HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS\SystemProductName"="MRG-W76"

hamflx commented 1 year ago

没懂啥意思。

MeowTechOpenSource commented 1 year ago

做一個DLL可以hook登錄,改"HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS\SystemProductName"做"MRG-W76"

hamflx commented 1 year ago

如果是进程级别的 hook,直接在 version crate 里面 hook 对应注册表 api 就行了吧,系统级的我还不太会。

MeowTechOpenSource commented 1 year ago

是進程,但我不太懂 hook..

MeowTechOpenSource commented 1 year ago

可以給一些代碼嗎?謝謝!

hamflx commented 1 year ago

https://github.com/hamflx/huawei-pc-manager-bootstrap/blob/9fbc31310c2da2c25aee69d64df93effb3ca92e5/packages/common/src/common.rs#L107

你可以看这一段代码,用的是 detour-rs crate,HookCreateProcessW.initialize(需要hook的函数,你自己的函数),然后在你自己的函数里面,可以直接返回一个自己定义的值,也可以调用 HookCreateProcessW.call() 函数去调用原来的函数。

当然,前提是你的代码已经在目标进程的地址空间。本仓库是用 version.dll 来模仿系统的 version.dll,这样进程会优先加载我的 version.dll,然后我的代码就进入目标进程的地址空间了。代码位于 packages/version。

或者你可以考虑用远程线程等其他方式将进程注入到目标进程的地址空间。比如本仓库的 https://github.com/hamflx/huawei-pc-manager-bootstrap/blob/9fbc31310c2da2c25aee69d64df93effb3ca92e5/packages/common/src/common.rs#L459 就尝试注入到子进程。

以上两者都需要考虑架构问题,x86 不能注入 x64,x64 不能注入 x86,当然也有例外,比如“天堂之门”之类的技术。

MeowTechOpenSource commented 1 year ago

我只能做到這(很多錯誤),你能幫我嗎,而且我也不知道如何修改自己定义的值https://github.com/MeowTechOpenSource/huawei-pc-mgr-petal-clip-bootstrap

hamflx commented 1 year ago

https://github.com/MeowTechOpenSource/huawei-pc-mgr-petal-clip-bootstrap/pull/1

我帮你改了以下,解决了编译错误,但是逻辑我没有去看,逻辑需要你自己完成了。

hamflx commented 1 year ago

至于如何修改自定义的值,这得看注册表相关 API 的流程了,你要 hook OpenKey、QueryValue,然后在 OpenKey 中你去匹配这个函数的 key 和 subkey 如果满足,则记录下 handle、key、subkey,在 QueryValue 中拿 handle 比较,找到 key、subkey,再根据 QueryValue 的 lpValueName 就能拿到完整的注册表路径,再比较这个路径是否为所需的,如果是所需的路径,则设置缓冲区为你自己的值即可,如果不匹配则调用原来的函数返回。

另外,注册表需要 hook 吗?你直接改注册表的值不是更好吗?