1、无壳,VB编写
2、VB Decompiler反编译
出来的代码看着真的蓝瘦,配合OD调试。
004036D3 . FF15 24104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>; MSVBVM60.__vbaHresultCheckObj
004036D9 > 8B45 E4 mov eax,dword ptr ss:[ebp-0x1C]
004036DC . 50 push eax ; /String
004036DD . FF15 08104000 call dword ptr ds:[<&MSVBVM60.__vbaLenBs>; \__vbaLenBstr // 获取字符串长度
004036E3 . 33C9 xor ecx,ecx
004036E5 . 83F8 09 cmp eax,0x9 // len == 9
004036E8 . 0F95C1 setne cl
004036EB . F7D9 neg ecx
004036ED . 8BF1 mov esi,ecx
004036EF . 8D4D E4 lea ecx,dword ptr ss:[ebp-0x1C]
004036F2 . FF15 C0104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeS>; MSVBVM60.__vbaFreeStr
004036F8 . 8D4D D4 lea ecx,dword ptr ss:[ebp-0x2C]
004036FB . FF15 C4104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeO>; MSVBVM60.__vbaFreeObj
00403701 . 66:3BF3 cmp si,bx
00403704 . 0F85 1A030000 jnz bjanes_1.00403A24 // 跳向"Wrong serial!"
如果长度不为9,则跳向失败;
004039B4 . 51 push ecx ; /var18
004039B5 . 52 push edx ; |var28 // [edx+8]指向正确的字符
004039B6 . FF15 A0104000 call dword ptr ds:[<&MSVBVM60.__vbaVarTs>; \__vbaVarTstNe
00403A01 . 66:85FF test di,di
00403A04 75 1C jnz Xbjanes_1.00403A22 //如果不相等,则跳向失败
00403A06 . 8B7D 08 mov edi,dword ptr ss:[ebp+0x8]
00403A09 . B8 01000000 mov eax,0x1 // 相等则循环加一,比较下一个字符
00403A0E . 66:0345 E8 add ax,word ptr ss:[ebp-0x18]
00403A12 . 0F80 94010000 jo bjanes_1.00403BAC
00403A18 . 8945 E8 mov dword ptr ss:[ebp-0x18],eax
00403A1B . 33DB xor ebx,ebx // 失败
00403A1D .^ E9 5AFDFFFF jmp bjanes_1.0040377C //循环尾
00403A22 > 33DB xor ebx,ebx
00403A24 > 8B35 A4104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaVa>; MSVBVM60.__vbaVarDup
3、注册
将 00403A04 处的 jnz 修改为 jz ,不让他跳向失败。在 004039B6 下断,随意输入9个字符,Check it! 在004039B6断下,数据窗口输入dd [edx+8],断下一次记录一次。
总共比较9次,正确的Serial:301674501