1.还是直接搜索字符串,回车来到失败的地方
[Asm] 纯文本查看 复制代码 010D13D0 . 8B0D 70300D01 mov ecx,dword ptr ds:[<&MSVCP140.std::co>; msvcp140.std::cout
010D13D6 . BA 54320D01 mov edx,CrackMe.010D3254 ; 破解成功,感谢您的参与!
010D13DB . 68 90170D01 push CrackMe.010D1790
010D13E0 . E8 6B010000 call CrackMe.010D1550
010D13E5 . 8BC8 mov ecx,eax ; ucrtbase.668A2108
010D13E7 . FF15 54300D01 call dword ptr ds:[<&MSVCP140.std::basic>; msvcp140.std::basic_ostream<wchar_t,std::char_traits<wchar_t> >::operator<<
010D13ED . C3 retn
010D13EE CC int3
010D13EF CC int3
010D13F0 . 8B0D 70300D01 mov ecx,dword ptr ds:[<&MSVCP140.std::co>; msvcp140.std::cout
010D13F6 . BA 70320D01 mov edx,CrackMe.010D3270 ; 破解失败,请继续加油!
010D13FB . 68 90170D01 push CrackMe.010D1790
010D1400 . E8 4B010000 call CrackMe.010D1550
010D1405 . 8BC8 mov ecx,eax ; ucrtbase.668A2108
010D1407 . FF15 54300D01 call dword ptr ds:[<&MSVCP140.std::basic>; msvcp140.std::basic_ostream<wchar_t,std::char_traits<wchar_t> >::operator<<
010D140D . C3 retn
2.010D13D0 这个是成功的call,.010D13F0 这个是失败的call,通过字符串“请输入密码”定位到call eax这个地方调用
[Asm] 纯文本查看 复制代码 010D1334 |. B8 D0130D01 |mov eax,CrackMe.010D13D0
010D1339 |. 8945 B8 |mov [local.18],eax
010D133C |. 3BFE |cmp edi,esi
010D133E |.^ 72 C4 \jb short CrackMe.010D1304
010D1340 |. EB 09 jmp short CrackMe.010D134B
010D1342 |> B8 F0130D01 mov eax,CrackMe.010D13F0
010D1347 |. EB 02 jmp short CrackMe.010D134B
010D1349 |> 33C0 xor eax,eax
010D134B |> FFD0 call eax
3.直接将mov eax,0x10D13F0改为mov eax,0x10D13D0即可爆破成功
PS:我只会爆破是在追不出来它的密码,就这样了,以下仅为猜测
[C++] 纯文本查看 复制代码
/*
使用时间播种,生成随机数
v10保存下一个goto跳转的地址
*/
v3 = time64(0);
srand(v3);
if ( v0 ) //v0我输入的值
{
while ( 1 )
{
v8 = &Src;
v9 = (char *)&Memory;
if ( v1 >= 0x10 )
v8 = v6;
if ( v18 >= 0x10 )
v9 = (char *)Memory;
v6 = (void **)v9[v7];
if ( (void **)(*((char *)v8 + v7) + 33) != v6 || v15 == sub_4013F0 )
break;
v6 = (void **)Src;
++v7;
v10 = (int (*)())sub_4013D0;
v15 = (int (*)())sub_4013D0;
if ( v7 >= v0 )
goto LABEL_19;
}
v10 = sub_4013F0;
}
else
{
v10 = 0;
} |