今天我们的任务是一个VB程序,现在大家准备好两个工具,OD和SMARTCHECK(高手曾说过并不推荐用这个)。
[1]运行程序,了解一下程序运行的大概轮廓。双击程序图标,可以看到如下界面:
分析:程序的“check”按钮灰化了,必须想办法激活,否则我们以后分析程序的时候会遇到麻烦。
攻略:首先用EXESCOPE分析一下,没发现对话框资源,说明“check”按钮不是对话框上的按钮。
[2]用SMARTCHECK分析程序运行的大概流程。随便点几个数字“1”,“3”,然后停止,退出程序。
分析:此时可以看到编辑框内每获得一个字符,就发生Command7.Enabled的改变,也就是说程序会通过判断编辑框内的字符来决定是否让“check”按钮激活。
攻略:于是我们来到该事件发生时所处的偏移:00003AAD。OD载入,CTRL+G转到403AAD(偏移+基地址):
显然PUSH EBX是入栈的不是0就是1,这里我们把它改成PUSH 1(也就是无论编辑框内是什么字符,“check”按钮都会激活)
注意:由于PUSH 1比PUSH EBX多一个字节的机器指令,因此我们不能在原地方直接修改,需要JMP到空地方修改指令,然后再JMP回来。
[3]再用SMARTCHECK分析修改后的程序。SMARTCHECK载入后,随便点几个数字,再点“check”按钮(此时已经可以点了),然后停止,退出程序。
攻略:找到发生MsgBox事件时的偏移:00003660。OD载入,CTRL+G转到403660(偏移+基地址):,往上找,我们发现关键跳(00403568 . 0F84 AE000000 JE lolcrack.0040361C ; 关键跳):
00403531 . 52 PUSH EDX
00403532 . 68 281E4000 PUSH lolcrack.00401E28
00403537 . FF15 5C104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCm>; MSVBVM60.__vbaStrCmp
0040353D . 8BF8 MOV EDI,EAX
0040353F . 8D4D E8 LEA ECX,DWORD PTR SS:[EBP-18]
00403542 . F7DF NEG EDI
00403544 . 1BFF SBB EDI,EDI
00403546 . 47 INC EDI
00403547 . F7DF NEG EDI
00403549 . FF15 DC104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeS>; MSVBVM60.__vbaFreeStr
0040354F . B9 04000280 MOV ECX,80020004
00403554 . B8 0A000000 MOV EAX,0A
00403559 . 66:3BFB CMP DI,BX
0040355C . 894D AC MOV DWORD PTR SS:[EBP-54],ECX
0040355F . 8945 A4 MOV DWORD PTR SS:[EBP-5C],EAX
00403562 . 894D BC MOV DWORD PTR SS:[EBP-44],ECX
00403565 . 8945 B4 MOV DWORD PTR SS:[EBP-4C],EAX
00403568 . 0F84 AE000000 JE lolcrack.0040361C ; 关键跳
0040356E . 8B3D B4104000 MOV EDI,DWORD PTR DS:[<&MSVBVM60.__vbaVa>; MSVBVM60.__vbaVarDup
00403574 . 8D55 84 LEA EDX,DWORD PTR SS:[EBP-7C]
00403577 . 8D4D C4 LEA ECX,DWORD PTR SS:[EBP-3C]
0040357A . C745 8C 501E4>MOV DWORD PTR SS:[EBP-74],lolcrack.00401>; UNICODE "We Have a Winner"
00403581 . C745 84 08000>MOV DWORD PTR SS:[EBP-7C],8
00403588 . FFD7 CALL EDI ; <&MSVBVM60.__vbaVarDup>
0040358A . 8D55 94 LEA EDX,DWORD PTR SS:[EBP-6C]
0040358D . 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
00403590 . C745 9C 341E4>MOV DWORD PTR SS:[EBP-64],lolcrack.00401>; UNICODE "Correct :)"
00403597 . C745 94 08000>MOV DWORD PTR SS:[EBP-6C],8
0040359E . FFD7 CALL EDI
004035A0 . 8D45 A4 LEA EAX,DWORD PTR SS:[EBP-5C]
004035A3 . 8D4D B4 LEA ECX,DWORD PTR SS:[EBP-4C]
004035A6 . 50 PUSH EAX
004035A7 . 8D55 C4 LEA EDX,DWORD PTR SS:[EBP-3C]
004035AA . 51 PUSH ECX
004035AB . 52 PUSH EDX
004035AC . 8D45 D4 LEA EAX,DWORD PTR SS:[EBP-2C]
004035AF . 53 PUSH EBX
004035B0 . 50 PUSH EAX
004035B1 . FF15 3C104000 CALL DWORD PTR DS:[<&MSVBVM60.#595>] ; MSVBVM60.rtcMsgBox
004035B7 . 8D4D A4 LEA ECX,DWORD PTR SS:[EBP-5C]
004035BA . 8D55 B4 LEA EDX,DWORD PTR SS:[EBP-4C]
004035BD . 51 PUSH ECX
004035BE . 8D45 C4 LEA EAX,DWORD PTR SS:[EBP-3C]
004035C1 . 52 PUSH EDX
004035C2 . 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
004035C5 . 50 PUSH EAX
004035C6 . 51 PUSH ECX
004035C7 . 6A 04 PUSH 4
004035C9 . FF15 18104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeV>; MSVBVM60.__vbaFreeVarList
004035CF . 8B16 MOV EDX,DWORD PTR DS:[ESI]
004035D1 . 83C4 14 ADD ESP,14
004035D4 . 56 PUSH ESI
004035D5 . FF92 14030000 CALL DWORD PTR DS:[EDX+314]
004035DB . 50 PUSH EAX
004035DC . 8D45 E4 LEA EAX,DWORD PTR SS:[EBP-1C]
004035DF . 50 PUSH EAX
004035E0 . FF15 38104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaObjSe>; MSVBVM60.__vbaObjSet
004035E6 . 8BF0 MOV ESI,EAX
004035E8 . 68 781E4000 PUSH lolcrack.00401E78 ; UNICODE "Congratulations!"
004035ED . 56 PUSH ESI
004035EE . 8B0E MOV ECX,DWORD PTR DS:[ESI]
004035F0 . FF91 A4000000 CALL DWORD PTR DS:[ECX+A4]
004035F6 . 3BC3 CMP EAX,EBX
004035F8 . DBE2 FCLEX
004035FA . 7D 12 JGE SHORT lolcrack.0040360E
004035FC . 68 A4000000 PUSH 0A4
00403601 . 68 BC1D4000 PUSH lolcrack.00401DBC
00403606 . 56 PUSH ESI
00403607 . 50 PUSH EAX
00403608 . FF15 2C104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresu>; MSVBVM60.__vbaHresultCheckObj
0040360E > 8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C]
00403611 . FF15 E0104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeO>; MSVBVM60.__vbaFreeObj
00403617 . E9 88000000 JMP lolcrack.004036A4
0040361C > 8B3D B4104000 MOV EDI,DWORD PTR DS:[<&MSVBVM60.__vbaVa>; MSVBVM60.__vbaVarDup
00403622 . 8D55 84 LEA EDX,DWORD PTR SS:[EBP-7C]
00403625 . 8D4D C4 LEA ECX,DWORD PTR SS:[EBP-3C]
00403628 . C745 8C C01E4>MOV DWORD PTR SS:[EBP-74],lolcrack.00401>; UNICODE "Unsuccessful"
0040362F . C745 84 08000>MOV DWORD PTR SS:[EBP-7C],8
00403636 . FFD7 CALL EDI ; <&MSVBVM60.__vbaVarDup>
00403638 . 8D55 94 LEA EDX,DWORD PTR SS:[EBP-6C]
0040363B . 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
0040363E . C745 9C A01E4>MOV DWORD PTR SS:[EBP-64],lolcrack.00401>; UNICODE "Incorrect :("
00403645 . C745 94 08000>MOV DWORD PTR SS:[EBP-6C],8
0040364C . FFD7 CALL EDI
0040364E . 8D55 A4 LEA EDX,DWORD PTR SS:[EBP-5C]
00403651 . 8D45 B4 LEA EAX,DWORD PTR SS:[EBP-4C]
00403654 . 52 PUSH EDX
00403655 . 8D4D C4 LEA ECX,DWORD PTR SS:[EBP-3C]
00403658 . 50 PUSH EAX
00403659 . 51 PUSH ECX
0040365A . 8D55 D4 LEA EDX,DWORD PTR SS:[EBP-2C]
0040365D . 53 PUSH EBX
0040365E . 52 PUSH EDX
0040365F . FF15 3C104000 CALL DWORD PTR DS:[<&MSVBVM60.#595>] ; MSVBVM60.rtcMsgBox
经分析知道,当EDX内存的字符与00401E28内存的字符相等则跳向成功!,所以我们接下来的任务就是要分析EDX和00401E28内存的内容是什么?经过分析,我们得知EDX内存的内容是程序编辑框里的内容,而00401E28内存的内容固定是00401E28 2A 00 1E 00 5C 00 00 00(注意:该程序的字节是UNICODE双字节形式),因此只要我们编辑框的内容是2A1E5C就破解成功了!我们试试:分别点按钮“211553”,成功!
今天到这里,就到这里!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)