Chuyu-Team / YY-Thunks

Fix DecodePointer, EncodePointer,RegDeleteKeyEx etc. APIs not found in Windows XP RTM.
MIT License
497 stars 102 forks source link

YY-Thunks提供lib使用模式(lld-link) #30

Closed mingkuang-Chuyu closed 4 weeks ago

mingkuang-Chuyu commented 2 years ago

lld-link 重复符号默认会报告错误,所以YY-Thunks提供修改后的 kernel32.lib ws2_32.lib和advapi.lib

支持这种使用场景

Lib模式大致框架,以RegDeleteKeyExW 函数为例

想法是,向kernel32.lib注入YY-Thunks.obj,然后提供符号YY_Thunks_RegDeleteKeyExW 再向advapi.lib注入WeakAlias,将RegDeleteKeyExW符号自动转发到YY_Thunks_RegDeleteKeyExW

最终RegDeleteKeyExW就被链接器转换到kernel32.lib里的YY_Thunks_RegDeleteKeyExW(YY-Thunks.obj),完成这个链接时Hook。

flowchart TD;
RegDeleteKeyExW-->advapi.lib
advapi.lib-->WeakAlias
WeakAlias-->YY_Thunks_RegDeleteKeyExW
YY_Thunks_RegDeleteKeyExW-->kernel32.lib
kernel32.lib-->YY-Thunks.obj
mingkuang-Chuyu commented 1 year ago

考虑到这样维护成本太高。因为系统自带的经常更新。遇到lld链接时提示符号冲突的,暂时手工忽略一下错误吧。

wangwenx190 commented 1 year ago

怎么手工忽略?lld这个重复符号报错的功能,没法关闭。

mingkuang-Chuyu commented 1 year ago

@wangwenx190 加入 -Wno-XXXX 参数试试?

wangwenx190 commented 1 year ago

@wangwenx190 加入 -Wno-XXXX 参数试试?

不是警告,没法用这个方法屏蔽。重复符号直接报错了。我直接看lld源码,有个-force:multiple的参数,可以允许重复符号,然而我用了发现lld直接崩溃