InWILL / Locale_Remulator

System Region and Language Simulator.
GNU Lesser General Public License v3.0
779 stars 37 forks source link

在其它遊戲運行時被偵測 #43

Closed neptunusH closed 2 months ago

neptunusH commented 1 year ago

你好,我想請問一下 在同樣是nexon日本官方下的遊戲//Talesweaver 運行後一開始不會被偵測 過一段時間後,使用就被遊戲內反外掛偵測出來 這種情況下 請問把源代碼修改過後再自己編譯的話 可以解決嗎 如果可以的話,請問要修改哪些項目 如果不行的話,請問要怎麼解決,謝謝

InWILL commented 1 year ago

可以的,NEXON的检测机制是检测反外挂程序是否被dll注入,所以只要在挂载转区dll的时候,将反外挂程序列入白名单,不对其进行转区,即可绕过侦测。

请参考LRHookFunc.cpp里的HookCreateProcessW和HookCreateProcessA函数。

https://github.com/InWILL/Locale_Remulator/blob/7e25155f058e8824f47d47c80fd1a73f114c9872/LRHook/LRHookFunc.cpp#L452

如果能提交更新就帮大忙了,最近在备战雅思考试,实在抽不出时间更新。🐦

neptunusH commented 1 year ago

好的 謝謝大老的解說 我先看下這函數怎麼使用 謝謝

Villxx commented 1 year ago

请问大佬解决Talesweaver转码问题了吗?可否分享解决方法?

neptunusH commented 1 year ago

根據開發大老的說法是 把 LRHookFunc.cpp的 if (lpCommandLine && wcsstr(lpCommandLine, L"BlackXchg.aes") != NULL) 置換成 if (lpCommandLine && (wcsstr(lpCommandLine, L"BlackXchg.aes") != NULL || wcsstr(lpCommandLine, L"BlackCipher.aes") != NULL))

或許可以解決 問題是 不會編譯軟件哈哈

LiMoon commented 6 months ago

執行有 GameGuard.des 或 GameMon64.des 的線上遊戲會無法正常載入。 但我用locale emulator時是正常的(缺點就是會被放大視窗)。

請問有其他人知道怎麼解決嗎?

InWILL commented 6 months ago

最近终于收到意大利的offer,不过最近在陪家人和开坑新项目没有什么时间。 LE和LR的原理本质都是DLL注入,LE用的汇编内核所以不容易被检测,也因此没有64位支持。 LR会考虑加入白名单机制,并加入GitHub action确保云编译。

VaultHunterVV commented 6 months ago

最近终于收到意大利的offer,不过最近在陪家人和开坑新项目没有什么时间。 LE和LR的原理本质都是DLL注入,LE用的汇编内核所以不容易被检测,也因此没有64位支持。 LR会考虑加入白名单机制,并加入GitHub action确保云编译。

您好,想问一下是不是把这里的BlackCipher.aes 替换成GameMon64.des就实现了把GameMon64.des加入白名单的功能?(我试过这样做了但是并没有生效) if (lpCommandLine && wcsstr(lpCommandLine, L"BlackXchg.aes") != NULL) 置換成 if (lpCommandLine && (wcsstr(lpCommandLine, L"BlackXchg.aes") != NULL || wcsstr(lpCommandLine, L"BlackCipher.aes") != NULL)) 或者可以分享一下LR具体怎么实现白名单的思路吗,我可以编译成功,但是因为不是c++出身,不是很理解怎么实现白名单。非常感谢您的帮助。 我的使用场景是《彩虹岛韩服》,由于这款游戏是网页登录>打开启动器>启动器点启动游戏>加载反外挂程序GameMon64.des等>自动打开客户端。目前LR可以在启动器上面转区成功,但是最后的客户端失败,我怀疑跟您这里说的反外挂程序白名单相关,所以想自己摸索一下看看能不能搞定。还望抽空指点一二,不胜感激!

InWILL commented 6 months ago

最近终于收到意大利的offer,不过最近在陪家人和开坑新项目没有什么时间。 LE和LR的原理本质都是DLL注入,LE用的汇编内核所以不容易被检测,也因此没有64位支持。 LR会考虑加入白名单机制,并加入GitHub action确保云编译。

