记一次使用多种方法逆向去掉 TV3D 6.5 引擎的 DLL 内水印的过程

更新于:20220728
更新于:20220612
原写于:20200620

文件信息

该文件是 TV3D 引擎 6.5 版本的针对 .Net 的库文件。如果你也有这个文件,有需要的话可以一起试试。估计该引擎提供的针对其他编程语言的库文件,修改方法应该都大体相同,因为该引擎核心是 C++ 写成,再用 PInvoke 封装成各个版本供其他语言使用,其核心都是一样的。

由于该文件可能较为古老,版本、描述无法在属性中直接看见,使用 .Net Reflector 或其他 .Net 反编译软件打开可以在其 AssemblyInfo.cs 中看见下列信息,可见版本和描述等。

最终,汇总此文件的相关信息如下:

文件名:MTV3D65.dll
MD5:586384918794A73CD4D0362CC24B86C7

经过检测,此文件未加壳,未混淆。

现将其逆向将其爆破,下面记录多种方法,方法之间是独立的,没有彼此的依赖性。

期望的效果

修改前(角上始终有水印)

修改后(水印消失)

方法一(杀鸡用牛刀):使用 OllyDebug 阻止绘制水印

操作方法

OllyDbg 直接载入 DLL,转到 100BD7F8 处将原句 nop 掉即可。

过程说明

OllyDbg 直接载入DLL,中文搜索引擎-智能搜索,在检测到的数千个字符串中,搜索“Immediate 2D Manager”,即可搜到一条如下的字符串:

IMMEDIATE 2D MANAGER : InitializeVB : CreateVertexBuffer failed. Error %d

双击该字符串跟进。

然后一直往下翻,路过这里注释的几个 Switch Case 后快到了,再往下有处 call MTV3D65_.100C1F20。此句就是 DLL 内部绘制水印的命令。

然后将其使用 nop 覆盖。最后复制到可执行文件 -> 保存DLL即可。

怎样想到如此修改?

按常规来说,本来应该一点点下断点去追的,思路是:

理论上的思路一

先弄一个空程序,运行以后是黑界面。代码里可以通过 SetWatermarkParameters() 方法将水印设置在左上角。打开 FPS 显示,这时发现 FPS 显示于水印之上,说明水印在 FPS 文字绘制之前就已经绘制。

OllyDbg 中智能搜索,然后查找“FPS”,可以追到 FPS 绘制处。往前翻,绘制 FPS 之前连着有一处 call,然后再往上翻,看字符串,显然是 Init3DWindowed() 的初始化过程,所以感觉这个 call 有鬼,在这个地方下断点研究研究,应该可以阻断水印绘制(后来验证看此 call 正是调用了绘制水印的那段子程序)。

理论上的思路二

印象里官网说是购买以后根据购买凭证,需要怎么弄出一个 license 文件(6.3 版本是字符串,不用文件)放在特定位置,然后在 Init3DWindowed() 方法之前用 SetLicenseFile() 方法调用这个文件,检测成功且内容匹配水印就消失。

就可以从这个文件下手,根据官方提供的模板程序中的注释,在执行 Init3DWindowed() 方法时会执行上述过程,而此方法又可以通过日志中输出的字符串

DEVICE INIT : Initialize Depth

在 OllyDbg 追到。或者直接智能搜索后,查找“.lic”也可以,再追溯应该可以找到对应的算法,能弄出相应的 keygen(当然笔者水平比较有限,估计弄不出来)。

方法二:直接替换水印图像

操作方法

使用 MultiExtractor Pro 3.2.0,打开 DLL,点击提取 -> Extract mode (choose and extract) -> Start。

在这里插入图片描述

发现 DLL 内含有一张规格为 175x80x32BPP 的 DDS 贴图,将其提取出来(右键 -> Extract to…)

在这里插入图片描述

查看发现正好是水印的贴图。

在这里插入图片描述

用 PS 将该图像打开,删除全部内容,使图像完全透明,保存。然后将透明图像导回 DLL 内(右键 -> Import from…)。

在这里插入图片描述

关闭 MultiExtractor,修改完成。

过程说明

其他的资源提取软件,如 ResourceHacker、Exescope 等,经测试均不可以。

之前还担心水印也有可能是以 byte[] 甚至 Color[] 写在程序代码中的,这样就没办法直接通过替换资源来修改了。但后来发现想多了。

