我想在C / C ++中为一个小游戏创建一个脚本扩展器,与Skyrim Script Extender和FalloutNV Script Extender非常相似,因为它从游戏自己的语言中挂钩脚本命令并为它们添加功能甚至是全新的方法。
不幸的是我不知道从哪里开始。有谁知道我可以去的任何地方或我可以帮助我学习的任何东西?我试过阅读上述程序的源代码,但无济于事。
非常感谢任何帮助。
答案 0 :(得分:1)
大多数允许扩展游戏的工具或多或少都像计算机病毒一样工作。他们修改原始代码是为了注入自己的代码,除了代码做了很好的事情,比如给你的角色更好的装甲,而不是破坏你的计算机等意思。但是,原则上,使用的技术是相同的。
不幸的是,详细解释如何编写计算机病毒显然会违反堆栈溢出的服务条款。甚至修改本身也可能存在可疑的法律问题。
逆向工程法律问题常见问题解答:
https://www.eff.org/issues/coders/reverse-engineering-faq
但是,我可以给你一些通用性,希望在没有被禁止的情况下指向正确的方向。
修改其他人编译的软件基本上是调试目标代码的艺术。如果您能理解代码的作用,那么您可以更改代码的功能。 因此,最好的起点是阅读C调试器的文档。作为学习调试器的一部分,您还应该学习汇编代码。您不需要成为专家,但您需要了解基础知识。如果你能真正掌握你的调试器,剩下的就是蛋糕。
所以,没有进一步的努力...
Shim(计算):
http://en.wikipedia.org/wiki/Shim_(computing)
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 Accessibility 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
辅助功能是"挂钩"由操作系统放置,允许残疾用户,如盲人或瘫痪者,使用工具" mod"软件一般来说。这是为了添加诸如屏幕阅读器之类的功能,这些功能可以大声读取用户界面,因为用户无法看到。
虽然挂钩专门用于响应按钮按下之类的操作,但您可以通过多种创造性方式滥用这些挂钩。例如,您可以创建一个辅助功能挂钩,将热键添加到没有内置热键功能的程序中。
辅助功能挂钩是最干净,最负责任的方式。它不需要修改程序二进制文件,辅助功能挂钩意图允许您更改软件的行为。最重要的是,按设计使用时,可访问性挂钩 not 需要对原始软件进行逆向工程,也不违反EULA。
然而,存在局限性。一些(许多)游戏直接绘制到屏幕上而不通过操作系统后退按钮;或者他们直接访问硬件而不通过鼠标事件等。有残障意识的公司通常会提供一种模式来关闭或替代。例如,AMD Cataylst将允许您关闭CCC控制面板上的橱窗装饰,使其可以使用辅助功能工具。有些游戏直接绘制到屏幕上,但是通过按钮事件和文本标签向操作系统发出信号,因此屏幕阅读器仍可正常工作。虽然Valve可以直接访问,但他们实现了自己的隐藏字幕。这是一个代码质量的东西。不幸的是,很多人都没有想到残疾人。这真的取决于游戏。
因此,如果可以,请使用操作系统的辅助功能,如果游戏支持它。
答案 1 :(得分:0)
不幸的是,SKSE和相关程序使用的技术并不简单,很难完全掌握,所以如果你不立即“理解”,不要担心。我的基本理解是它在内存中找到了Skyrim的函数,方法和数据,并根据需要修改它们。为了添加新代码,游戏的数据结构和类需要从反汇编中进行逆向工程,并在EXE中保留调试信息。
最终,最好的信息来源将是源代码本身。如果你真的有兴趣了解它是如何完成的,我将大致如下处理问题:
其他选项是查看更成熟但使用类似技术的Oblivion或Morrowind脚本扩展程序。如果你有时间,另一个选择是审查官方Skyrim Mods forum中的所有“ianpatt”和其他SKSE开发者论坛主题,因为他不时讨论各种低级别主题。
答案 2 :(得分:0)
您提到的两个项目都是开源的,它们的来源是最佳起点。你试图扩展的脚本语言确实改变了在某种程度上需要做的事情,那些开源的(如Lua,v8等)比专有的闭源语言(如SC2 galaxy script或NWNScript)更容易扩展。 )。
您可能还想研究游戏中您尝试扩展的脚本,因为其他人可能已经完成了所需的位(如NWNScript)。
如果您遇到最糟糕的情况,最好的起点是汇编程序和调试/逆向工程技能,使用OllyDBG或IDA等工具。