您好,想问一下是不是把这里的BlackCipher.aes 替换成GameMon64.des就实现了把GameMon64.des加入白名单的功能?(我试过这样做了但是并没有生效) if (lpCommandLine && wcsstr(lpCommandLine, L"BlackXchg.aes") != NULL) 置換成 if (lpCommandLine && (wcsstr(lpCommandLine, L"BlackXchg.aes") != NULL || wcsstr(lpCommandLine, L"BlackCipher.aes") != NULL)) 或者可以分享一下LR具体怎么实现白名单的思路吗,我可以编译成功,但是因为不是c++出身,不是很理解怎么实现白名单。非常感谢您的帮助。 我的使用场景是《彩虹岛韩服》,由于这款游戏是网页登录>打开启动器>启动器点启动游戏>加载反外挂程序GameMon64.des等>自动打开客户端。目前LR可以在启动器上面转区成功,但是最后的客户端失败,我怀疑跟您这里说的反外挂程序白名单相关,所以想自己摸索一下看看能不能搞定。还望抽空指点一二,不胜感激!

是的,正如你理解的一样,将BlackCipher.aes替换即可实现白名单。 最好在 https://github.com/InWILL/Locale_Remulator/blob/7e25155f058e8824f47d47c80fd1a73f114c9872/LRHook/LRHookFunc.cpp#L423 此HookCreateProcessA函数中也加入相同的判断。

VaultHunterVV commented 6 months ago

最近终于收到意大利的offer,不过最近在陪家人和开坑新项目没有什么时间。 LE和LR的原理本质都是DLL注入,LE用的汇编内核所以不容易被检测,也因此没有64位支持。 LR会考虑加入白名单机制,并加入GitHub action确保云编译。

您好,想问一下是不是把这里的BlackCipher.aes 替换成GameMon64.des就实现了把GameMon64.des加入白名单的功能?(我试过这样做了但是并没有生效) if (lpCommandLine && wcsstr(lpCommandLine, L"BlackXchg.aes") != NULL) 置換成 if (lpCommandLine && (wcsstr(lpCommandLine, L"BlackXchg.aes") != NULL || wcsstr(lpCommandLine, L"BlackCipher.aes") != NULL)) 或者可以分享一下LR具体怎么实现白名单的思路吗,我可以编译成功,但是因为不是c++出身,不是很理解怎么实现白名单。非常感谢您的帮助。 我的使用场景是《彩虹岛韩服》,由于这款游戏是网页登录>打开启动器>启动器点启动游戏>加载反外挂程序GameMon64.des等>自动打开客户端。目前LR可以在启动器上面转区成功,但是最后的客户端失败,我怀疑跟您这里说的反外挂程序白名单相关,所以想自己摸索一下看看能不能搞定。还望抽空指点一二,不胜感激!

是的,正如你理解的一样,将BlackCipher.aes替换即可实现白名单。 最好在

https://github.com/InWILL/Locale_Remulator/blob/7e25155f058e8824f47d47c80fd1a73f114c9872/LRHook/LRHookFunc.cpp#L423

此HookCreateProcessA函数中也加入相同的判断。

非常感谢您的回复!我试了一下,把GameGuard.des 和GameMon64.des 加入判断条件后还是不行,而且因为HookCreateProcessA里的lpCommandLine 是LPSTR 类型的,不是LPWSTR,所以我没找到办法把这个判断加进去(后续我试了一下强制转换类型但是没有作用),不知道这和您的本意是不是相符。如果您有时间的话,还望再提供一些思路或者写法,或者您抽空看看白名单机制是否可能实现?目前的workaround是只能修改系统语言,但是因为是韩文,这又给其他程序的使用带来了新的不便。再次感谢您的帮助!

