脑筋急转弯2005语音朗读特别版
未注册1次只能看5次答案
工具:修改版ollydbg 金山游侠 aspackdie VBExplorer
语言是vb5+p-code,注册采用计算和网络验证,只有爆破,将限制去除。
该软件会检测程序标题,如果发现有某些程序的话就会关机,你可以在运行中输入 shutdown.exe -a 解决。
会不会因为这篇文章连金山游侠也检测吧,^_^。
软件有自校验,aspackdie脱壳后,VBExplorer编辑字符串中的程序黑名单为任意随机字符,用修改版ollydbg载入,向上翻代码,有许多函数:
00401000 .- FF25 0C914300 jmp dword ptr ds:[<&MSVBVM50.DllFunc>; MSVBVM50.DllFunctionCall
00401006 .- FF25 3C914300 jmp dword ptr ds:[<&MSVBVM50.#681>] ; MSVBVM50.rtcImmediateIf
0040100C .- FF25 48914300 jmp dword ptr ds:[<&MSVBVM50.#578>] ; MSVBVM50.rtcFileLen
00401012 .- FF25 E4904300 jmp dword ptr ds:[<&MSVBVM50.#595>] ; MSVBVM50.rtcMsgBox
00401018 .- FF25 00914300 jmp dword ptr ds:[<&MSVBVM50.#526>] ; MSVBVM50.rtcSpaceVar
0040101E .- FF25 58914300 jmp dword ptr ds:[<&MSVBVM50.#617>] ; MSVBVM50.rtcLeftCharVar
00401024 .- FF25 5C914300 jmp dword ptr ds:[<&MSVBVM50.#618>] ; MSVBVM50.rtcRightCharBstr
0040102A .- FF25 34914300 jmp dword ptr ds:[<&MSVBVM50.#645>] ; MSVBVM50.rtcDir
00401030 .- FF25 20914300 jmp dword ptr ds:[<&MSVBVM50.#608>] ; MSVBVM50.rtcVarBstrFromAnsi
00401036 .- FF25 64914300 jmp dword ptr ds:[<&MSVBVM50.#580>] ; MSVBVM50.rtcSetFileAttr
0040103C .- FF25 40914300 jmp dword ptr ds:[<&MSVBVM50.#576>] ; MSVBVM50.rtcFileCopy
00401042 .- FF25 08914300 jmp dword ptr ds:[<&MSVBVM50.#529>] ; MSVBVM50.rtcKillFiles
00401048 .- FF25 68914300 jmp dword ptr ds:[<&MSVBVM50.#581>] ; MSVBVM50.rtcR8ValFromBstr
0040104E .- FF25 50914300 jmp dword ptr ds:[<&MSVBVM50.#613>] ; MSVBVM50.rtcVarStrFromVar
00401054 .- FF25 F8904300 jmp dword ptr ds:[<&MSVBVM50.#631>] ; MSVBVM50.rtcMidCharBstr
0040105A .- FF25 44914300 jmp dword ptr ds:[<&MSVBVM50.#685>] ; MSVBVM50.rtcErrObj
00401060 .- FF25 38914300 jmp dword ptr ds:[<&MSVBVM50.#571>] ; MSVBVM50.rtcEndOfFile
00401066 .- FF25 DC904300 jmp dword ptr ds:[<&MSVBVM50.#593>] ; MSVBVM50.rtcRandomNext
0040106C .- FF25 E0904300 jmp dword ptr ds:[<&MSVBVM50.#594>] ; MSVBVM50.rtcRandomize
00401072 .- FF25 EC904300 jmp dword ptr ds:[<&MSVBVM50.#520>] ; MSVBVM50.rtcTrimVar
00401078 .- FF25 D4904300 jmp dword ptr ds:[<&MSVBVM50.#516>] ; MSVBVM50.rtcAnsiValueBstr
0040107E .- FF25 2C914300 jmp dword ptr ds:[<&MSVBVM50.#536>] ; MSVBVM50.rtcStrFromVar
00401084 .- FF25 60914300 jmp dword ptr ds:[<&MSVBVM50.#619>] ; MSVBVM50.rtcRightCharVar
0040108A .- FF25 FC904300 jmp dword ptr ds:[<&MSVBVM50.#525>] ; MSVBVM50.rtcSpaceBstr
00401090 .- FF25 F4904300 jmp dword ptr ds:[<&MSVBVM50.#524>] ; MSVBVM50.rtcRightTrimVar
00401096 .- FF25 30914300 jmp dword ptr ds:[<&MSVBVM50.#537>] ; MSVBVM50.rtcBstrFromAnsi
0040109C .- FF25 54914300 jmp dword ptr ds:[<&MSVBVM50.#616>] ; MSVBVM50.rtcLeftCharBstr
004010A2 .- FF25 D0904300 jmp dword ptr ds:[<&MSVBVM50.#622>] ; MSVBVM50.rtcStrConvVar
004010A8 .- FF25 24914300 jmp dword ptr ds:[<&MSVBVM50.#531>] ; MSVBVM50.rtcMakeDir
004010AE .- FF25 14914300 jmp dword ptr ds:[<&MSVBVM50.#600>] ; MSVBVM50.rtcShell
004010B4 .- FF25 D8904300 jmp dword ptr ds:[<&MSVBVM50.#517>] ; MSVBVM50.rtcLowerCaseBstr
004010BA .- FF25 1C914300 jmp dword ptr ds:[<&MSVBVM50.__vbaEx>; MSVBVM50.__vbaExceptHandler
004010C0 .- FF25 18914300 jmp dword ptr ds:[<&MSVBVM50.EVENT_S>; MSVBVM50.EVENT_SINK_QueryInterface
004010C6 .- FF25 04914300 jmp dword ptr ds:[<&MSVBVM50.EVENT_S>; MSVBVM50.EVENT_SINK_AddRef
004010CC .- FF25 10914300 jmp dword ptr ds:[<&MSVBVM50.EVENT_S>; MSVBVM50.EVENT_SINK_Release
004010D2 .- FF25 CC904300 jmp dword ptr ds:[<&MSVBVM50.MethCal>; MSVBVM50.MethCallEngine
004010D8 .- FF25 28914300 jmp dword ptr ds:[<&MSVBVM50.ProcCal>; MSVBVM50.ProcCallEngine
004010DE .- FF25 E8904300 jmp dword ptr ds:[<&MSVBVM50.#303>] ; MSVBVM50.GetMemStr
004010E4 .- FF25 F0904300 jmp dword ptr ds:[<&MSVBVM50.#309>] ; MSVBVM50.PutMemStr
004010EA $- FF25 4C914300 jmp dword ptr ds:[<&MSVBVM50.#100>] ; MSVBVM50.ThunRTMain
004010F0 h>/$ 68 F4EB4000 push hynj.0040EBF4
如上,都是程序用到的函数,在下面下断:
0040100C .- FF25 48914300 jmp dword ptr ds:[<&MSVBVM50.#578>] ; MSVBVM50.rtcFileLen
按一下F9中断在检查dll文件上,第二下F9时中断在检查程序长度上,F8开始:
74056192 M> 81EC 40010000 sub esp,140
74056198 8D4424 00 lea eax,dword ptr ss:[esp]
7405619C 50 push eax
7405619D FFB424 48010000 push dword ptr ss:[esp+148]
740561A4 E8 15000000 call MSVBVM50.740561BE
740561A9 85C0 test eax,eax
740561AB 0F85 B90F0400 jnz MSVBVM50.7409716A
740561B1 8B4424 20 mov eax,dword ptr ss:[esp+20] 取得程序长度
740561B5 81C4 40010000 add esp,140
740561BB C2 0400 retn 4 返回
返回这里:
7411E7F2 3BFC cmp edi,esp
7411E7F4 0F85 2B790000 jnz MSVBVM50.74126125
7411E7FA 50 push eax
7411E7FB 33C0 xor eax,eax
7411E7FD 8A06 mov al,byte ptr ds:[esi]
7411E7FF 46 inc esi
7411E800 FF2485 94ED1174 jmp dword ptr ds:[eax*4+7411ED94] 跳走
跳到这里:
7411DE28 8B06 mov eax,dword ptr ds:[esi] eax=004314FB处的数据值(程序设置的固定值)278D0
7411DE2A 50 push eax
7411DE2B 33C0 xor eax,eax
7411DE2D 8A46 04 mov al,byte ptr ds:[esi+4]
7411DE30 83C6 05 add esi,5
7411DE33 FF2485 94ED1174 jmp dword ptr ds:[eax*4+7411ED94] 跳走
跳到这里:
7411EB5D 5A pop edx
7411EB5E 59 pop ecx
7411EB5F 3BCA cmp ecx,edx 比较文件长度和程序设定的固定值如果大于就……嘿嘿
7411EB61 B8 00000000 mov eax,0
7411EB66 0F9FC0 setg al
7411EB69 F7D8 neg eax
7411EB6B 50 push eax
7411EB6C 33C0 xor eax,eax
7411EB6E 8A06 mov al,byte ptr ds:[esi]
7411EB70 46 inc esi
7411EB71 FF2485 94ED1174 jmp dword ptr ds:[eax*4+7411ED94]
重新载入,在cpu窗口,ctrl+G 输入:004314FB 回车,来到下面:
004314FB D078 02 sar byte ptr ds:[eax+2],1
004314FE 00DB add bl,bl
选中以上2行,鼠标右键 二进制――编辑 ,由于计算机从低位到高位保存数据,因此在最下面HEX +00窗口看到如下数据:
D0 78 02 00 DB 其中前6个字符表示前面看到的程序设定值:0278D0,利用第7和第8位都是0,改为D0 78 02 01 DB
这下,程序设定值变成10278D0,完全比脱壳后的长度数值大。
以上为启动时的检查,在升级时还有,解决方法一样,就不重复了。
解决了自校验,再看次数限制:
用金山游侠得次数地址:157C90
在右下角数据窗口ctrl+G 输入:157C90 回车,在157C90上下内存访问断点,在程序任选一题,点看答案,中断到下面,取消内存断点。
7412565E 8B7D B4 mov edi,dword ptr ss:[ebp-4C]
74125661 0FB706 movzx eax,word ptr ds:[esi]
74125664 8F0438 pop dword ptr ds:[eax+edi] 内存中断在这里
74125667 33C0 xor eax,eax
74125669 8A46 02 mov al,byte ptr ds:[esi+2]
7412566C 83C6 03 add esi,3
7412566F FF2485 94ED1174 jmp dword ptr ds:[eax*4+7411ED94] 跳
7411D39E 8975 EC mov dword ptr ss:[ebp-14],esi
7411D3A1 33C0 xor eax,eax
7411D3A3 8A46 01 mov al,byte ptr ds:[esi+1]
7411D3A6 83C6 02 add esi,2
7411D3A9 FF2485 94ED1174 jmp dword ptr ds:[eax*4+7411ED94] 再跳
7411E3D0 0FBF06 movsx eax,word ptr ds:[esi]
7411E3D3 83C6 02 add esi,2
7411E3D6 8B0428 mov eax,dword ptr ds:[eax+ebp]
7411E3D9 0BC0 or eax,eax
7411E3DB 0F84 34760000 je MSVBVM50.74125A15
7411E3E1 8945 B4 mov dword ptr ss:[ebp-4C],eax
7411E3E4 33C0 xor eax,eax
7411E3E6 8A06 mov al,byte ptr ds:[esi]
7411E3E8 46 inc esi
7411E3E9 FF2485 94ED1174 jmp dword ptr ds:[eax*4+7411ED94] 再跳
7411E113 8B7D B4 mov edi,dword ptr ss:[ebp-4C]
7411E116 0FB706 movzx eax,word ptr ds:[esi]
7411E119 FF3438 push dword ptr ds:[eax+edi]
7411E11C 33C0 xor eax,eax
7411E11E 8A46 02 mov al,byte ptr ds:[esi+2]
7411E121 83C6 03 add esi,3
7411E124 FF2485 94ED1174 jmp dword ptr ds:[eax*4+7411ED94]
7411DE28 8B06 mov eax,dword ptr ds:[esi] 赋固定值:eax=6
7411DE2A 50 push eax
7411DE2B 33C0 xor eax,eax
7411DE2D 8A46 04 mov al,byte ptr ds:[esi+4]
7411DE30 83C6 05 add esi,5
7411DE33 FF2485 94ED1174 jmp dword ptr ds:[eax*4+7411ED94] 再跳
7411EA7C 5A pop edx
7411EA7D 58 pop eax
7411EA7E 2BC2 sub eax,edx eax=eax-edx
7411EA80 83F8 01 cmp eax,1 比较eax是否是1
7411EA83 1BC0 sbb eax,eax
7411EA85 50 push eax
7411EA86 33C0 xor eax,eax
7411EA88 8A06 mov al,byte ptr ds:[esi]
7411EA8A 46 inc esi
7411EA8B FF2485 94ED1174 jmp dword ptr ds:[eax*4+7411ED94]
解决方法:
把7411DE28 8B06 mov eax,dword ptr ds:[esi] 赋固定值:eax=题目数量+1
在7411DE28处看到
ds:[004328B8]=00000006 就是这里了。
eax=000000F5
在cpu窗口,ctrl+G 输入:004328B8 回车,来到下面:
004328B6 03 db 03
004328B7 F5 db F5
004328B8 06 push es
004328B9 0000 add byte ptr ds:[eax],al
004328BB 00C7 add bh,al
可以看到004328B8处为6,004328B9处为0000,正好可以利用,用鼠标选中这2行,点右键,二进制――编辑
060000 改成 780600 (题目数量1655+1=1656,16进制:678)或者直接改成FFFFFF。
[课程]FART 脱壳王!加量不加价!FART作者讲授!