以下是辛大神的自述:
这些程序是关于MFC程序的破解能力自测,原以为0-2级我能秒杀(当然我用爆破秒杀了0-2级),接下来去尝试算法分析却被MFC的各种函数弄得头晕,有必要好好学习了。。。。
花了整整2小时,才疏学浅啊。。。。我只是列出了关键代码,分号后的是注释,函数为了方便阅读都被我重命名了。。。。
.text:004013C4 align 10h
.text:004013D0 push 0FFFFFFFFh
.text:004013D2 push offset loc_401F34
.text:004013D7 mov eax, large fs:0
.text:004013DD push eax
.text:004013DE mov large fs:0, esp
.text:004013E5 sub esp, 18h
.text:004013E8 push ebp
.text:004013E9 push esi
.text:004013EA push edi
.text:004013EB xor edi, edi
.text:004013ED push 1
.text:004013EF mov esi, ecx
.text:004013F1 mov [esp+18h], edi
.text:004013F5 call ?UpdateData@CWnd@@QAEHH@Z ; CWnd::UpdateData(int)
.text:004013FA lea ebp, [esi+78h] ; 取得Name的地址
.text:004013FD mov ecx, ebp ; 传递给ecx
.text:004013FF mov [esp+18h], ebp
.text:00401403 call ds:?GetLength@?$CSimpleStringT@D$00@ATL@@QBEHXZ ; this_Call ,用ecx传递指针,参数从右向左压栈
.text:00401409 cmp eax, 6 ; 与6进行比较
.text:0040140C jl Testlow_Exit ; ;这里是Serial的地址
.text:00401412 add esi, 7Ch ; 得到Serial的地址
.text:00401415 mov ecx, esi
.text:00401417 call ds:?GetLength@?$CSimpleStringT@D$00@ATL@@QBEHXZ ; ATL::CSimpleStringT<char,1>::GetLength(void)
.text:0040141D cmp eax, 6
.text:00401420 jl Testlow_Exit
.text:00401426 push ebx
.text:00401427 mov ecx, esi
.text:00401429 mov [esp+14h], edi
.text:0040142D call ds:?GetLength@?$CSimpleStringT@D$00@ATL@@QBEHXZ ; ATL::CSimpleStringT<char,1>::GetLength(void)
.text:00401433 test eax, eax
.text:00401435 jle short SerialSum ; 此处无法跳转
.text:00401437
.text:00401437 SerialTestRun: ; CODE XREF: .text:0040147Dj
.text:00401437 push 1
.text:00401439 lea eax, [edi+edi] ; edi为0
.text:0040143C push eax
.text:0040143D lea ecx, [esp+20h] ; 这里是mid函数生成的字符串指针保存的位置
.text:00401441 push ecx
.text:00401442 mov ecx, esi ; 将Serial的指针所在地址给ecx
.text:00401444 call ds:?Mid@?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@&#