方法三:参照已被他人去掉水印的 DLL 修改相应位置

因为我手里已经有了一个 VB 版的无水印 DLL,还有 VB 的原版 DLL,内核都一样,不出意外的话研究一下这两个文件有什么区别,拿到 .Net 的 DLL 上做相同修改,应该一样好使。心里估计应该就是 nop 掉某个地方就行,改动不会特别大。

使用 Beyond Compare 对比发现,文件头尾有几处较大的不同之处,应该都不是造成水印消失的原因,不会差距那么大的。只有中间有个小的不同之处,查看发现,有水印 DLL 的 E8 1B DC FD FF 被改为 90 90 90 90 9090 正好对应汇编中的 nop 指令,这里应该是连续的 5 个 nop,大概率就是这里。

在 OllyDbg 中查找 nop 指令直接就找到连续的 5 个 nop 位于 10062BF9,比对发现 VB 有水印版 DLL 的处原句 call TVb3D65.RGBA(看名称跟颜色有关,很像是我们要找的目标)正好占 5 个长度,被替换为 nop,前后文都没变。相应地,在 .Net 有水印版 DLL 找到对应位置(当然 .Net 和 VB 版代码不完全一样,但还是能看出对应关系的),也就是方法一中所说的 100BD7F8,nop 掉,运行发现水印成功去掉了。

为什么要修改?

事件原委

  1. 最近要用到此库。虽然 C# 在游戏引擎上有 Unity(在用)、在 3D 引擎上有 SharpDX、有 OpenTK(请注意游戏引擎和 3D 引擎的差别),但近期接触到了一些古老的程序,还是得用这个 TV3D。关于此引擎的一些介绍,以及具体拿它干嘛就不说了。

  2. 非常愿意买个正版来使用。但问题是官网已经 10 多年没人维护了,购买链接早已失效,其实这引擎也是个烂尾的半成品。以及,在官网论坛的某个帖子中,说注册登陆论坛能看那个 license 文件的生成办法,但是我注册以后收不到验证码,重新注册不让,所以换了个邮箱注册,可能是操作太快,说我是 spammer,把我 ban 了…… 现在任何帖子都无法查看,更是无法登陆和购买,我对其的好感度直接清零,所以也懒得更换浏览器或登录的网络环境重试,直接逆向爆破了。

免责声明

本文仅在逆向技术层面稍作探讨,且仅供学习和研究之用途,不以该文件产生经济利益、不提供爆破后的文件、不提供爆破过程中涉及的软件。如需实际使用,请遵照引擎作者要求的用户协议或法律声明。

附:(估计也没什么人会)在 C# 中使用 TV3D 6.5 的一些注意事项

  1. 需要对程序的 App.config 文件的 startup 标签中加一句 useLegacyV2RuntimeActivationPolicy="true" ,类似下文这样,然后就可以用任意版本的 C#,我用 .Net 4.5 测试通过。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true"> <!-- 注意:需要加入 useLegacyV2RuntimeActivationPolicy="true" 否则运行时在 Application.Run(new Form1()); 处报错 System.IO.FileLoadException:“混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。”-->
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>
  1. 此库大概在 2008 年前后编译,非常地早了,使用的语言可能是 .Net 1.1.4322 和 VC++ 7.0,基于 DX9 和 DX8。因为是使用 PInvoke 做的封装,并没有托管的 .Net 程序集,所以没有什么 .Net 的依赖项。DX 那些好像从 Win7 开始一般都自带了,所以在 VS 中单独引用此库,再引入命名空间 using MTV3D65 就可以正常使用(Win10 2004 测试通过)。

  2. 根据官方的说明,DLL 是 32 位的,没有 64 位版本,所以 VS 中 CPU 也要由 Any CPU 改为 x86。

  3. 此库虽然 .Net 可用,但不能跨平台,因为其底层是 C++ 的,里面引用了 DX,还有很多 Windows 的 API。

  4. 不得不吐槽一句,官方为此 DLL 附带的 xml 注释文件形同虚设。里面对任何方法的 summary,内容都是 missing。如果需要看帮助,可以看 TVWiki 或 6.3 版引擎(2004年的产品)里的 TVDN.chm,里面介绍了在 VB 中的各函数的使用说明,虽和 .Net 有些出入,但也基本能猜出来了。

猜你喜欢

转载自blog.csdn.net/xzqsr2011/article/details/106877325