Easy Crack
找到关键验证函数如下
显然,这是个明文比较,一眼就能看到结果。
Easy Keygen
题目描述:Find the Name when the Serial is 5B134977135E7D13
主函数中可以找到序列号的生成算法,逻辑很清晰,就是依次异或3个密钥
随手写个脚本就可以解辣
s = '5B134977135E7D13'
s = s.decode('hex')
s = [ord(c) for c in s]
for i in range(len(s)):
if i % 3 == 0:
s[i] ^= 16
if (i - 1) % 3 == 0:
s[i] ^= 32
if (i - 2) % 3 == 0:
s[i] ^= 48
print ''.join([chr(c) for c in s])
Easy Unpack
这个题是找程序的入口点,试了很多种简单粗暴的方式都不得行,于是单步跟踪到入口点。。。
Music Player
本题要求破解一个只有1分钟比播放限制的播放器,成功播放到一分钟以上时序列号就会被设置到标题栏。
首先测试一下程序,播放超过一分钟时出现弹窗
丢进IDA中没法看,发现是VB程序,VB程序的静态分析比较麻烦,所以用调试器来打开。VB函数中的弹窗函数是rtcMsgBox,下断后运行并走出API,就可以定位到一个关键的函数当中。
在函数开头下断,发现该函数会一直被调用,每次调用播放一段时间音乐,猜测是回调函数,在call rtcMsgBox这条指令之前不远处可以看到一个关键跳,直接暴破,将jl指令改为jmp,然后运行程序,结果在运行后抛出异常
忽略这个异常继续运行,虽然音乐还在播放,确实超过1分钟了,不过又弹出错误提示
利用栈回溯到触发这个异常的函数中,依然在不远处发现了关键跳指令,将jge改为jmp再次运行程序。
修改限制成功
Replace
本题还是挺妖的,要慢慢地进行动态分析并进行一定猜测才能完成。首先在调试器中找到输入点位置
这里可以看出要求输入纯数字,可以看到只要顺利执行下去就会输出正确,但这之前有几个调用和跳转。首先跟进第一个函数中,
显然存在花指令,不用在意,继续单步跟踪,可以看到下方被解释成了这样
最终ret回去后,输入的值增加了2,然后加上0x601605c7,再加上2后回到最开始这里
跳转到0x404690处,有许多没用的操作,不用管
注意 mov dword ptr ds:[40466F],C39000C6这条指令,它改变的本质上是代码段,之后对这段进行函数调用,而这段新代码如下
这里的eax正是inputValue+2+0x601605c7+2所组成的,若我们胡乱输入,这里很可能触发内存不可访问的异常,那么这个地址究竟是啥呢?这里进行了0x90的赋值操作,而0x90也表示nop指令,所以这里本质上是nop掉eax地址的2字节数据。回到最开始的地方,之前说过,只要顺序执行下去就会输出正确,而0x401071处正是2字节的跳转指令,若将其nop掉后,程序就会输出正确,也就是说,eax的地址为0x401071,这样就能得出inputValue的值了。
ImagePrc
很容易找到关键点
这里逻辑很清晰,就是我们画上去的东西和获取的资源文件是相同的,使用ResourceHack转存资源文件,计算得大小为90000,我们画的东西是RGB像素点,每个像素点占3个字节,所以实质上有30000个像素点,由于是黑白的,不同颜色的像素点首字节是不同的。现在还不知道长和宽,在IDA中发现以下代码
说明是