恒大及论坛的各位大神好! 我正在 学习160个Crackme,目前卡在了第17个程序上。 在OD中反编译代码,结合VB Decompiler的解析进行了注释,有如下代码: [Asm] 纯文本查看 复制代码 0040473A > \B8 01000000 mov eax,0x1 ; End If
0040473F . 8D95 48FFFFFF lea edx,dword ptr ss:[ebp-0xB8] ; eax=1
00404745 . 8985 50FFFFFF mov dword ptr ss:[ebp-0xB0],eax ; var_B0 = 1
0040474B . 8985 30FFFFFF mov dword ptr ss:[ebp-0xD0],eax ; var_D0 = 1
00404751 . 8985 00FFFFFF mov dword ptr ss:[ebp-0x100],eax ; var_100 = 1
00404757 . 8D45 94 lea eax,dword ptr ss:[ebp-0x6C]
0040475A . B9 02000000 mov ecx,0x2 ; ecx=2
0040475F . 52 push edx
00404760 . 50 push eax
00404761 . 898D 48FFFFFF mov dword ptr ss:[ebp-0xB8],ecx ; var_B8 = 2
00404767 . 898D 28FFFFFF mov dword ptr ss:[ebp-0xD8],ecx ; var_D8 = 2
0040476D . 898D F8FEFFFF mov dword ptr ss:[ebp-0x108],ecx ; var_108 = 2
00404773 . FF15 C4104000 call dword ptr ds:[<&MSVBVM60.__vbaI4Var>] ; var_ret_1 = CLng(var_6C)/////eax=1
00404779 . 8B8D 7CFFFFFF mov ecx,dword ptr ss:[ebp-0x84] ; ecx=假码///eax=n
0040477F . 8B3D 54104000 mov edi,dword ptr ds:[<&MSVBVM60.#631>] ; msvbvm60.rtcMidCharBstr
00404785 . 50 push eax
00404786 . 51 push ecx
00404787 . FFD7 call edi ; eax=假码字符串中的第n个(n为第n次循环的当次)///edx=2,ecx=0; <&MSVBVM60.#631>
00404789 . 8BD0 mov edx,eax ; edx=eax
0040478B . 8D8D 74FFFFFF lea ecx,dword ptr ss:[ebp-0x8C]
00404791 . FFD3 call ebx ; var_8C = Mid$(var_84, var_ret_1, var_B8)//var_8C="1"?
在最后一行的00404791处,我按照注释的内容进行取值,应该是mid(假码,1,2),也就是说从假码的第1个字符开始取两个字符,但我从寄存器中看到的却是只取了第1个字符! 继续向下到004047CC处,此时的var_90 = Mid$(var_88,var_ret_2, 1)= var_90 = Mid((假码,2,1),从从寄存器中看到的是取了第2个字符,结果是正确的。 [Asm] 纯文本查看 复制代码 004047CC . FFD3 call ebx ; var_90 = Mid$(var_88, var_ret_2, 1)="2" 请教,我是什么地方出错了? |