环境:
windows xp sp 3
工具:
Ollydbg 和 exeinfo pe
查壳,还是无壳的vb程序。
打开,有一个nag窗口,点击”确认”的话才会弹出输入serial的窗口,点“取消”的话会关闭程序
OD载入,运行到弹出nag窗口的时候,F12停下来,然后ALT+ F9,点“确认”。
00402CF0 . 8D45 DC lea eax,dword ptr ss:[ebp-0x24] 00402CF3 . 50 push eax 00402CF4 . E8 21E4FFFF call <jmp.&MSVBVM50.__vbaI4Var> 00402CF9 . 50 push eax 00402CFA . 8D45 AC lea eax,dword ptr ss:[ebp-0x54] 00402CFD 50 push eax 00402CFE E8 1DE4FFFF call <jmp.&MSVBVM50.#595> ;这是个MessageBox 00402D03 . 8D95 5CFFFFFF lea edx,dword ptr ss:[ebp-0xA4] ;停在这里 00402D09 . 8D4D BC lea ecx,dword ptr ss:[ebp-0x44] 00402D0C . 8985 64FFFFFF mov dword ptr ss:[ebp-0x9C],eax除Nag窗口: .点击MessageBox的“确认”后eax的值为1,所以将00402CFE的指令改为: mov eax,0x1
然后往上翻一翻看看有什么:
00402A69 . C785 7CFFFFFF>mov dword ptr ss:[ebp-0x84],blaster9.004>; UNICODE "Error ! Das Passwort ist falsch !" 00402A73 . C785 74FFFFFF>mov dword ptr ss:[ebp-0x8C],0x8 00402A7D . E8 AAE6FFFF call <jmp.&MSVBVM50.__vbaVarCopy> 00402A82 . 8D95 74FFFFFF lea edx,dword ptr ss:[ebp-0x8C] 00402A88 . 8D4D DC lea ecx,dword ptr ss:[ebp-0x24] 00402A8B . C785 7CFFFFFF>mov dword ptr ss:[ebp-0x84],0x10 00402A95 . 899D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ebx 00402A9B . E8 86E6FFFF call <jmp.&MSVBVM50.__vbaVarMove> 00402AA0 . 8D95 74FFFFFF lea edx,dword ptr ss:[ebp-0x8C] 00402AA6 . 8D4D CC lea ecx,dword ptr ss:[ebp-0x34] 00402AA9 . C785 7CFFFFFF>mov dword ptr ss:[ebp-0x84],blaster9.004>; UNICODE "PASSWORT FALSCH !" 00402AB3 . C785 74FFFFFF>mov dword ptr ss:[ebp-0x8C],0x8
有个错误信息内容,可以猜测上面就是serial的比较地方。
突然间出现了这个:
00402A2A . 68 DC1D4000 push blaster9.00401DDC ; UNICODE "2G83G35Hs2" 将这个输入进去看看是什么东西:
虽然看不懂消息框弹出的内容,但是显然消息框的内容不一样了。应该就是成功了。
这次比较简单。
004028BA > \FF75 A8 push dword ptr ss:[ebp-0x58] ; 输入的serial 004028BD . 68 DC1D4000 push blaster9.00401DDC ; UNICODE "2G83G35Hs2" 004028C2 . E8 83E8FFFF call <jmp.&MSVBVM50.__vbaStrCmp> 004028C7 . 8BF8 mov edi,eax ; 比较结果存放到edi 004028C9 . 8D4D A8 lea ecx,dword ptr ss:[ebp-0x58] 004028CC . F7DF neg edi ; 取补 004028CE . 1BFF sbb edi,edi ; edi - edi - cf 004028D0 . 47 inc edi ; edi + 1 004028D1 . F7DF neg edi ; 取补 004028D3 . E8 60E8FFFF call <jmp.&MSVBVM50.__vbaFreeStr> 004028D8 . 8D4D A4 lea ecx,dword ptr ss:[ebp-0x5C] 004028DB . E8 52E8FFFF call <jmp.&MSVBVM50.__vbaFreeObj> 004028E0 . 66:3BFE cmp di,si ; si 为0 004028E3 . 0F84 F3000000 je blaster9.004029DC ; 不能跳
上面的计算过程可以看出,假如比较结果不为0时,一系列运算导致edi变成0
假如比较结果不为0,一系列运算会使得edi为非0
明文比较:2G83G35Hs2