Chuyu-Team / YY-Thunks

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

rust程序可能意外的隐式导入WakeByAddressSingle、ProcessPrng等函数 #78

Closed muyu1944 closed 1 month ago

muyu1944 commented 2 months ago

rust版本:1.78.0 vs版本:2017 vc-ltl版本:5.0.10-beta2 yy-thunks版本:1.0.10-beta3

使用thunk仓库提供的thunk命令编译:thunk --os xp --arch x86 -- --release

缺失dll:api-ms-win-core-synch-l1-2-0.dll 缺失函数:WaitOnAddressWakeByAddressAllWakeByAddressSingle

image

这个库只在编译x86程序时会链接,xp和vista都会链接,编译x64程序不会出现

另外 #76 这个缺失ProcessPrng的现象, 当程序引用tokio的时候,xp x64没问题了,vista x64还是会链接这个函数,目前是只在xp的obj里做了处理,vista的obj还没加上吗?

问题列表

排查记录

2024年5月9日

2024年5月7日

mingkuang-Chuyu commented 2 months ago
mingkuang-Chuyu commented 2 months ago

另外 ProcessPrng的问题就在我们就在之前的问题里统一跟进把,这里只讨论WaitOnAddress、WakeByAddressAll、WakeByAddressSingle,报错问题。

不过Address的那一套接口问题找我没有太大作用,建议自己排查一下thunk工作时链接器顺序。

mingkuang-Chuyu commented 2 months ago

https://github.com/Chuyu-Team/YY-Thunks/releases/tag/v1.0.10-Beta4 该版本开始将ProcessPrng设置为小于 Win7时进行Thunk

muyu1944 commented 2 months ago

@mingkuang-Chuyu

  • 自行调整链接顺序

有什么参考的操作方法吗?比如在vs下是怎么处理的 如果是把yy-thunks设置为默认库的话因为先于标准库被链接所以会有一堆错误,而且即便是这样依然还是缺少api-ms-win-core-synch-l1-2-0.dll

mingkuang-Chuyu commented 2 months ago

@mingkuang-Chuyu

  • 自行调整链接顺序

有什么参考的操作方法吗?比如在vs下是怎么处理的 如果是把yy-thunks设置为默认库的话因为先于标准库被链接所以会有一堆错误,而且即便是这样依然还是缺少api-ms-win-core-synch-l1-2-0.dll

VS里只要在链接器里,顺序比系统的库考前即可,修改的是AdditionalDependencies。

假设之前是AdditionalDependencies=系统库A;系统库B; 修改后就是 AdditionalDependencies=YY-Thunks.obj;系统库A;系统库B;

AdditionalDependencies的内容会按顺序直接传递给链接器,如下所示:

// 注意这里的man.obj  YY-Thunks.obj 系统库A 系统库B,均为文件路径
link  man.obj  YY-Thunks.obj 系统库A 系统库B

至于rust不太清理,但是理论上只要比系统库提前,那就肯定就没问题了。

rust不太熟悉

mingkuang-Chuyu commented 2 months ago

或者你来群里问问别人……QQ群:633710173

muyu1944 commented 1 month ago

@mingkuang-Chuyu 看了一下rust最终调用link.exe的命令参数,然后套了个壳修改了参数的顺序,最终的命令是这样的:

