以下同样是辛大神所述:
我还是很懒的,能爆破的就爆破
CrackMe 2 的难度在于没有的敏感字符串以及敏感函数的检测,提示字符串彻彻底底没了,可是敏感函数我就呵呵了,那就是常用的一个函数UpdateData,MSDN给的解释就是把输入的内容更新到变量里去,还有某些字符串函数。
算了,要是撇开这个不谈,就是要上调试器下段了
OllyDbg很强大,Message breakpoint on classproc 就可以给按钮下段,事先查壳也没有,再给.text就是代码段下段就好,来回单步步入反复几次不难找到注册代码。。
既然都上调试器了,就懒得去分析,直接爆破算了,输入了用户名密码
NAME:DANTENGJUN
SERIAL:22222222
注册算法处已经被我下段
单步跟进呗
.text:00401581 push 1
.text:00401583 mov ecx, ebx
.text:00401585 stosb
.text:00401586 call ?UpdateData@CWnd@@QAEHH@Z ; CWnd::UpdateData(int)
.text:0040158B lea ecx, [ebx+74h]
.text:0040158E call ds:??B?$CSimpleStringT@D$00@ATL@@QBEPBDXZ ; ATL::CSimpleStringT<char,1>::operator char const *(void)
.text:00401594 lea edx, [esp+10h]
.text:00401598
.text:00401598 loc_401598: ; CODE XREF: .text:004015A0j
.text:00401598 mov cl, [eax]
.text:0040159A inc eax
.text:0040159B mov [edx], cl
.text:0040159D inc edx
.text:0040159E test cl, cl
.text:004015A0 jnz short loc_401598 ; 这里不符合算法是个死循环。。果断改掉
.text:004015A2 mov al, [esp+16h]
.text:004015A6 test al, al
.text:004015A8 jnz short loc_4015FA
.text:004015AA mov dl, [esp+15h]
.text:004015AE test dl, dl
.text:004015B0 jz short loc_4015FA ; 很明显跳到下面会over,改掉。。
.text:004015B2 mov eax, [ebx+78h]
.text:004015B5 cmp eax, 186A0h
.text:004015BA jl short loc_4015FA
.text:004015BC movsx esi, byte ptr [esp+12h]
.text:004015C1 movsx ecx, byte ptr [esp+11h]
.text:004015C6 movsx edi, byte ptr [esp+14h]
.text:004015CB add ecx, esi
.text:004015CD movsx esi, byte ptr [esp+10h]
.text:004015D2 add ecx, esi
.text:004015D4 movsx esi, byte ptr [esp+13h]
.text:004015D9 movsx edx, dl
.text:004015DC add esi, edi
.text:004015DE add esi, edx
.text:004015E0 cdq
.text:004015E1 mov edi, 3E8h
.text:004015E6 idiv edi
.text:004015E8 cmp ecx, eax
.text:004015EA jnz short loc_4015FA ; 改掉
.text:004015EC cmp esi, edx
.text:004015EE jnz short loc_4015FA ; 接着改
.text:004015F0 mov eax, [ebx]
.text:004015F2 mov ecx, ebx
.text:004015F4 call dword ptr [eax+154h]
.text:004015FA
.text:004015FA loc_4015FA: ; CODE XREF: .text:004015A8j
.text:004015FA ; .text:004015B0j ...
.text:004015FA mov ecx, [esp+94h]
.text:00401601 call sub_401A49
.text:00401606 pop edi
.text:00401607 pop esi
.text:00401608 pop ebx
.text:00401609 mov esp, ebp
.text:0040160B pop ebp
.text:0040160C retn
于是结果很明显