软件破解技术初探

声明:本文所涉及内容,仅供学习交流使用,请勿用于非法用途,否则后果自负!

MarkdowPad 2是Windows下的一款基于.Net的离线Markdown编辑器,普通版功能受限,专业版需要购买序列号。网上意外看到一篇文章,说的是用工具破解MarkdownPad,感觉比较有趣,就做了学习和尝试(后面简称为“原文”)。

文章链接在此 http://www.zan3.com/zan492.html

用ILSpy查看C#源码

可以使用ILSpy直接将基于.NET的EXE文件反编译成源代码进行查看(语言可以选择 C# / VB / IL)。

在程序目录中找到MarkdownPad2.exe文件,用ILSpy打开如下图。展开MarkdownPad2.Licensing中的LicenseEngine,可以看到里面的VerifyLicense方法,其参数为licenseKey和email,返回值为布尔型。按照原文中的解释,这个函数用于验证License,验证通过就会返回true;所以只要在这里修改,让其直接返回true即可。但是由于ILSpy中不能直接修改EXE的源码,还需要通过一些工具进行。

用IDA工具查看IL指令码,及对应的十六进制码

使用IDA工具

使用工具IDA 6.5,将EXE文件拖动进去,按照默认选项点击OK。

然后弹出窗口报错,ph.cnbits is illegal,具体原因不详

尝试选择了Portable executable for 80386 (PE) [pe.ldw],得出的结果如图,Function name中只有一个start函数,不能解析出所有函数。

更换IDA软件

网上找了找,也没有找到原因。于是重新下载了一个IDA 5.5进行尝试,按默认值,点击OK,反编译成功。估计前面没能成功反编译,是因为IDA软件自身的问题。

查看函数

点击Function name,按Alt+T,输入VerifyLicense搜索,找到VerifyLicense函数,双击即可以流程图、十六进制编码等形式显示这个函数。

通过标签可以切换不同显示形式。上图中的IDA View-A标签中显示的,是IL指令码的框图,类似于汇编代码。标签Hex View-A中显示的是IL指令码对应的十六进制代码,也就是exe文件中的十六进制编码。

如果把.NET源程序比作C语言,IL指令集就相当于汇编指令,而十六进制编码就相当于机器码。区别在于这里的代码是IL中间代码,需要.NET环境解析执行;而机器码可以直接被CPU执行。

寻找要修改的代码

用十六进制编辑器修改exe文件,就修改了IL指令,相当于改动了源码。按原文说明,在IDA View-A中单击选中图中的ldc.i4.0,这句IL指令与ret组合起来,相当于return false,从流程图中可以分析出,对应了C#源码中VerifyLicense函数的第一个return false。

public bool VerifyLicense(string licenseKey, string email)

{

if (string.IsNullOrEmpty(licenseKey) string.IsNullOrEmpty(email))

{

return false;

}

// …

}

切换到Hex View-A视图中,可以看到图中十六进制的16被选中,如果改成17就可以将ldc.i4.0变为ldc.i4.1,相当于把源码中的return false变成了return true。于是按照源码的逻辑,只要邮箱和注册码有一项为空,就会执行到这句返回true,从而使得软件注册通过。

使用十六进制编辑器修改EXE文件

十六进制编辑器有很多种,经过简单的对比,发现HxD非常好用。不仅是免费的,而且操作起来非常方便。相比而言,WinHex操作并不方便,例如搜索十六进制字符时中间不能有空格,而且免费版使用有限制。

因为十六进制编码里面肯定有很多16,我们需要的是修改特定的16。在IDA中吧我们找到的16和它后面的一段长度合适的十六进制代码复制出来,如“16 2A 02 02 03 28 4A 01”。然后在HxD中进行搜索,从而找到这个特定的“16”。搜索到了要确定这个16是唯一的匹配项,否则可以自行比对,以确定找到的是正确的16。最后将其改成“17”保存。

重新用ILSpy打开,可以验证,false已经变成了true,如图。

打开软件进行验证

打开MarkdownPad软件,也就是被修改的exe文件。启动时,发现程序弹出窗口报错,如图。

在菜单中选择Help-Upgrade to MarkdownPad Pro,弹出窗口填写邮箱和注册码,发现了一个问题,如果邮箱和注册码有一个为空,OK按钮就无法点击。所以前面修改的代码return true根本没法被执行,所以这个方法无效。

继续尝试

之后又做过尝试,将brtrue指令改为brfalse,相当于使得C#源码成为:

if ( ! string.IsNullOrEmpty(licenseKey) string.IsNullOrEmpty(email))

{

return true;

}

从而在licenseKey非空时,可以执行到return true,但是还是没能成功,错误和之前一样。

网上找到的破解版

在网上找到一个破解版的软件,版本号为2.4.2.29969,用ILSpy看到其源码如下。可以看出,这个函数已被做了较大修改。实际尝试时,输入任意邮件和注册码都可以注册通过。

再次尝试

参考上面的代码,再次尝试对代码进行改动。由于程序代码中有很多跳转指令,可能用的是相对寻址一类的方法,和汇编一样。如果直接在exe中插入或者删除一段代码,经过尝试,会导致exe无法运行,甚至连图标都不显示了。所以最简单的方法就是只对EXE的局部进行修改,保证文件大小不变,保证未经修改的部分不受影响。

考虑将下述代码中的语句进行移动(可以保证文件大小不变)。即将

if (string.IsNullOrEmpty(licenseKey) string.IsNullOrEmpty(email))

{

return false;

}

try

{

this.License = this.Decrypt(licenseKey);

this.LicenseProcessed = true;

}

catch …

改成

this.LicenseProcessed = true;

return true;

if (string.IsNullOrEmpty(licenseKey) string.IsNullOrEmpty(email))

{

}

try

{

this.License = this.Decrypt(licenseKey);

}

catch …

首先通过IDA找到这段代码的十六进制部分如下图

用IDA逐条查看,十六进制码和对应的IL指令分别为

跳转指令

注意在这里,有多个相对跳转指令。移动代码后,指令的地址会发生变化,所以需要将指令的操作值进行修改。由于之前只对8086汇编有所接触,而对IL指令集并不了解,所以观察了两条跳转指令,分析出了一些特点。

跳转指令brtrue.s loc_37A0对应的十六进制码为2D 08 (04 28 A9 00 00 0A),地址为2FBE~2FBF,查看可发现,loc_37A0对应的16 (2A 02 02 03 28 4A 01)地址是2FC8(刚好中间差8,也就是2D 08中的操作数08)

跳转指令brfalse.s loc_37A2对应的十六进制码为2C 02 (16 2A 02 02 03 28),地址为2FC6~2FC7,查看可发现,loc_37A2对应的02 (02 03 28 4A 01 00 06)地址是2FCA(刚好中间差2,也就是2C 02中的操作数02)

修改结果

将其进行修改,结果如图。

也就是将

03 28 A9 00 00 0A 2D 08 04 28 A9 00 00 0A 2C 02 16 2A 02 02 03 28 4A 01 00 06 28 45 01 00 06 02 17 28 48 01 00 06 DD 14 01 00 00

替换为

02 17 28 48 01 00 06 17 2A 03 28 A9 00 00 0A 2D 08 04 28 A9 00 00 0A 2C 00 02 02 03 28 4A 01 00 06 28 45 01 00 06 DD 14 01 00 00

用ILSpy查看,可以看到代码已经按照预想修改好了,如下图:

再次验证失败

但是执行程序进行注册发现还是没有成功,显示错误和之前一样,如下图。查看了一下,我使用的版本为2.4.4.40074,猜测可能是新版本对序列号验证机制进行了改进,使得这种方法无法进行破解。网上没能找到原版2.4.2.29969软件,所以也没法验证这里的破解方法是否有效。

软件破解常用工具

破解补丁

如果上面的方法成功了,就可以将其写成一个小程序,自动对exe文件中的特定串进行替换,就成了软件破解补丁。

注册机

而另外一种常见的方法是注册机,原理是突破了软件的序列号验证算法,能生成可以通过验证的序列号,从而实现注册,不需要修改软件自身。从代码中可以看到,这个软件使用的是很常见的RSA加密算法。

账号共享

还可以共享正式购买的注册账号,实现一个账号在多个客户端上注册。有些商业软件也有这种授权机制,允许一个序列号在指定数目范围内的机器上使用。

注册表

有些软件的注册信息保存在注册表中,可以将注册表项导入实现软件注册。

本文的介绍到此为止。再次声明,本文只是为了学习软件破解技术,仅供学习之用,请勿用于不正当用途,否则后果自负。如需使用此软件,请支持正版。