打开看有两个文件,分别是
msvbvm60.dllMusic_Player.exe这两个。

打开Music_Player.exe看到这么一个界面。

哦哦,是个播放器呀,大佬真牛批。那我来首Tennessee吧,这首旋律会播放3:39这么长。

点左下角的按钮,竟然开始播放了。不过,却只限制了01:00???

好了,旋律听完了… 显示 ??????

看下Readme.txt

This MP3 Player is limited to 1 minutes.
You have to play more than one minute.

There are exist several 1-minute-check-routine.
After bypassing every check routine, you will see the perfect flag.

大概就是让你想办法,突破这个播放器只能播放一分钟的限制吧 = = 、

从图标和dll文件,我们可以知道,这个文件是用VB写的。

所以要逆向分析,可以使用VBDecompiler来做静态分析。

下载地址:
http://yc.jb51.net:81/201408/tools/VBDecompilerPro(jb51.net).rar

先来分析下程序为什么只播放1分钟呢?

    1. 程序打开mp3的时候,只截取前1分钟的内容播放
    1. 程序播放到1分钟的时候,弹窗中断了播放

看了大佬们的WP,如果是第一种,可以去有关play的代码块找找有无关于时间的定义或者描述,然后查看对应地址直接修改时间好了。

然而此处是第2种。我们需要找到的是,程序播放到1分钟时发生了什么。这时用OD动态调试是比较好的。

OD打开,一开始调用msvbvm60.dll文件,界面最下面会提示此为文程序入口点

但是我们要先找一个关键点,程序播放到1分钟时发生弹窗,就是弹出 ????的这个窗口。

http://www.360doc.com/content/13/1116/16/7794690_329683693.shtml

VB破解
1、VBExplorer查找按钮事件
2、有提示框则bp rtcMsgBox
3、通过bp __vbaStrCmp/__vbaStrComp/__vbaVarTstEq
bp __vbaStrCmp
bp __vbaStrComp

搜索下知识,VB弹窗是rtcMsgBox

这个时候,在OD要如何找到rtcMsgBox呢?

右键 –> 查找 –> 所有模块间的调用

你会发现出来好多模块调用,怎么搜索呢,直接键盘输入rtcMsgBox,就会开始搜索了。

双击进入,在对应00403B07这个地址,按F2打上断点。

好,那接下来按Ctrl F2重新运行下程序,先按F9,发现弹出MP3 Player播放器界面,但是一开始Open还是不能点的,看到有提示我们要加上Shift来忽略程序异常。

Shift F9,你还是发现窗口的open按钮点不动,按Shift F9,重复几次,直到我们能点击open打开一个窗口选择我们的MP3文件 = =

导入MP3播放,开始播放,发现不对。还是弹窗了,后来发现rtcMsgBox不止一个,正确的地址在往下的地址004045D8 = = …

打断点,导入MP3播放,开始播放,嫌慢的可以拖下进度条到50秒左右。接下来,到59秒的时候,停下来了,此时还未弹窗。

程序停在004045D8,这时要在这个位置往上找跳转程序,也就是能够执行到004045D8的关键跳转。

关于跳转知识:
https://blog.csdn.net/wwwwws/article/details/8559174

跳转指令分三类:

一、无条件跳转:

JMP  ;无条件跳转

二、根据CX、ECX寄存器的值跳转:

JCXZ ;CX 为 0 则跳转
JECXZ;ECX 为 0 则跳转

三、根据EFLAGS寄存器的PSW标志位跳转, 这个太多了.

根据标志位跳转的指令:
......
JE   ;等于则跳转         同JZ
JGE  ;有符号大于等于则跳转        同JNL
JL   ;有符号小于则跳转
......

往上代码从地址0040454C - 0040457C 有3处跳转,修改哪一处比较好呢?看地址00404563,做了一次比较,和0EA60的比较。0EA60就是60000ms,就是1分钟,所以jl是关键跳转。

0EA60调大些,如11111

或者我们把jl改成jmp,无条件跳转,双击修改,点1下汇编就是修改好了,然后点取消。

先按F8弹窗下

在按F9重新播放一次MP3,虽然歌曲播放超过一分钟还在播放,却发现还是弹出了一个报异常的窗口。

RaiseException是编程中一个函数,该函数是用来抛出一个调用线程时发生的异常。所以我们要查找哪个地址跳转到异常函数RaiseException

这里我一开始不知道RaiseException,所以我是通过断点的方式发现在004046B9发现是弹窗处,将上面的关键跳转的jeg改为jl,再次放过,得到flag在标题。

LIstenCare