一、声明:
此Crack Me只是为了对这种算法的研究,并不用于任何商业目的。
这种算法的加密强度很高,不见得就是名不经传的算法,但对我来说,还是第一次见到。
Crack Me 中有原版本的KEY,从KEY中可以看出算法作者应该有逆向的方法,但我却无从知道了。如果有谁知道确切的算法名称的话,还请不啬赐教,谢谢:)
Crack Me 地址:
点这里下载CRACK ME
二、算法流程
把输入的注册号(128位),程序内置的种子数128位(ASCII"8E796B7905A018773ECE6313D3B2E9A6EA1EE06B09CD2AEFA954AF868D4ACCF7A089D22B2DB7F28DD85B0C06BF6953578A4418FA33DF4D559C9B84ADEB5DA909")
分别压缩为2组64位的矩阵结构,然后进行多次的循环变形,把最后变形后的ASCII颠倒顺序,并与机器号和用户名进行比较。
我对各种算法并不熟悉,因为Crack Me中的原KEY中的数据得到的结果与机器号和用户名是完美匹配的,所以开始我认为这种算法为可逆算法,但结果却很难很难(有兴趣的可以跟踪原注册号进行比较,运算看到最后的结果就明白了)。我找了各种算法的书,并用算法工具检测,也没有关于这种算法的确切结果。
为了节省大家的时间,我把Crack Me中需要用到的代码粗略的列在附件中,具体可以反编译Crack Me。
附:核心代码过程
1、主线程核心运算过程
0040AE44 53 push ebx ;结果所保存的位置
0040AE45 57 push edi ;程序预置的数据压缩成的64矩阵
0040AE46 55 push ebp ;“010001”
0040AE47 56 push esi ;输入的假注册号被压缩成的64位矩阵
0040AE48 E8 E3>call 休正dump.00430B30
0040AE4D 8D8C2>lea ecx,dword ptr ss:[esp+130]
0040AE54 6A 00 push 0
0040AE56 51 push ecx
0040AE57 53 push ebx
0040AE58 68 00>push 100
0040AE5D E8 7E>call 休正dump.004308E0 ;上面运算的结果颠倒顺序,与下面的比较相吻合
2、主线程核心比较过程
0040AE82 8B942>mov edx,dword ptr ss:[esp+330]
0040AE89 8B3D >mov edi,dword ptr ds:[<&msvcrt.sprintf>] ; msvcrt.sprintf
0040AE8F 52 push edx
0040AE90 8D442>lea eax,dword ptr ss:[esp+24]
0040AE94 68 80>push 休正dump.00444480 ; ASCII "%s"
0040AE99 50 push eax
0040AE9A FFD7 call edi
0040AE9C 8B8C2>mov ecx,dword ptr ss:[esp+33C]
0040AEA3 8B35 >mov esi,dword ptr ds:[<&msvcrt.strstr>] ; msvcrt.strstr
0040AEA9 8D942>lea edx,dword ptr ss:[esp+12C]
0040AEB0 51 push ecx
0040AEB1 52 push edx
0040AEB2 FFD6 call esi
0040AEB4 83C4 >add esp,14
0040AEB7 85C0 test eax,eax
0040AEB9 5D pop ebp
0040AEBA 0F84 >je 休正dump.0040AFB4
0040AEC0 A1 00>mov eax,dword ptr ds:[448E00]
0040AEC5 8D4C2>lea ecx,dword ptr ss:[esp+1C]
0040AEC9 50 push eax
0040AECA 68 8C>push 休正dump.00445C8C ; ASCII "%d"
0040AECF 51 push ecx
0040AED0 FFD7 call edi
0040AED2 8D542>lea edx,dword ptr ss:[esp+28]
0040AED6 8D842>lea eax,dword ptr ss:[esp+128]
0040AEDD 52 push edx
0040AEDE 50 push eax
0040AEDF FFD6 call esi
0040AEE1 83C4 >add esp,14
0040AEE4 85C0 test eax,eax
0040AEE6 0F84 >je 休正dump.0040AFB4
3、子程序核心运算过程(生成最后比较的字串过程)
00430D55 56 push esi
00430D56 E8 F5>call 休正dump.00432C50
00430D5B 8B0D >mov ecx,dword ptr ds:[448F38]
00430D61 8B442>mov eax,dword ptr ss:[esp+14]
00430D65 8B91 >mov edx,dword ptr ds:[ecx+1E0]
00430D6B 52 push edx
00430D6C 50 push eax
00430D6D E8 7E>call 休正dump.00432EF0
00430D72 8B15 >mov edx,dword ptr ds:[448F38]
00430D78 8B742>mov esi,dword ptr ss:[esp+28]
00430D7C 8B4C2>mov ecx,dword ptr ss:[esp+20]
00430D80 56 push esi
00430D81 8B82 >mov eax,dword ptr ds:[edx+1E0]
00430D87 51 push ecx
00430D88 50 push eax
00430D89 E8 22>call 休正dump.00430DB0
00430D8E 56 push esi
00430D8F 56 push esi ;这里是最终要进入循环运算的输入,也是循环后结果保存的地方
00430D90 E8 8B>call 休正dump.00433020 ;这里得到最终循环的结果,返回主程序后,对得到的结果的顺序进行逆向。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课