asprotect:ASProtect的加密算法初步分析

  原来ASProtect几个作用对保护强度提高不小改以前个人所见过壳重窍门技巧轻算法毛病确在有些方面值得学习

  其利用原理如下:

  1)在编程时可以根据需要选择使用ASProtect提供几个

  比如:

SetRegistrationKey(...),
GetRegistrationInformation(...),
GetHardwareID(...)
  这几个由于使用了导出方式声明所以会在ExportTable中出现ASProtect在加壳时可以通过分析ExportTable识别出使用了哪些其提供从而对这些入口进行挂钩从而使其加壳后外壳代码可以象回调这些进行通信

  比如见以下代码:

0041333E loc_41333E: ; CODE XREF: sub_413253+B0j
0041333E mov eax, ds:4155CCh
00413343 cmp dword ptr [eax+0Ch], 0
00413347 jz loc_413360
00413349 mov eax, ds:41555Ch
0041334E mov eax, [eax]
00413350 call @@@LStrToPChar$qqrv ; __linkproc__ LStrToPChar(void)
00413355 push eax
00413356 mov eax, ds:4155CCh
0041335B mov eax, [eax+0Ch]
0041335E call eax
00413360
00413360 loc_413360: ; CODE XREF: sub_413253+F4j
00413360 mov eax, ds:4155CCh
00413365 cmp dword ptr [eax+30h], 0 ; eax 是内部结构指针
00413369 jz loc_413389
0041336B push 41105Ch
00413370 mov eax, ds:4155CCh
00413375 mov eax, [eax+30h]
00413378 call eax ; 这里将 GetDecryptProc(...)
0041337A push 41105Ch
0041337F mov eax, ds:4155CCh
  2)在编程时还可以加入ASProtect提供两个宏定义这两个宏定义实际上将起到特殊标志作用有点类似"块开始"和"块结束"作用在ASProtect将在加壳时将对"这些块"中代码进行加密对这些代码块加、解密使用了密码学算法目前还不十分清楚其使用算法初步分析这里可能用到了TWOFISH发现了些特征:

  化部分有以下常数设置:

0040C4AE mov dword ptr [ebx+48h], 67452301h
0040C4B5 mov dword ptr [ebx+4Ch], 0EFCDAB89h
0040C4BC mov dword ptr [ebx+50h], 98BADCFEh
0040C4C3 mov dword ptr [ebx+54h], 10325476h
0040C4CA mov dword ptr [ebx+58h], 0C3D2E1F0h
0040C4D1 mov dword ptr [ebx+5Ch], 76543210h
0040C4D8 mov dword ptr [ebx+60h], 0FEDCBA98h
0040C4DF mov dword ptr [ebx+64h], 89ABCDEFh
0040C4E6 mov dword ptr [ebx+68h], 1234567h
0040C4ED mov dword ptr [ebx+6Ch], 3C2D1E0Fh
  而运算部分有大量类似MD5算法运算由于代码太长不列举了

  3)在ASProtect中我们看到其提供了Registration_Keys加密方式ASProtect可以对你提供"Registration_Information"进行加密形成"Registeration_Key"(按照帮助中介绍你还可以使用自己"加解密算法"但是RegKey必须至少173个才有安全性)这个"RegKey"将以注册表文件(.reg)文件方式保存在加壳后外壳代码运行时将解密"RegKey"从而得到"RegInfo"当然这分为两种方式:种方式编程时使用了其提供回调SetRegistrationKey(...)那么外壳代码运行时将从而得到"RegKey"来解密出"RegInfo"如果没有使用这个外壳代码将从注册表中相应键名处提取键值作为"RegKey"来解密出"RegInfo"初步分析其可能使用了RSA算法

  其解密部分代码:

0040B4D4 loc_40B4D4: ; CODE XREF: license+156j
0040B4D4 ; license+15Fj
0040B4D4 lea edi, [ebp+lpInterBlock]
0040B4DA inc edi
0040B4DB mov esi, edi
0040B4DD push esi
0040B4DE lea eax, [ebp+lpInterStruct+8]
0040B4E4 push eax
0040B4E5 lea eax, [ebp+lpInterStruct+88h]
0040B4EB push eax
0040B4EC push esi
0040B4ED call decrypt_engine ; Criper Text to Plain Text...
  从 decrypt_engine 入口参数看有 4个:

  1)加密数据地址指针....(按每块进行解密).....即 m

  2)可能是RSA.N

  3)可能是RSA.E

  4)用于输出解密数据地址指针....

  目前还有几个问题还没有来得及分析:

  1)还没有见到TEA算法不过在CASPR中介绍中至少提到这个算法不知道这个算法在哪里用于作什么?

  2)在我了解了ASProtect会利用宏定义定义出"代码块"以后我想象ASProtect中其会把"代码块"挖出来"和"RegInfo"起加密形式成"RegKey"不过实际发现这些"代码块"并没有被"挖"出来而是使用种算法(可能是TWOFISH)解密不知道这个KEY到底保存在哪里?不知道是否保存在"RegKey"中我想大概如此^_^

  我想我们可以把ASProtect看成个"软锁""锁"中数据包括用于解密代码块KEY和用于解密"RegInfo"KEY即我们所见到串形式"RegKey"在外壳代码运行时ASProtect将提取"锁"中数据用于解密

  如果某分为"注册版本"和"试用版本"其使用ASProtect外壳+内部组合方式加密其注册版本将提供.reg注册表文件形式"RegKey"作为开锁"钥匙"那么我们能否在没有"钥匙"情况下破门而入呢?

  由于RegKey中包含了用于解密中提取出来"代码块"KEY那么在没有RegKey情况下自然我们也就缺少了这个KEY因此被提取出来"代码块"就无法正确解密如果在此情况下脱壳那么那些加密了代码块中数据依然是无用数据因此脱壳软件Software就成了破碎脱壳版本了因此在没有钥匙情况下看来破门而入想法不太乐观

Tags:  asprotect2.3 asprotectske asprotectv1.23 asprotect

延伸阅读

最新评论

发表评论