【文章标题】: XXXXXX crackme算法分析
【文章作者】: the0crat
【作者邮箱】: the0crat.cn_at_gmail.com
【作者主页】: http://the0crat.spaces.live.com
【生产日期】: 20070225
【软件名称】: xxxxxx
【保护方式】: 注册码
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: IDA+OD
【作者声明】: 本文仅供研究学习,本人对因这篇文章而导致的一切后果,不承担任何法律责任。本文中的不足之处请各位多多指教
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
--------------------------------------------------------------------------------
【详细过程】
无壳。run trace,分析运行过的代码,最终定位到这里
004016E0 > . 6A FF push -1 ; sub_4016E0
004016E2 . 68 B0164200 push <loc_4216B0> ; SE handler installation
004016E7 . 64:A1 0000000>mov eax, dword ptr fs:[0]
004016ED . 50 push eax
004016EE . 64:8925 00000>mov dword ptr fs:[0], esp
004016F5 . 83EC 2C sub esp, 2C
004016F8 . A1 D8C24200 mov eax, dword ptr [42C2D8]
004016FD . 55 push ebp
004016FE . 56 push esi
004016FF . 57 push edi
00401700 . 8BF1 mov esi, ecx
00401702 . 894424 0C mov dword ptr [esp+C], eax
00401706 . C74424 40 000>mov dword ptr [esp+40], 0
0040170E . 894424 14 mov dword ptr [esp+14], eax
00401712 . 8B0D 54C14200 mov ecx, dword ptr [42C154]
00401718 . A1 50C14200 mov eax, dword ptr [42C150]
0040171D . 8B15 58C14200 mov edx, dword ptr [42C158]
00401723 . 894C24 28 mov dword ptr [esp+28], ecx
00401727 . 8A0D 60C14200 mov cl, byte ptr [42C160]
0040172D . 894424 24 mov dword ptr [esp+24], eax
00401731 . A1 5CC14200 mov eax, dword ptr [42C15C]
00401736 . 884C24 34 mov byte ptr [esp+34], cl
0040173A . 6A 01 push 1
0040173C . 8BCE mov ecx, esi
0040173E . C64424 44 01 mov byte ptr [esp+44], 1
00401743 . 895424 30 mov dword ptr [esp+30], edx
00401747 . 894424 34 mov dword ptr [esp+34], eax
0040174B . E8 F4890100 call <sub_41A144>
00401750 . 8DBE 90000000 lea edi, dword ptr [esi+90]
00401756 . 8D4C24 14 lea ecx, dword ptr [esp+14]
0040175A . 57 push edi
0040175B . E8 C2660100 call <sub_417E22> ; 取用户名
00401760 . 8B17 mov edx, dword ptr [edi]
00401762 . 8B6A F8 mov ebp, dword ptr [edx-8] ; 长度
00401765 . 85ED test ebp, ebp
00401767 . 0F84 F8000000 je <loc_401865>
0040176D . 83FD 08 cmp ebp, 8
00401770 . 7D 0D jge short <loc_40177F> ; 大于等于8则跳
00401772 . 68 44C14200 push 0042C144 ; prudence
00401777 . 55 push ebp
00401778 . 8BCF mov ecx, edi
0040177A . E8 43420100 call <sub_4159C2>
0040177F > > 55 push ebp ; loc_40177F
00401780 . 8BCF mov ecx, edi
00401782 . E8 53670100 call <sub_417EDA>
00401787 . 8D4C24 24 lea ecx, dword ptr [esp+24]
0040178B . 8D5424 1C lea edx, dword ptr [esp+1C]
0040178F . 51 push ecx
00401790 . 52 push edx
00401791 . 50 push eax
00401792 . E8 B9FEFFFF call <off_423650> ; 跟进--------->
00401650 >/$ 83EC 08 sub esp, 8 ; off_423650
00401653 |. 8B5424 14 mov edx, dword ptr [esp+14]
00401657 |. 8B4C24 0C mov ecx, dword ptr [esp+C]
0040165B |. 53 push ebx
0040165C |. 55 push ebp
0040165D |. 56 push esi
0040165E |. 8B32 mov esi, dword ptr [edx]
00401660 |. 8B01 mov eax, dword ptr [ecx]
00401662 |. 8B49 04 mov ecx, dword ptr [ecx+4]
00401665 |. 897424 18 mov dword ptr [esp+18], esi
00401669 |. 8B72 04 mov esi, dword ptr [edx+4]
0040166C |. 897424 20 mov dword ptr [esp+20], esi
00401670 |. 8B72 08 mov esi, dword ptr [edx+8]
00401673 |. 8B52 0C mov edx, dword ptr [edx+C]
00401676 |. 897424 0C mov dword ptr [esp+C], esi
0040167A |. 895424 10 mov dword ptr [esp+10], edx
0040167E |. 57 push edi
0040167F |. 33D2 xor edx, edx ; edx=0
00401681 |. BE 20000000 mov esi, 20
00401686 >|> 8B5C24 1C /mov ebx, dword ptr [esp+1C] ; "This"
0040168A |. 8B6C24 24 |mov ebp, dword ptr [esp+24] ; " is "
0040168E |. 8BF9 |mov edi, ecx
00401690 |. 33D9 |xor ebx, ecx ; ebx="This"^ecx[i]
00401692 |. 81EA 4786C861 |sub edx, 61C88647 ; edx-=61c88647h
00401698 |. 03DD |add ebx, ebp ; ebx+=" is "
0040169A |. C1EF 05 |shr edi, 5
0040169D |. 33FA |xor edi, edx ; edi=(ecx[i]>>5)^edx
0040169F |. 8BE9 |mov ebp, ecx
004016A1 |. C1E5 04 |shl ebp, 4 ; ecx[i]<<4
004016A4 >|. 03DF |add ebx, edi ; ebx+=edi
004016A6 |. 03EB |add ebp, ebx ; ebp+=ebx
004016A8 >|. 8B5C24 10 |mov ebx, dword ptr [esp+10] ; "a cr"
004016AC |. 03C5 |add eax, ebp ; eax=用户名前四位+ebp
004016AE |. 8B6C24 14 |mov ebp, dword ptr [esp+14] ; "ack."
004016B2 |. 8BF8 |mov edi, eax
004016B4 |. 33D8 |xor ebx, eax ; ebx^=eax
004016B6 |. C1EF 05 |shr edi, 5
004016B9 |. 03DD |add ebx, ebp ; ebx+=ebx
004016BB |. 33FA |xor edi, edx ; edi=(eax>>5)^edx
004016BD |. 8BE8 |mov ebp, eax
004016BF |. 03DF |add ebx, edi ; ebx+=edi
004016C1 |. C1E5 04 |shl ebp, 4
004016C4 |. 03EB |add ebp, ebx ; ebp=(eax<<4)+ebx
004016C6 |. 03CD |add ecx, ebp ; ecx[i]=ecx[i-1]+ebp
004016C8 |. 4E |dec esi ; 循环32次
004016C9 |.^ 75 BB \jnz short <loc_401686>
004016CB |. 8B5424 20 mov edx, dword ptr [esp+20]
004016CF |. 5F pop edi
004016D0 >|. 5E pop esi ; off_4236D0
004016D1 |. 5D pop ebp
004016D2 |. 8902 mov dword ptr [edx], eax
004016D4 |. 894A 04 mov dword ptr [edx+4], ecx
004016D7 |. 5B pop ebx
004016D8 |. 83C4 08 add esp, 8
004016DB \. C3 retn
返回
00401797 . 8B4424 2C mov eax, dword ptr [esp+2C]
0040179B . 8B4C24 28 mov ecx, dword ptr [esp+28]
0040179F . 50 push eax
004017A0 > . 51 push ecx ; off_4237A0
004017A1 . 8D5424 20 lea edx, dword ptr [esp+20]
004017A5 . 68 3CC14200 push 0042C13C ; ("%x-%x",n,sum)
004017AA . 52 push edx
004017AB . E8 CF450100 call <sub_415D7F> ; 转换成上面形式的字符串格式
004017B0 . 83C4 1C add esp, 1C
004017B3 . 8D4C24 0C lea ecx, dword ptr [esp+C]
004017B7 . E8 B5670100 call <sub_417F71> ; 全部大写
004017BC . 8D4C24 0C lea ecx, dword ptr [esp+C]
004017C0 . E8 BE670100 call <sub_417F83> ; 字符串反转
004017C5 . 8B86 94000000 mov eax, dword ptr [esi+94]
004017CB . 50 push eax ; /Arg2
004017CC . 8B4424 10 mov eax, dword ptr [esp+10] ; |
004017D0 . 50 push eax ; |Arg1
004017D1 . E8 10800000 call <__mbscmp> ; \注册码与输入的对比
004017D6 . 83C4 08 add esp, 8
004017D9 . 85C0 test eax, eax
004017DB . 0F85 84000000 jnz <loc_401865> ; 不相同则失败
[算法总结]
sum==ecx累加器
sum_0=用户名后四位
m==edx每次循环减一个常数
m_0=-61C88647h
n_0=eax=用户名前四位
for(i=0;i<32;i++)
{
n+=用户名前四位+sum<<4+"This"^sum+" is "+(sum>>5)^m
ebx="a cr"^(用户名前四位+sum<<4+"This"^sum+" is "+(sum>>5)^m)+"ack."
edi=((用户名前四位+sum<<4+"This"^sum+" is "+(sum>>5)^m)>>5)^m
ebp=(用户名前四位+sum<<4+"This"^sum+" is "+(sum>>5)^m)<<4
sum+=ebx+edi+ebp
m-=-61C88647h
}
用户名:the0crat
注册码:FDC9D667-AB610E7A
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)