超级狗SuperDog加密狗复制破解

2021-11-07

超级狗SuperDog加密狗复制破解


SuperDog是目前市面上较为强大的加密狗,其中的基于.NET方法体加密的功能比较有特点,使用了代码混淆,将原方法体代码加密后保存到程序数据,程序运行是动态解密数据,并使用.NET的DynamicMethod,动态创建代码执行。(备注:本文章只做学习和研究使用,请勿用于其他商业用途)



一、方法/步骤


在我上一篇文章中,我们使用DNSPY自身的一些功能来恢复被狗加密过的方法体,经过这几天的再研究,发现上次那种方法有两个缺陷:


加密后的方法体基本上都是如下面的的结构


22.png


方法体长度一般在85-100 bytes之间,如果原方法体长度小于这个加密后的方法体长度,采用复制的方法没有问题,如果长度大于这个范围,则会产生不可预料的问题,采用CFF工具在原EXE文件中增加一个区段,将取得的方法体附加进这个段,再修改元数据的RAV重新指向这个区段来解决,这样虽然能解决长度问题,但需要修改的地方太多,如果加密的方法体太多,工作量较大。本文采用另一种方法,可以较快、准确、较快的还原方法体,后面会有详述。


如果原有方法体中有异常处理模块(TRY CATCH等)处理模块,采用上一次我发的方法是无法还原的,这也是我们今天要解决的问题。老办法,我们写一个测试程序,里面有异常处理程序。


22.png


我们使用DNSPY打开编译好的EXE程序,选中MAIN方法,选择Edit Method Body,查看方法体异常结构,这个数据我们记录下来,后面要用到。


22.jpg


这里简单普及一下.NET异常处理数据结构。(有兴趣的朋友可以去“逆向开发技术网”了解一下),上图表示的异常结构在PE文件里面是按如下格式存储的:标志/Try结构偏移/Try结构长度/Handler偏移/Handler长度/Handler类型meta data token/filter-base exception hander,这个结构分为small和fat两种类型,这两种类型结构一样的,只是存储长度不同而已,small异常结构适用于try与handle代码块长度都小于256字节并且偏移量小于65536的方法,反之则使用fat异常处理结构。我们来看一下上图第一行异常处理是如何存储的:00/0400/5f/6300/16/01000001,这是一个small异常处理模块。

编译,加密,使用de4dot去混淆,这些步骤在上一篇文章已经说过了,这里就不再啰嗦。


22.jpg


使用“IL字节码解码工具”将取得的二进制码翻译成IL码:


22.jpg


大家可能看到这解码后的IL码有一些乱码,这是由于SUPERDOG加密狗加密常量字符串造成,我们后面将研究如何处理这些加密字符串。


打开ILDASM,将rundll-cleaned反编译成IL码,文件名我们暂定为crack.il。


使用ULTRAEDIT打开crack.il,找到main方法体如下:


22.jpg


将方法体替换成上面我们使用工具解码出来的IL码,现在MAIN方法体如下:


22.jpg


再在在glass0.smethod_6的这里下断开,找到局部变量定义


22.jpg


看NUM2值为5,说明局部变量有5个,执行5次,得到局部变量类型如下:
[0] int 32,[1] {myFirstDll.Show},[2] string ,[3]string,[4] int32修改main方法体如下代码修改main方法体如下代码 .locals init (class [mscorlib]System.Object[] V_0,
class [mscorlib]System.Reflection.Emit.DynamicMethod V_1)为
.locals init ([0] int32 V_0,
[1] class myFirstDll.Show V_1,
[2] string V_2,
[3] string V_3,
[4] int32 V_4)


进入命令行,使用ILASM重新编译CRACK.IL文件C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm crack.il 这时会生成CRACK.EXE文件


现在还没有完,我们还得处理异常模块,在glass0.smethod_8里下断点


22.jpg


这时ARRAY5数组内的数据就是异常处理数据,这里解释一下这个数组的含义,[0]0x01表示这是一个small异常处理结构,[1]0x1c,表示数组长度,后面[4]-[15]为异常结构处理体00/0400/6e/7200/16/01000001,前面我们分析过,前两位为00表示这是一个有异常处理类型的结构,类型TOKEN为后4位0x01000001,我们打开METADATA看看这是什么类型,原来是System.Object,后面[16]-[27]是另一个异常处理结构finally,和前面分析相同,这里不多说,大家可以自行分析下。


22.jpg


下面我们来为方法体添加异常处理模块,用DNSPY打开CRACK.EXE选中MAIN方法,选择Edit Method Body-Exception Handlers,我们添加两个异常处理,如下图


22.jpg


第一条是根据前身得到的异常处理模块数据00/0400/6e/7200/16/01000001得来的,为什么是这样,前面已经解释过,第二条根据后面的数据得来,点OK,我们看看这时MAIN方法是什么样子。


22.jpg


和前面对比,发现程序除了字符串常量不正确外,全部已经正确了,这时找到被加密的字符串常量就可以收工了,这个很简单,程序提示已经非常明显了,在Gclass3.Gclass6.method_4方法,最后一条语句下断,循环执行,就能看到所有解密字符串了,当然有兴趣的朋友可以研究一下狗的字符串加密原理,自己写一个解密程序,也行,看兴趣,我这里就不啰嗦了,找到解密后的字符串,替换一下,原来的代码,至此,去狗操作全部完成,这种方法可以完美去除狗。


解密完成后,可以进一步优化程序,将狗壳附加的代码全部删除,这样就和原来的代码一模一样了,大家可以去尝试下。

分享
写下您的评论吧