C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.16.27023\bin\HostX64\x86\link.exe
/NOLOGO
/LARGEADDRESSAWARE
/SAFESEH
C:\Users\Administrator\Downloads\Compressed\thunk\objs\x86\YY_Thunks_for_WinXP.obj
C:\Users\ADMINI~1\AppData\Local\Temp\2\rustc4HJL2D\symbols.o
C:\Users\Administrator\Downloads\Compressed\rust\demo\target\i686-pc-windows-msvc\release\deps\demo.demo.fcebccbb40309f07-cgu.0.rcgu.o
/LIBPATH:C:\Users\Administrator\Downloads\Compressed\thunk\TargetPlatform\5.1.2600.0\lib\Win32
/LIBPATH:C:\Users\Administrator\Downloads\Compressed\rust\demo\target\i686-pc-windows-msvc\release\deps
/LIBPATH:C:\Users\Administrator\Downloads\Compressed\rust\demo\target\release\deps
/LIBPATH:C:\Users\Administrator\.cargo\registry\src\mirrors.sjtug.sjtu.edu.cn-7a04d2510079875b\windows_i686_msvc-0.48.5\lib
/LIBPATH:C:\Users\Administrator\.cargo\registry\src\mirrors.sjtug.sjtu.edu.cn-7a04d2510079875b\windows_i686_msvc-0.52.5\lib
/LIBPATH:C:\Users\Administrator\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\i686-pc-windows-msvc\lib
C:\Users\ADMINI~1\AppData\Local\Temp\2\rustc4HJL2D\libstd-9e573f08bb1b5b36.rlib
C:\Users\Administrator\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\i686-pc-windows-msvc\lib\libcompiler_builtins-986082c24092962a.rlib
windows.0.52.0.lib
ntdll.lib
windows.0.48.5.lib
windows.0.52.0.lib
kernel32.lib
advapi32.lib
kernel32.lib
ntdll.lib
userenv.lib
ws2_32.lib
kernel32.lib
ws2_32.lib
kernel32.lib
msvcrt.lib
/NXCOMPAT
/LIBPATH:C:\Users\Administrator\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\i686-pc-windows-msvc\lib
/OUT:C:\Users\Administrator\Downloads\Compressed\rust\demo\target\i686-pc-windows-msvc\release\deps\demo.exe
/OPT:REF,ICF
/DEBUG:NONE
/SUBSYSTEM:CONSOLE,5.01

把yy-thunks的obj和vc-ltl的libpath都提到系统库前面,但问题依旧,x86下ProcessPrng依然缺失可能也是因为同样的原因,暂时先这样吧,对x86倒不是很执着

mingkuang-Chuyu commented 1 month ago

@muyu1944 既然你任然有问题,我先把问题打开。目前我这边只能确认说 x86 XP.obj没有问题,WaitOnAddress、ProcessPrng等函数都在。你在群了吗?可以私聊发我一句话?

muyu1944 commented 1 month ago

@mingkuang-Chuyu 你就当我是个路人甲就好,就不进群了,qq也用的少,哈哈 我的目的只是为了解决rust的win7兼容问题(虽然官方还保留了win7的工具链),顺便测了测能不能下探到xp 从源码看确实都不缺,暂时没思路就当作悬案吧 issue开不开都行,说不好以后某个版本的rust自己就正常了,也说不好又出现新情况 项目是非常好的项目,点赞👍

mingkuang-Chuyu commented 1 month ago

既然你觉得不方便加群,那暂时就无法跟进了。

Bug就先开着,用于跟踪问题。反正这是个人项目,Bug数量不涉及考核。

我再跟群里的其他人聊聊,顺道看看未来是否还有其他人遇到。当然我还是希望你可以加群讨论。这里应该是触发了某种未知规则。说不定可以学习到新东西。

获取Outlook for Androidhttps://aka.ms/AAb9ysg


