我想在 C/C++ 中为一个小游戏创建一个脚本扩展器,非常类似于Skyrim Script Extender和FalloutNV Script Extender,因为它从游戏自己的语言中挂钩脚本命令并为其添加功能甚至全新的方法。
不幸的是,我不知道从哪里开始。有谁知道我可以去的任何地方或任何可以帮助我学习的谷歌?我已经尝试阅读上述程序的源代码,但无济于事。
任何帮助将不胜感激。
我想在 C/C++ 中为一个小游戏创建一个脚本扩展器,非常类似于Skyrim Script Extender和FalloutNV Script Extender,因为它从游戏自己的语言中挂钩脚本命令并为其添加功能甚至全新的方法。
不幸的是,我不知道从哪里开始。有谁知道我可以去的任何地方或任何可以帮助我学习的谷歌?我已经尝试阅读上述程序的源代码,但无济于事。
任何帮助将不胜感激。
这些允许扩展游戏的工具中的大多数都或多或少地像计算机病毒一样工作。他们修改原始代码以注入自己的代码,除了代码做了一些好事,比如给你的角色更好的盔甲,而不是像破坏你的电脑这样卑鄙的事情。但是,原则上,使用的技术是相同的。
不幸的是,详细解释如何编写计算机病毒显然违反了堆栈溢出的服务条款。即使是改装本身也可能存在可疑的法律问题。
逆向工程法律问题常见问题解答:
https ://www.eff.org/issues/coders/reverse-engineering-faq
但是,我可以给你一些概括性的建议,希望你能指出正确的方向而不会被禁止。
修改别人的编译软件基本上是调试目标代码的艺术。如果您可以理解代码的作用,那么您可以更改代码的作用。因此,最好的起点是阅读 C 调试器的文档。作为学习调试器的一部分,您还应该学习汇编代码。您不需要成为这方面的专家,但您需要了解基础知识。如果你能真正掌握你的调试器,剩下的就是小菜一碟了。
所以,事不宜迟……
垫片(计算):
http://en.wikipedia.org/wiki/Shim_(计算)
DLL 注入:
http ://en.wikipedia.org/wiki/DLL_injection
依赖步行者:
http ://en.wikipedia.org/wiki/Dependency_Walker
动态链接库搜索顺序: http:
//msdn.microsoft.com/en-us/library/windows/desktop/ms682586 (v=vs.85).aspx
PE 文件格式:(Windows)
http://en.wikipedia.org/wiki/Portable_Executable
Microsoft PE 和 COFF 规范:http:
//msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx
ELF 文件格式:(Linux、一些游戏机和投币操作)
http://en.wikipedia.org/wiki/Executable_and_Linkable_Format
名称修改:
http ://en.wikipedia.org/wiki/Name_mangling
不要在你的 DllMain 中做任何可怕的事情的一些原因:(除了你的情况......)
http://blogs.msdn.com/b/oldnewthing/archive/2004/01/27/63401.aspx
GetProcAddress 函数:http:
//msdn.microsoft.com/en-us/library/windows/desktop/ms683212%28v=vs.85%29.aspx
手动遍历堆栈: http:
//msdn.microsoft.com/en-US/library/windows/hardware/ff552143 (v=vs.85).aspx
Windows 调试工具 (DDK): http: //msdn.microsoft.com/library/windows/hardware/ff551063 (v=vs.85).aspx
内存窗口:(查看内存内容)
http://msdn.microsoft.com/en-us/library/s3aw423e (v=vs.120).aspx
或者使用 dll 进入地址空间......
缓冲区溢出:(如今,越狱 ROM 比软件更多)
http://en.wikipedia.org/wiki/Buffer_overflow
指令重定位:(“老派”)
http://en.wikipedia.org/wiki/Relocation_%28computing%29
变基:(“老派”)
http://en.wikipedia.org/wiki/Rebasing
我想推荐一个干净的、合法的、尽管更有限的替代方案:可访问性挂钩。任何有能力的程序员都可以实现可访问性功能,而无需巫术或巫术。
Windows 辅助功能 API:http:
//msdn.microsoft.com/en-us/library/windows/desktop/dd373592%28v=vs.85%29.aspx
Android 无障碍服务:http:
//developer.android.com/reference/android/accessibilityservice/AccessibilityService.html
辅助功能是操作系统放置的“钩子”,允许残疾用户(例如盲人或瘫痪者)使用一般“修改”软件的工具。这是为了添加诸如屏幕阅读器之类的功能,这些功能可以大声朗读用户界面,因为用户看不到。
虽然这些钩子专门用于响应按钮按下之类的事情,但您可以以许多创造性的方式滥用它们。例如,您可以创建一个可访问性挂钩,将热键添加到没有内置热键功能的程序中。
可访问性挂钩是最干净和最负责的方式。它不需要修改程序二进制文件,可访问性挂钩旨在允许您更改软件的行为。最重要的是,按设计使用的可访问性挂钩不需要对原始软件进行逆向工程,也不需要违反 EULA 。
但是,有一些限制。一些(许多)游戏直接绘制到屏幕上,而无需通过操作系统对按钮进行后端处理;或者他们直接访问硬件而不通过鼠标事件等。有残障意识的公司通常会提供一种模式来关闭它或替代。例如,AMD Cataylst 可以让你关闭 CCC 控制面板上的橱窗装饰,让它与辅助工具一起工作。有些游戏直接绘制到屏幕上,但会通过按钮事件和文本标签向操作系统发出信号,因此屏幕阅读器仍然可以正常工作。虽然 Valve 可以直接访问,但他们实现了自己的隐藏式字幕。这是代码质量的事情。不幸的是,很多人没有想到残疾人。这真的取决于游戏。
因此,如果可以,请在游戏支持的情况下使用操作系统的辅助功能。
不幸的是,SKSE 和相关程序使用的技术并不简单,而且很难完全掌握,所以如果您没有立即“掌握”,请不要担心。我非常基本的理解是,它会在内存中找到 Skyrim 的功能、方法和数据,并根据需要对其进行修改。为了添加新代码,游戏的数据结构和类需要从反汇编和 EXE 中留下的调试信息进行逆向工程。
最终,最好的信息来源将是源代码本身。如果您真的有兴趣了解它是如何完成的,我将大致按如下方式处理该问题:
其他选择是查看更成熟但使用类似技术的Oblivion或Morrowind脚本扩展器。如果您有时间,另一个选择是在Skyrim Mods官方论坛中查看所有“ianpatt”和其他 SKSE 开发者论坛主题,因为他不时讨论各种低级主题。
您提到的两个项目都是开源的,它们的源代码将是最好的起点。您尝试扩展的脚本语言确实在一定程度上改变了需要做的事情,那些开源的(如 Lua、v8 等)比专有的闭源语言(如 SC2 Galaxy 脚本或 NWNScript)更容易扩展)。
您可能还想研究您尝试扩展的游戏脚本,因为其他人可能已经完成了所需的部分(例如使用 NWNScript)。
如果您确实陷入了最坏的情况,最好的起点是您的汇编程序和调试/逆向工程技能,使用 OllyDBG 或 IDA 等工具。