InWILL commented 6 months ago
if (lpCommandLine && strstr(lpCommandLine, "BlackXchg.aes") != NULL)
    {

LPSTR需要使用对应的函数,具体可以在MSDN查询。 注意字符串要去掉前缀'L'

VaultHunterVV commented 6 months ago
if (lpCommandLine && strstr(lpCommandLine, "BlackXchg.aes") != NULL)
  {

LPSTR需要使用对应的函数,具体可以在MSDN查询。 注意字符串要去掉前缀'L'

感谢回复。我昨晚试了一下,已经把GameMon.des,GameMon64.des 和GameGuard.des(前两个确认是在task manager里的进程,第三个为了双重保险)都加进HookCreateProcessA和HookCreateProcessW了还是不生效,后面还尝试把lpCommandLine 替换成了lpApplicationName也没作用。另外,我是先下载了github上的最新版本,然后本地编译了LRHookx64.dll后,只把这个dll替换了最新版本,其他都没改,使用的时候是直接打开LREditor.exe,选择chrome.exe打开浏览器的,这样仍然可以在登录器上转区成功,但是最后的客户端不行。所以我感觉我的步骤应该是合理的。正如上面LiMoon提到的,LE在这种场景下是支持的,所以我的猜想是:

  1. 与Nexon的MapleStory类似,64位的GameMon64.des禁止了dll注入,或者检测到了,只是没有直接使游戏崩溃,白名单机制无法通过这种方式实现。
  2. 方法/写法不对,除了HookCreateProcessA和HookCreateProcessW,还有其他地方要修改。这样的话,那就不能凭我一己之力做到了,my poor c++ backgrounds :(. 以下是我所有修改的代码 if (lpCommandLine && (strstr(lpCommandLine, "GameMon.des") != NULL || strstr(lpCommandLine, "GameMon64.des") != NULL || strstr(lpCommandLine, "GameGuard.des") != NULL)) { return OriginalCreateProcessA( lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation ); } if (lpCommandLine && (wcsstr(lpCommandLine, L"GameMon.des") != NULL || wcsstr(lpCommandLine, L"GameMon64.des") != NULL || wcsstr(lpCommandLine, L"GameGuard.des") != NULL)) { return OriginalCreateProcessW( lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation ); }
InWILL commented 6 months ago
if (lpCommandLine && strstr(lpCommandLine, "BlackXchg.aes") != NULL)
    {

LPSTR需要使用对应的函数,具体可以在MSDN查询。 注意字符串要去掉前缀'L'

感谢回复。我昨晚试了一下,已经把GameMon.des,GameMon64.des 和GameGuard.des(前两个确认是在task manager里的进程,第三个为了双重保险)都加进HookCreateProcessA和HookCreateProcessW了还是不生效,后面还尝试把lpCommandLine 替换成了lpApplicationName也没作用。另外,我是先下载了github上的最新版本,然后本地编译了LRHookx64.dll后,只把这个dll替换了最新版本,其他都没改,使用的时候是直接打开LREditor.exe,选择chrome.exe打开浏览器的,这样仍然可以在登录器上转区成功,但是最后的客户端不行。所以我感觉我的步骤应该是合理的。正如上面LiMoon提到的,LE在这种场景下是支持的,所以我的猜想是:

  1. 与Nexon的MapleStory类似,64位的GameMon64.des禁止了dll注入,或者检测到了,只是没有直接使游戏崩溃,白名单机制无法通过这种方式实现。
  2. 方法/写法不对,除了HookCreateProcessA和HookCreateProcessW,还有其他地方要修改。这样的话,那就不能凭我一己之力做到了,my poor c++ backgrounds :(. 以下是我所有修改的代码 if (lpCommandLine && (strstr(lpCommandLine, "GameMon.des") != NULL || strstr(lpCommandLine, "GameMon64.des") != NULL || strstr(lpCommandLine, "GameGuard.des") != NULL)) { return OriginalCreateProcessA( lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation ); } if (lpCommandLine && (wcsstr(lpCommandLine, L"GameMon.des") != NULL || wcsstr(lpCommandLine, L"GameMon64.des") != NULL || wcsstr(lpCommandLine, L"GameGuard.des") != NULL)) { return OriginalCreateProcessW( lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation ); }

这个方法是正确的,可以达到白名单效果。 推测可能是登陆器并没有使用createprocess创建游戏进程,导致转区dll没有挂载到游戏中。

VaultHunterVV commented 6 months ago
if (lpCommandLine && strstr(lpCommandLine, "BlackXchg.aes") != NULL)
  {

LPSTR需要使用对应的函数,具体可以在MSDN查询。 注意字符串要去掉前缀'L'

感谢回复。我昨晚试了一下,已经把GameMon.des,GameMon64.des 和GameGuard.des(前两个确认是在task manager里的进程,第三个为了双重保险)都加进HookCreateProcessA和HookCreateProcessW了还是不生效,后面还尝试把lpCommandLine 替换成了lpApplicationName也没作用。另外,我是先下载了github上的最新版本,然后本地编译了LRHookx64.dll后,只把这个dll替换了最新版本,其他都没改,使用的时候是直接打开LREditor.exe,选择chrome.exe打开浏览器的,这样仍然可以在登录器上转区成功,但是最后的客户端不行。所以我感觉我的步骤应该是合理的。正如上面LiMoon提到的,LE在这种场景下是支持的,所以我的猜想是:

  1. 与Nexon的MapleStory类似,64位的GameMon64.des禁止了dll注入,或者检测到了,只是没有直接使游戏崩溃,白名单机制无法通过这种方式实现。
  2. 方法/写法不对,除了HookCreateProcessA和HookCreateProcessW,还有其他地方要修改。这样的话,那就不能凭我一己之力做到了,my poor c++ backgrounds :(. 以下是我所有修改的代码 if (lpCommandLine && (strstr(lpCommandLine, "GameMon.des") != NULL || strstr(lpCommandLine, "GameMon64.des") != NULL || strstr(lpCommandLine, "GameGuard.des") != NULL)) { return OriginalCreateProcessA( lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation ); } if (lpCommandLine && (wcsstr(lpCommandLine, L"GameMon.des") != NULL || wcsstr(lpCommandLine, L"GameMon64.des") != NULL || wcsstr(lpCommandLine, L"GameGuard.des") != NULL)) { return OriginalCreateProcessW( lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation ); }

这个方法是正确的,可以达到白名单效果。 推测可能是登陆器并没有使用createprocess创建游戏进程,导致转区dll没有挂载到游戏中。

emmm,所以说LR没法用在彩虹岛韩服里了?如果是这样的话,那只能用workaround了,不过内心还是希望能支持。

InWILL commented 6 months ago

今年应该很难有时间更新,(预约手术、签证、学意大利语/德语,除非现在公司给我一个大礼包休假🫠。

VaultHunterVV commented 5 months ago

今年应该很难有时间更新,(预约手术、签证、学意大利语/德语,除非现在公司给我一个大礼包休假🫠。

还是不死心,想问一下如果是“登陆器并没有使用createprocess创建游戏进程,导致转区dll没有挂载到游戏中”这种情况的话,有什么可能的解决办法可以挂载转区dll吗,或者相关的文档可以参考。还有另一个想法是,因为这次问题的出现是彩虹岛客户端升级成64位导致的,想知道技术上能不能让LE编译64位的版本并使用?

InWILL commented 4 months ago

LE核心用的汇编,基本不可能编译成64位。等我从日本回来再看看吧。

Keroro-colop commented 3 months ago

给一点相关的信息,最近台服彩虹岛也换成了64位,而现在的Release版本无法完成转区。 通过调试发现启动器通过ShellExecuteExA启动client。希望有所帮助

Keroro-colop commented 3 months ago

今年应该很难有时间更新,(预约手术、签证、学意大利语/德语,除非现在公司给我一个大礼包休假🫠。

还是不死心,想问一下如果是“登陆器并没有使用createprocess创建游戏进程,导致转区dll没有挂载到游戏中”这种情况的话,有什么可能的解决办法可以挂载转区dll吗,或者相关的文档可以参考。还有另一个想法是,因为这次问题的出现是彩虹岛客户端升级成64位导致的,想知道技术上能不能让LE编译64位的版本并使用?

见上条评论 hook ShellExecuteExA即可 如果是彩虹岛特供可以注释掉其他所有和进程有关的hook 这样也不用考虑白名单机制

InWILL commented 3 months ago

好的,感谢提供信息

On Mon, Aug 26, 2024, 3:04 AM za10222 @.***> wrote:

今年应该很难有时间更新,(预约手术、签证、学意大利语/德语,除非现在公司给我一个大礼包休假🫠。

还是不死心,想问一下如果是“登陆器并没有使用createprocess创建游戏进程,导致转区dll没有挂载到游戏中”这种情况的话,有什么可能的解决办法可以挂载转区dll吗,或者相关的文档可以参考。还有另一个想法是,因为这次问题的出现是彩虹岛客户端升级成64位导致的,想知道技术上能不能让LE编译64位的版本并使用?

见上条评论 hook ShellExecuteExA即可 如果是彩虹岛特供可以注释掉其他所有和进程有关的hook 这样也不用考虑白名单机制

— Reply to this email directly, view it on GitHub https://github.com/InWILL/Locale_Remulator/issues/43#issuecomment-2308959811, or unsubscribe https://github.com/notifications/unsubscribe-auth/ADJKLUKF77LYLLE7ZBSUSRLZTITFVAVCNFSM6AAAAAA7SE26WCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGMBYHE2TSOBRGE . You are receiving this because you commented.Message ID: @.***>

VaultHunterVV commented 3 months ago

好的,感谢提供信息 On Mon, Aug 26, 2024, 3:04 AM za10222 @.> wrote: 今年应该很难有时间更新,(预约手术、签证、学意大利语/德语,除非现在公司给我一个大礼包休假🫠。 还是不死心,想问一下如果是“登陆器并没有使用createprocess创建游戏进程,导致转区dll没有挂载到游戏中”这种情况的话,有什么可能的解决办法可以挂载转区dll吗,或者相关的文档可以参考。还有另一个想法是,因为这次问题的出现是彩虹岛客户端升级成64位导致的,想知道技术上能不能让LE编译64位的版本并使用? 见上条评论 hook ShellExecuteExA即可 如果是彩虹岛特供可以注释掉其他所有和进程有关的hook 这样也不用考虑白名单机制 — Reply to this email directly, view it on GitHub <#43 (comment)>, or unsubscribe https://github.com/notifications/unsubscribe-auth/ADJKLUKF77LYLLE7ZBSUSRLZTITFVAVCNFSM6AAAAAA7SE26WCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGMBYHE2TSOBRGE . You are receiving this because you commented.Message ID: @.>

我看到LRHookFunc.cpp里其实已经有HookShellExecuteA的功能了,但是从代码来看似乎还是未完成的状态,因为在Attach/Detach的时候把相关的函数注释掉了,昨天我尝试了一下把这个功能做完,但是没有成功,打开启动器的时候会提示找不到游戏(可能是路径识别有问题)。我猜测是Detour库里面没有对应的接口能够调用ShellExecuteA/ShellExecuteExA,这里用的依旧是DetourCreateProcessWithDllExA 和OriginalCreateProcessA参数,按理应该是OriginalShellExecuteA https://github.com/InWILL/Locale_Remulator/blob/7e25155f058e8824f47d47c80fd1a73f114c9872/LRHook/LRHookFunc.cpp#L516 同时我也去看了一下LE的源码,里面的确是实现了ShellExecuteExA的功能,这也是LE能够转区成功的原因。 目前了解到彩虹岛台服通过了在LREditor里传参+创建快捷方式的办法成功转区,原理应该是绕过了启动器调用ShellExecuteExA,直接启动客户端,这里应该是用岛了HookCreateProcessA。不过因为绕过反外挂检测,有一定的风险,所以还没在韩服上面尝试。 还是等作者喂饭吧,sigh。顺便问一句,作者的日本之行结束了吗^_^

wordpure commented 3 months ago

star-hengxing/Locale_Emulator_Plus:

这个 README 说支持 64 位,不过要自己编译,有兴趣的话可以试试。我自己用不到就没整

Keroro-colop commented 2 months ago

好的,感谢提供信息 On Mon, Aug 26, 2024, 3:04 AM za10222 @._> wrote: 今年应该很难有时间更新,(预约手术、签证、学意大利语/德语,除非现在公司给我一个大礼包休假🫠。 还是不死心,想问一下如果是“登陆器并没有使用createprocess创建游戏进程,导致转区dll没有挂载到游戏中”这种情况的话,有什么可能的解决办法可以挂载转区dll吗,或者相关的文档可以参考。还有另一个想法是,因为这次问题的出现是彩虹岛客户端升级成64位导致的,想知道技术上能不能让LE编译64位的版本并使用? 见上条评论 hook ShellExecuteExA即可 如果是彩虹岛特供可以注释掉其他所有和进程有关的hook 这样也不用考虑白名单机制 — Reply to this email directly, view it on GitHub <#43 (comment)>, or unsubscribe https://github.com/notifications/unsubscribe-auth/ADJKLUKF77LYLLE7ZBSUSRLZTITFVAVCNFSM6AAAAAA7SE26WCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGMBYHE2TSOBRGE . You are receiving this because you commented.Message ID: _@_._>

我看到LRHookFunc.cpp里其实已经有HookShellExecuteA的功能了,但是从代码来看似乎还是未完成的状态,因为在Attach/Detach的时候把相关的函数注释掉了,昨天我尝试了一下把这个功能做完,但是没有成功,打开启动器的时候会提示找不到游戏(可能是路径识别有问题)。我猜测是Detour库里面没有对应的接口能够调用ShellExecuteA/ShellExecuteExA,这里用的依旧是DetourCreateProcessWithDllExA 和OriginalCreateProcessA参数,按理应该是OriginalShellExecuteA

https://github.com/InWILL/Locale_Remulator/blob/7e25155f058e8824f47d47c80fd1a73f114c9872/LRHook/LRHookFunc.cpp#L516

同时我也去看了一下LE的源码,里面的确是实现了ShellExecuteExA的功能,这也是LE能够转区成功的原因。 目前了解到彩虹岛台服通过了在LREditor里传参+创建快捷方式的办法成功转区,原理应该是绕过了启动器调用ShellExecuteExA,直接启动客户端,这里应该是用岛了HookCreateProcessA。不过因为绕过反外挂检测,有一定的风险,所以还没在韩服上面尝试。 还是等作者喂饭吧,sigh。顺便问一句,作者的日本之行结束了吗^_^

ShellExecuteExA 是这个 API搞错了

InWILL commented 2 months ago

彩虹岛的问题已修正v1.5.4 (意大利连续两次拒签 人都麻了

InWILL commented 2 months ago

v1.5.4_Latale 目前没有什么好的方法解决 32位应用程序使用shellexecute调用64位的问题。 提供Latale特别版本以解决此问题。