From: muyu1944 @.> Sent: Tuesday, May 7, 2024 7:18:08 PM To: Chuyu-Team/YY-Thunks @.> Cc: mingkuang @.>; Mention @.> Subject: Re: [Chuyu-Team/YY-Thunks] Vista模式中任然会报告找不到ProcessPrng (Issue #78)

@mingkuang-Chuyuhttps://github.com/mingkuang-Chuyu 你就当我是个路人甲就好,就不进群了,qq也用的少,哈哈 我的目的只是为了解决rust的win7兼容问题(虽然官方还保留了win7的工具链),顺便测了测能不能下探到xp 从源码看确实都不缺,暂时没思路就当作悬案吧 issue开不开都行,说不好以后某个版本的rust自己就正常了,也说不好又出现新情况 项目是非常好的项目,点赞👍

— Reply to this email directly, view it on GitHubhttps://github.com/Chuyu-Team/YY-Thunks/issues/78#issuecomment-2098166837, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AEX7GZJB6ONE4WXFY3F3HWTZBCZ7BAVCNFSM6AAAAABHIWANTGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDAOJYGE3DMOBTG4. You are receiving this because you were mentioned.Message ID: @.***>

muyu1944 commented 1 month ago

@mingkuang-Chuyu 又搞了搞,打印了链接阶段的信息,发现问题出在link参数的C:\Users\ADMINI~1\AppData\Local\Temp\2\rustc4HJL2D\libstd-9e573f08bb1b5b36.rlib上,这个文件是rust在编译时内部生成的,编译完成就会销毁,这个lib里就是那4个函数,链接时就从这里链接到了api-ms-win-core-synch-l1-2-0.dll和bcryptprimitives.dll

    正在搜索 C:\Users\ADMINI~1\AppData\Local\Temp\2\rustcjxip1k\libstd-9e573f08bb1b5b36.rlib:
      已找到 __imp_WakeByAddressSingle
        已在 demo.demo.fcebccbb40309f07-cgu.0.rcgu.o 中引用
        已加载 libstd-9e573f08bb1b5b36.rlib(api-ms-win-core-synch-l1-2-0.dll)
      已找到 __imp_WaitOnAddress
        已在 demo.demo.fcebccbb40309f07-cgu.0.rcgu.o 中引用
        已加载 libstd-9e573f08bb1b5b36.rlib(api-ms-win-core-synch-l1-2-0.dll)
      已找到 __imp_WakeByAddressAll
        已在 demo.demo.fcebccbb40309f07-cgu.0.rcgu.o 中引用
        已加载 libstd-9e573f08bb1b5b36.rlib(api-ms-win-core-synch-l1-2-0.dll)
      已找到 __imp_ProcessPrng
        已在 demo.demo.fcebccbb40309f07-cgu.0.rcgu.o 中引用
        已加载 libstd-9e573f08bb1b5b36.rlib(bcryptprimitives.dll)
      已找到 __IMPORT_DESCRIPTOR_api-ms-win-core-synch-l1-2-0
        已在 libstd-9e573f08bb1b5b36.rlib(api-ms-win-core-synch-l1-2-0.dll) 中引用
        已在 libstd-9e573f08bb1b5b36.rlib(api-ms-win-core-synch-l1-2-0.dll) 中引用
        已在 libstd-9e573f08bb1b5b36.rlib(api-ms-win-core-synch-l1-2-0.dll) 中引用
        已加载 libstd-9e573f08bb1b5b36.rlib(api-ms-win-core-synch-l1-2-0.dll)
      已找到 __IMPORT_DESCRIPTOR_bcryptprimitives
        已在 libstd-9e573f08bb1b5b36.rlib(bcryptprimitives.dll) 中引用
        已加载 libstd-9e573f08bb1b5b36.rlib(bcryptprimitives.dll)
      已找到 __NULL_IMPORT_DESCRIPTOR
        已在 libstd-9e573f08bb1b5b36.rlib(api-ms-win-core-synch-l1-2-0.dll) 中引用
        已在 libstd-9e573f08bb1b5b36.rlib(bcryptprimitives.dll) 中引用
        已加载 libstd-9e573f08bb1b5b36.rlib(bcryptprimitives.dll)
      已找到 api-ms-win-core-synch-l1-2-0_NULL_THUNK_DATA
        已在 libstd-9e573f08bb1b5b36.rlib(api-ms-win-core-synch-l1-2-0.dll) 中引用
        已加载 libstd-9e573f08bb1b5b36.rlib(api-ms-win-core-synch-l1-2-0.dll)
      已找到 bcryptprimitives_NULL_THUNK_DATA
        已在 libstd-9e573f08bb1b5b36.rlib(bcryptprimitives.dll) 中引用
        已加载 libstd-9e573f08bb1b5b36.rlib(bcryptprimitives.dll)

我不太清楚thunk这个obj的原理,如果我在link阶段不添加这个rlib文件,就会报错找不到那4个函数,是因为主程序编译出的.o文件指明了要去外部链接吗,有什么办法把链接指向thunk的obj呢

demo.demo.fcebccbb40309f07-cgu.0.rcgu.o : error LNK2019: 无法解析的外部符号 __imp_WakeByAddressSingle,该符号在函数 __ZN4core3ptr131drop_in_place$LT$std..sync..mutex..MutexGuard$LT$alloc..vec..Vec$LT$alloc..sync..Arc$LT$mio..sys..windows..afd..Afd$GT$$GT$$GT$$GT$17h82ba288828c16bf0E 中被引用
demo.demo.fcebccbb40309f07-cgu.0.rcgu.o : error LNK2019: 无法解析的外部符号 __imp_WaitOnAddress,该符号在函数 __ZN3std3sys4sync4once5queue4Once4call17hacd048aeae5a3ce5E 中被引用
demo.demo.fcebccbb40309f07-cgu.0.rcgu.o : error LNK2019: 无法解析的外部符号 __imp_WakeByAddressAll,该符号在函数 __ZN3std3sys4sync6rwlock5futex6RwLock22wake_writer_or_readers17h8ffd0bbc0cdbe5e4E 中被引用
demo.demo.fcebccbb40309f07-cgu.0.rcgu.o : error LNK2019: 无法解析的外部符号 __imp_ProcessPrng,该符号在函数 __ZN3std4hash6random11RandomState3new4KEYS7__getit17h43019d36845910d8E 中被引用
zhizhi-dev commented 1 month ago

libstd-9e573f08bb1b5b36.rlib

你好,你这个链接信息是怎么打开的?

muyu1944 commented 1 month ago

@zhizhi-dev 我是手写了个link套壳真正的link,然后使用/VERBOSE输出link信息,主要是顺便调整参数,单纯看信息cargo本身似乎也能做到

wwh1004 commented 1 month ago

你编译出的程序是64位的,但是用了32位的yy-thunks,所以链接不进去

muyu1944 commented 1 month ago

@wwh1004 是32位的,我都是在32机测试过的,如果是64位程序,系统会提示该映像文件有效,但不适用于此计算机类型,32位会提示找不到某某dll

wwh1004 commented 1 month ago

__imp_WaitOnAddress这种名字是64位的,32位是impWaitOnAddress@16。你打印的链接器日志就是这样显示的。

给你问了chatgpt

__imp_WaitOnAddress和impWaitOnAddress@16都是在Windows平台上使用的符号名称,它们分别表示64位和32位的WaitOnAddress函数的导入符号。

在Windows的64位环境中,函数调用约定是fastcall,这意味着函数的参数会通过寄存器传递,而不是通过堆栈。因此,64位的WaitOnAddress函数的导入符号是__imp_WaitOnAddress。

在Windows的32位环境中,函数调用约定是stdcall,这意味着函数的参数会通过堆栈传递,并且函数的名字会被修饰以包含参数的总字节数。因此,32位的WaitOnAddress函数的导入符号是impWaitOnAddress@16,其中@16表示这个函数有4个参数,每个参数占用4个字节,总共16个字节。

注意,这些只是符号的名称,它们并不直接决定函数的实现或者行为。函数的实现和行为是由其对应的代码决定的,而这些代码是在函数所在的库(例如Windows的kernel32.dll)中定义的。

mingkuang-Chuyu commented 1 month ago

我也同意@wwh1004 的观点 如果只根据 C:\Users\ADMINI~1\AppData\Local\Temp\2\rustcjxip1k\libstd-9e573f08bb1b5b36.rlib的那段日志,你这边链接的确实不是x86,因为x86前缀是 __imp__ 而不是__imp_

当然这不排除是rust生成代码时出错了……那几个符号名称恰好生成错误。

而这样也就解释通了,rust找的是 __imp__,而x86/YY-Thunks.obj 里的符号是 __imp_,这必然就找不到了……所以YY-Thunks是不可能生效的。

我一开始以为是链接器有什么其他新规则呢。

han1548772930 commented 1 month ago

$env:RUSTFLAGS=" -Clink-args=path_to/YY_Thunks_for_Vista.obj -L path_to_vc_ltl5/TargetPlatform/10.0.19041.0/lib/Win32 -Clink-args=/subsystem:console,5.01 -Clink-args=oldnames.lib" 把上方的path换一下 然后直接cargo build --release 我这样是可以成功在win7 上运行rust1.78的产物

mingkuang-Chuyu commented 1 month ago

$env:RUSTFLAGS=" -Clink-args=path_to/YY_Thunks_for_Vista -L path_to_vc_ltl5/TargetPlatform/10.0.19041.0/lib/Win32 -Clink-args=/subsystem:console,5.01 -Clink-args=oldnames.lib" 把上方的path换一下 然后直接cargo build --release 我这样是可以成功在win7 上运行rust1.78的产物

有办法YY-Thunks改造成crate包吗?

mingkuang-Chuyu commented 1 month ago

@muyu1944 是否可以上传你的编译产物?

han1548772930 commented 1 month ago

$env:RUSTFLAGS=" -Clink-args=path_to/YY_Thunks_for_Vista -L path_to_vc_ltl5/TargetPlatform/10.0.19041.0/lib/Win32 -Clink-args=/subsystem:console,5.01 -Clink-args=oldnames.lib" 把上方的path换一下 然后直接cargo build --release 我这样是可以成功在win7 上运行rust1.78的产物

有办法YY-Thunks改造成crate包吗?

目前有一个https://github.com/felixmaker/thunk/issues/9

wwh1004 commented 1 month ago

我测试了下,确实是rust的锅。我这边32位编译出来也是不能连接到yythunks。 image

rust的libstd自己搞了一个导入表的结构

D:\Downloads\i686-pc-windows-msvc\lib>llvm-nm -U libstd-3fc3a42ac50822ec.rlib

lib.rmeta:
00000001 a @feat.00
llvm-nm.exe: error: libstd-3fc3a42ac50822ec.rlib(std-3fc3a42ac50822ec.std.9d38592f59fb1e2b-cgu.0.rcgu.o): Unknown attribute kind (91) (Producer: 'LLVM18.1.4-rust-1.80.0-nightly' Reader: 'LLVM 17.0.3')

bcryptprimitives.dll:
00000000 i .idata$2
00000000 ? .idata$4
00000000 ? .idata$5
00000000 i .idata$6
00000000 I __IMPORT_DESCRIPTOR_bcryptprimitives

bcryptprimitives.dll:
00000000 I __NULL_IMPORT_DESCRIPTOR

bcryptprimitives.dll:
00000000 I bcryptprimitives_NULL_THUNK_DATA

bcryptprimitives.dll:
00000000 T ProcessPrng
00000000 T __imp_ProcessPrng

api-ms-win-core-synch-l1-2-0.dll:
00000000 i .idata$2
00000000 ? .idata$4
00000000 ? .idata$5
00000000 i .idata$6
00000000 I __IMPORT_DESCRIPTOR_api-ms-win-core-synch-l1-2-0

api-ms-win-core-synch-l1-2-0.dll:
00000000 I __NULL_IMPORT_DESCRIPTOR

api-ms-win-core-synch-l1-2-0.dll:
00000000 I api-ms-win-core-synch-l1-2-0_NULL_THUNK_DATA

api-ms-win-core-synch-l1-2-0.dll:
00000000 T WaitOnAddress
00000000 T __imp_WaitOnAddress

api-ms-win-core-synch-l1-2-0.dll:
00000000 T WakeByAddressSingle
00000000 T __imp_WakeByAddressSingle

api-ms-win-core-synch-l1-2-0.dll:
00000000 T WakeByAddressAll
00000000 T __imp_WakeByAddressAll
muyu1944 commented 1 month ago

@wwh1004 @mingkuang-Chuyu 但程序确实是32位的,所以是说rust自己搞的引用不是标准规则的引用所以链接不到yy-thunks吗? image demo.zip demo.exe是最终产物,libstd.rlib是rust编译中间产物

han1548772930 commented 1 month ago

@wwh1004 @mingkuang-Chuyu 但程序确实是32位的,所以是说rust自己搞的引用不是标准规则的引用所以链接不到yy-thunks吗? image demo.zip demo.exe是最终产物,libstd.rlib是rust编译中间产物

可以试下我上方的方法

wwh1004 commented 1 month ago

对,是32位的,是鸭子说的rust代码生成时生成了错误的符号。64位下这个符号是对的,但是32位下是不标准的。

mingkuang-Chuyu commented 1 month ago

@muyu1944 你的上传链接怎么会是🐎云…… @wwh1004 谢谢你的排查结果。

目前解决方案还是有的,就我是这边使用Weak转发,转发到rust错误规则里就可以了。但是我目前不确定rust这边是不是认为Bug?如果它认为这是Bug,它可能会修复。

是不是可以先反馈到rust那边。

muyu1944 commented 1 month ago

@wwh1004 @mingkuang-Chuyu 但程序确实是32位的,所以是说rust自己搞的引用不是标准规则的引用所以链接不到yy-thunks吗? image demo.zip demo.exe是最终产物,libstd.rlib是rust编译中间产物

可以试下我上方的方法

我最开始使用的是thunk --os xp --arch x86 -- --release,后来自己调试的命令就已经换成类似的了: env RUSTFLAGS="-Awarnings -C link-args=C:\Users\Administrator\Downloads\Compressed\thunk\objs\x86\YY_Thunks_for_WinXP.obj -L C:\Users\Administrator\Downloads\Compressed\thunk\TargetPlatform\5.1.2600.0\lib\Win32 -C link-args=/SUBSYSTEM:CONSOLE,5.01" cargo build --target i686-pc-windows-msvc --release

han1548772930 commented 1 month ago

@wwh1004 @mingkuang-Chuyu 但程序确实是32位的,所以是说rust自己搞的引用不是标准规则的引用所以链接不到yy-thunks吗? image demo.zip demo.exe是最终产物,libstd.rlib是rust编译中间产物

可以试下我上方的方法

我最开始使用的是thunk --os xp --arch x86 -- --release,后来自己调试的命令就已经换成类似的了: env RUSTFLAGS="-Awarnings -C link-args=C:\Users\Administrator\Downloads\Compressed\thunk\objs\x86\YY_Thunks_for_WinXP.obj -L C:\Users\Administrator\Downloads\Compressed\thunk\TargetPlatform\5.1.2600.0\lib\Win32 -C link-args=/SUBSYSTEM:CONSOLE,5.01" cargo build --target i686-pc-windows-msvc --release

得用x64的YY_Thunks_for_Vista.obj这个 然后打包的时候不需要加-target i686-pc-windows-msvc 不然会报错

muyu1944 commented 1 month ago

@wwh1004 @mingkuang-Chuyu 但程序确实是32位的,所以是说rust自己搞的引用不是标准规则的引用所以链接不到yy-thunks吗? image demo.zip demo.exe是最终产物,libstd.rlib是rust编译中间产物

可以试下我上方的方法

我最开始使用的是thunk --os xp --arch x86 -- --release,后来自己调试的命令就已经换成类似的了: env RUSTFLAGS="-Awarnings -C link-args=C:\Users\Administrator\Downloads\Compressed\thunk\objs\x86\YY_Thunks_for_WinXP.obj -L C:\Users\Administrator\Downloads\Compressed\thunk\TargetPlatform\5.1.2600.0\lib\Win32 -C link-args=/SUBSYSTEM:CONSOLE,5.01" cargo build --target i686-pc-windows-msvc --release

得用YY_Thunks_for_Vista.obj这个 然后打包的时候不需要加-target i686-pc-windows-msvc

加target是因为我host是x86_64的工具链,所以得指明是编译成32位,用vista的obj我也试过,最开始我就写了x86下xp和vista都有这个现象

muyu1944 commented 1 month ago

@muyu1944 你的上传链接怎么会是🐎云…… @wwh1004 谢谢你的排查结果。

目前解决方案还是有的,就我是这边使用Weak转发,转发到rust错误规则里就可以了。但是我目前不确定rust这边是不是认为Bug?如果它认为这是Bug,它可能会修复。

是不是可以先反馈到rust那边。

有段时间访问github不太通畅,就把一些静态资源转码云了,结果最近pages还给停了 我可以提提看,这个现象你有没有一个比较正式的表达,我转过去

muyu1944 commented 1 month ago

有没有可能rust就是为了用同一种写法来同时兼容32位和64位,才搞了libstd这个么东西来适配,编译64位程序的时候链接器不会链接这个libstd

mingkuang-Chuyu commented 1 month ago

@muyu1944 来帮忙试试这个文件,我把所有符号都添加了一下rust那种奇葩的命名规则。 YY_Thunks_for_x86_rust_fix.zip

mingkuang-Chuyu commented 1 month ago

群里测试通过,接下来转换为需求,在rust适配需求 #76 中统一跟进:

mingkuang-Chuyu commented 1 month ago

@muyu1944 请问我给你的版本可以解决rust x86下找不到符号问题吗?如果确认解决,我就就开始进行合码了。

muyu1944 commented 1 month ago

@mingkuang-Chuyu 已确认问题解决

mingkuang-Chuyu commented 1 month ago

多谢,其实我任然感觉rust的raw-dylib+undecorated机制存在安全问题,按理说只要给lib里的nametype指定为IMPORT_NAMEUNDECORATE,在链接时链接器会自动删除@ 前缀后缀……

但是现在rust非要搞创新,把这个去除前缀后缀的过程放在了编译时……

假设用户导入stdcall _WakeByAddressSingle,但是已经存在cdecl C约定的WakeByAddressSingle导出函数怎么办。这是不是就要打架了……

这特性来说,rust真的太……垃圾了

获取Outlook for Androidhttps://aka.ms/AAb9ysg


From: muyu1944 @.> Sent: Friday, May 10, 2024 7:29:38 AM To: Chuyu-Team/YY-Thunks @.> Cc: mingkuang @.>; Mention @.> Subject: Re: [Chuyu-Team/YY-Thunks] rust程序可能意外的隐式导入WakeByAddressSingle、ProcessPrng等函数 (Issue #78)

@mingkuang-Chuyuhttps://github.com/mingkuang-Chuyu 已确认问题解决

― Reply to this email directly, view it on GitHubhttps://github.com/Chuyu-Team/YY-Thunks/issues/78#issuecomment-2103599933, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AEX7GZMS66ZNTSDRJKSU3X3ZBQBGFAVCNFSM6AAAAABHIWANTGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMBTGU4TSOJTGM. You are receiving this because you were mentioned.Message ID: @.***>

mingkuang-Chuyu commented 1 month ago

有没有可能rust就是为了用同一种写法来同时兼容32位和64位,才搞了libstd这个么东西来适配,编译64位程序的时候链接器不会链接这个libstd

已经向rust体检bug,但是我不确定rust是否受理 https://github.com/rust-lang/rust/issues/124958