160crack - CyberBlade.1.exe
0. 找到了关键跳转,回溯到上面
0040E119 | F6C4 40 | test ah,0x40 | ah =必须 0x40 这里必须是40
0040E0E1 | 50 | push eax | 0040E0E2 | FF15 F8104100 | call dword ptr ds:[<&__vbaHresultCheckObj> | 0040E0E8 | 8B4D E4 | mov ecx,dword ptr ss:[ebp-0x1C] | [ebp-1C]:L"315751288" 0040E0EB | 51 | push ecx | 0040E0EC | FF15 5C114100 | call dword ptr ds:[<&__vbaR8Str>] | st0 = 输入的字符变成了 浮点型,123456.0000 0040E0F2 | DB43 4C | fild st(0),dword ptr ds:[ebx+0x4C] | 315,751,288(常量)===0x12D1FB78 压入 st0 0040E0F5 | DD9D 38FFFFFF | fstp qword ptr ss:[ebp-0xC8],st(0) | fstp 弹出栈 到ebp-0xc8 0040E0FB | DCA5 38FFFFFF | fsub st(0),qword ptr ss:[ebp-0xC8] | FSUB data ; ST(0)=ST(0)-data 0040E101 | DFE0 | fnstsw ax | 用 FNSTSW 指令把 FPU 状态字送入 AX。 ax = ST0(输入的浮点型)- 315,751,288 0040E103 | A8 0D | test al,0xD | 0040E105 | 0F85 EB030000 | jne cyberblade.40E4F6 | 0040E10B | FF15 14114100 | call dword ptr ds:[<&__vbaFpR8>] | 0040E111 | DC1D 08104000 | fcomp st(0),qword ptr ds:[0x401008] | ?比较 所以上面的st0的必须为0 0040E117 | DFE0 | fnstsw ax | 状态必须是0x40 0040E119 | F6C4 40 | test ah,0x40 | ah =必须 0x40 0040E11C | 74 05 | je cyberblade.40E123 | 11 0040E11E | BF 01000000 | mov edi,0x1 | 0040E123 | 8D4D E4 | lea ecx,dword ptr ss:[ebp-0x1C] | [ebp-1C]:L"315751288"
很快找到这里,这里涉及到了fpu寄存器的知识
fpu 是浮点操作的寄存器,大概原理有压入有弹出
1. _vbaR8Str 这个vb函数是把数字转换成浮点(8个字节),比如12345 会变成12345.00000 然后压入st0
2. 然后压入了个常数,一个16位的数字,压入变成了10进制
3. 然后弹出这个常数的10进制形式
4. fsub st0-弹出的常数 得到了状态码 statusword
5. 这个状态码必须为400才能得到正常的跳转,所以st0-常数必须为0,st0必须等于这个常数即可 315751288
浙公网安备 33010602011771号