逆向研究超级狗SuperDog加密狗克隆方法!

逆向研究超级狗SuperDog加密狗克隆方法!

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

方法/步骤

  1. 1

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

  2. 2

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

    逆向研究超级狗SuperDog加密狗复制克隆方法!
  3. 3

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

  4. 4

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

    逆向研究超级狗SuperDog加密狗复制克隆方法!
  5. 5

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

    逆向研究超级狗SuperDog加密狗复制克隆方法!
  6. 6

    这里简单普及一下.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去混淆,这些步骤在上一篇文章已经说过了,这里就不再啰嗦。

    逆向研究超级狗SuperDog加密狗复制克隆方法!
  7. 7

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

    逆向研究超级狗SuperDog加密狗复制克隆方法!
  8. 8

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

  9. 9

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

  10. 10

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

    逆向研究超级狗SuperDog加密狗复制克隆方法!
  11. 11

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

    逆向研究超级狗SuperDog加密狗复制克隆方法!
  12. 12

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

    逆向研究超级狗SuperDog加密狗复制克隆方法!
  13. 13

    看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)

  14. 14

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

  15. 15

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

    逆向研究超级狗SuperDog加密狗复制克隆方法!
  16. 16

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

    逆向研究超级狗SuperDog加密狗复制克隆方法!
  17. 17

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

    逆向研究超级狗SuperDog加密狗复制克隆方法!
  18. 18

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

    逆向研究超级狗SuperDog加密狗复制克隆方法!
  19. 19

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

  20. 20

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

猜你喜欢

转载自www.cnblogs.com/q528621124/p/11713624.html